本帖最后由 奋斗中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);
}
一周热门 更多>