关于STM32的摄像头V2460寻迹问题

2019-07-20 08:40发布

本帖最后由 奋斗中90后 于 2018-4-13 18:01 编辑

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "usmart.h"  
#include "usart2.h"  
#include "timer.h"
#include "ov2640.h"
#include "dcmi.h"
#include "math.h"
#include "pwm.h"
//u16 rgb_buf[144][176];
u16 rgb_buf[144][352];   修改这里的参数总是出问题:这个数组参数改到【288】【352】的时候LCD显示屏不亮,改到【556】【704】数组空间不足保存报错;求大神解答
u16 gray;
//extern u8 flag;
//u16 hang=0;
u8 X_MAX,Y_MAX=0;   
u8 X_MAX_LSAT, X_MIN_LSAT, Y_MAX_LSAT, Y_MIN_LSAT=0;   //éÏò»′ÎD¡Çò×ø±êλÖÃDÅÏ¢
u8 X,Y=0;      //D¡ÇòμÄÖêDÄDÅÏ¢
u8 X_MIN,Y_MIN=180;

int PWM_X,PWM_Y=0;          //pid2Îêy3õê¼»ˉ
float Err_X,Err_Y=0;
float Err_X_LAST,Err_Y_LAST=0;
float Aim_X,Aim_Y=0;
float Kp,Ki,Kd=0;

int main(void)
{
    u16 i,j;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);
        uart_init(115200);               
        usart2_init(42,115200);               
        //LED_Init();                                       
         LCD_Init();                                       
         //KEY_Init();                                       
        TIM3_Int_Init(200-1,8400-1);
        TIM14_PWM_Init(10000-1,168-1);           
        TIM11_PWM_Init(10000-1,336-1);               
        
//        usmart_dev.init(84);               
//         POINT_COLOR=RED;
//        LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");        
//        LCD_ShowString(30,70,200,16,16,"OV2640 TEST");        
//        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
//        LCD_ShowString(30,110,200,16,16,"2014/5/14");                  
        while(OV2640_Init())//3õê¼»ˉOV2640
        {
                LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
                delay_ms(200);
          LCD_Fill(30,130,239,170,WHITE);
                delay_ms(200);
        }   
    //OV2640_OutSize_Set(176,144);
          OV2640_OutSize_Set(352,144);
    OV2640_RGB565_Mode();
    My_DCMI_Init();                        
    DCMI_DMA_Init((u32)rgb_buf,sizeof(rgb_buf)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);
    DCMI_Start();                 
    while(1)
    {
            //hang=0;
            LCD_SetCursor(0,0);  
            LCD_WriteRAM_Prepare();               
            for(i=0;i<144;i++)
            {
                for(j=0;j<352;j++)
                {
                    if(j==351)
                    {
                      //  hang++;
                        LCD_SetCursor(0,i+1);  
                        LCD_WriteRAM_Prepare();               
                    }
                    gray=((rgb_buf[j]>>11)*19595+((rgb_buf[j]>>5)&0x3f)*38469 +(rgb_buf[j]&0x1f)*7472)>>16;
                    if(gray>=23)
                    {
                                                                                          
                                                                                          if(i>8&&i<136&&j<160&&j>16)
                                                                                                {
                                                                                            if(i>X_MAX) X_MAX=i;
                                                                                             if(i<X_MIN) X_MIN=i;
                                                                                         
                                                                                         
                                                                              
                                                                                            if(j>Y_MAX) Y_MAX=j;
                                                                                             if(j<Y_MIN) Y_MIN=j;                                                                                         
                                                                                                }
                        LCD->LCD_RAM=WHITE;
                                
                                        USART_SendData(USART2,WHITE);
                    }
                    else
                    {
                                                                                         
                        LCD->LCD_RAM=BLACK;               
                                            USART_SendData(USART2,BLACK);
                    }
                }
            }
                                        X_MAX_LSAT =        X_MAX;   
                                  X_MIN_LSAT =        X_MIN;
                                  Y_MAX_LSAT =        Y_MAX;
                                  Y_MIN_LSAT =        Y_MIN;   
                                                
                                  X_MAX=0;
                                  X_MIN=180;
                                        Y_MAX=0;
                                  Y_MIN=180;
                                                
                                  X=(X_MAX_LSAT+X_MIN_LSAT)/2;
                                  Y=(Y_MAX_LSAT+Y_MIN_LSAT)/2;
                                  LCD_Draw_Circle(X,Y,16);
                        //                TIM_SetCompare1(TIM14,9340);        
                        
                        //                TIM_SetCompare1(TIM11,9300);        
                                                
    }
}

void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
        {

                Kp=3.4;
                Kd=80.9;

                Aim_X=72;
                Aim_Y=88;
               
                Err_X=X-Aim_X;
                Err_Y=Y-Aim_Y;
               
               
                PWM_X=9340+(Err_X*Kp+(Err_X-Err_X_LAST)*Kd);
                PWM_Y=9300+(Err_Y*Kp+(Err_Y-Err_Y_LAST)*Kd);
               
                if(PWM_Y>9370)PWM_Y=9370;
                if(PWM_Y<9230)PWM_Y=9230;
               
                if(PWM_X>9410)PWM_X=9410;
                if(PWM_X<9270)PWM_X=9270;
               
                Err_X_LAST=Err_X;
                Err_Y_LAST=Err_Y;
               
                        TIM_SetCompare1(TIM14,PWM_X);        
                        TIM_SetCompare1(TIM11,PWM_Y);        
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}


0条回答

一周热门 更多>