主要是PID參數的調節和陀螺儀原始數據的處理
遠離DMP這種速度慢消耗大的方法,希望有點幫助
單片機源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "mpu6050.h"
- #include "inv_mpu.h"
- #include "inv_mpu_dmp_motion_driver.h"
- #include "oled.h"
- #include "pwm.h"
- #include "function.h"
- #include "fuzzy.h"
- #include "time.h"
- #include "FTM.h"
- #include "rtu.h"
- char receive;
- float result;
- angle ress;
- p_angle res;
- speed_s spe_L;
- speed_ss speed_L;
- speed_s spe_R;
- speed_ss speed_R;
- out_b outt;
- out_c out;
- int ab;
- float roll;
- int ti=9;
- float ta;
- int ti_r;
- int ti_l;
- float CN_timer2;
- float CN_timer3;
- int time;
- int32_t rtu_send[6];
- int main(void)
- {
- float mm=0;
- int P=64;
- float I=0;
- float D=0.005;
- float i;
- float d;
- float e;
- int integer,point;
- float pitch,yaw; //歐拉角
- short aacx,aacy,aacz; //加速度傳感器原始數據
- short gyrox,gyroy,gyroz; //陀螺儀原始數據
- short temp; //溫度
- int m;
- out=&outt;
- res=&ress;
- speed_L=&spe_L;
- speed_R=&spe_R;
- speed_L->speed_last=0;
- speed_R->speed_last=0;
- ta=0;
- ti=80;
- res->angle_sum=0;
- res->angle_error=0;
- res->angle_last=0;
- res->angle_now=0;
- m=0;
- delay_init(); //延時初始化
- OLED_Init();
- pwm_init();
- time1_init();
- uart_init(115200);
- Hardware_init();
- ti=0;
-
- ab=1000;
- OLED_ShowString(40,2 ,"Stop");
- while(1)
- {
- // if(ti<0)
- // ti=0;
- //
- // if(ab>100)
- // ab=100;
- // ti=ab;
- //
- if(ti<0) ti=0;
- if(ti>100) ti=100;
- if(ab<0) ab=0;
- if(ab>0) ab=100;
-
- OLED_ShowString(0,0 ,"Direction:");
- OLED_ShowString(0,4 ,"Speed:");
- OLED_ShowNum(40,6,100-ti,3,24);
- OLED_ShowString(96,6 ,"%");
- // OLED_ShowNum(0,2,ta,3,32);
- switch (receive)
- {
- case 'A':
- ti+=5;
- receive='p';
- break;
- case 'B':
- ti-=5;
- receive='p';
- break;
- case 'C':
- forward();
- OLED_Clear();
- OLED_ShowString(40,2 ,"Forward");
- receive='p';
- break;
- case 'D':
- back();
- OLED_Clear();
- OLED_ShowString(40,2 ,"Back");
- receive='p';
- break;
- case 'E' :
- stop();
- ti=0;;
- OLED_Clear();
- OLED_ShowString(40,2 ,"Stop");
- receive='p';
- break;
- case 'F' :
- left();
- OLED_Clear();
- OLED_ShowString(40,2 ,"Turn_left");
- receive='p';
- break;
- case 'G' :
- right();
- OLED_Clear();
- OLED_ShowString(40,2 ,"Turn_right");
- receive='p';
- break;
- case 'H' :
- up();
- ti=50;
- OLED_Clear();
- OLED_ShowString(40,2 ,"up");
- receive='p';
- break;
- case 'I' :
- down();
- ti=50;
- OLED_Clear();
- OLED_ShowString(40,2 ,"down");
- receive='p';
- break;
- case 'J' :
- ab-=5;
- OLED_Clear();
- receive='p';
- break;
- case 'K' :
- ab+=5;
- OLED_Clear();
- receive='p';
- break;
-
- }
- }
- Hardware_init();
- uart_init(115200);
- //time4_init();
- usart_init_();
- time1_init();
- Encoder_Init_TIM2();
- Encoder_Init_TIM3();
- while(mpu_dmp_init())
- {
- OLED_ShowString(0,2 ,"MPU6050 initting");
- }
- OLED_Clear();
- res->angle_P=81;
- res->angle_I=0.001;
- res->angle_sum=0;
- res->angle_D=18;
- mm=0;
- OLED_ShowString(0,2 ,"roll:");
- OLED_ShowString(2,0 ,"L:");
- OLED_ShowString(60,0 ,"R:");
- OLED_ShowString(100,2 ,".");
- OLED_ShowString(0,6 ,"P:");
- OLED_ShowString(46,6,"I:");
- OLED_ShowString(90,6 ,"D:");
- while(1)
- {
- switch (receive)
- {
- case 'T':
- ta=ta+1;
- receive='p';
- break;
- case 'J':
- ta-=1;
- receive='p';
- break;
- case 'A':
- res->angle_P+=1;
- receive='p';
- break;
- case 'C':
- res->angle_P-=1 ;
- receive='p';
- break;
- case 'D':
- res->angle_D+=1;
- receive='p';
- break;
- case 'E':
- res->angle_D-=1;
- receive='p';
- break;
- case 'F' :
- res->angle_I+=0.001;
- receive = 'p';
- break;
- case 'B':
- back();
- res->angle_I-=0.001;
- break;
- case 'S':
- stop();
- receive = 'p';
- break;
- case 'M':
- ti+=1;
- receive = 'p';
- break;
- case 'N':
- receive = 'p';
- ti-=1;
- break;
-
- }
- if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
- {
- MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度傳感器數據
- MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數據
- temp=roll*10;
- if(temp<0)
- {
- OLED_ShowString(50,2 ,"-");
- temp=-temp;
- } else
- OLED_ShowString(50,2 ,"+");
- integer = temp/10;
- point = temp%10;
- time=(2000-(res->angle_P*mm+res->angle_I*res->angle_sum-res->angle_D*res->angle_error));
- if(time<1)
- {
- time=1;
- }
- if(res->angle_now<0)
- {
- forward();
- mm=-res->angle_now;
- }
- else
- {
- back();
- mm=res->angle_now;
- }
- OLED_ShowNum(60,2,integer,3,18);
- OLED_ShowNum(108,2,point,1,8);
- OLED_ShowNum(12,6,(res->angle_P),3,18);
- OLED_ShowNum(60,6,(res->angle_I)*1000,3,18);
- OLED_ShowNum(102,6,res->angle_D,3,18);
- OLED_ShowNum(0,4,mm,3,18);
- if(res->angle_error<0.5)
- {
- OLED_ShowString(68,4 ,"-");
- OLED_ShowNum(76,4,-res->angle_error,4,20);
- }
- else
- {
- OLED_ShowString(68,4 ,"+");
- OLED_ShowNum(76,4,res->angle_error,4,20);
- }
- // OLED_ShowNum(20,0,(int)((s16)(TIM2->CNT)),3,16);
- // OLED_ShowNum(80,0,(int)((s16)(TIM3->CNT)),3,16); //顯示左右輪位置
- rtu_send[0]=res->angle_now*100;
- rtu_send[1]=2000-time;
- rtu_send_data(rtu_send,2);
- rtu_send_data(rtu_send,2); //上位機發送
- OLED_ShowNum(20,0,time,4,20); //顯示左右論速度
- OLED_ShowNum(80,0,time,4,20);
- while(1)
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);
- delay_ms(1000); //顯示左右論速度
- GPIO_SetBits(GPIOC,GPIO_Pin_13);
- delay_ms(1000);
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
兩輪平衡車.7z
(257.04 KB, 下載次數: 56)
2020-12-30 03:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|