網上搜了很多資料最后用MPU6050陀螺儀通過角度和電機速度做成的串級PID平衡小車
實驗器材:
探索者STM32F4開發板
實驗目的:
學習MPU6050 六軸傳感器(三軸加速度+三軸陀螺儀)的使用.
硬件資源:
1,DS0(連接在PF9)
2,串口1(波特率:115200,PA9/PA10連接在板載USB轉串口芯片CH340上面)
3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模塊(通過FSMC驅動,FSMC_NE4接LCD片選/A6接RS)
4,KEY0按鍵(連接在PE4)
5,MPU6050傳感器(連接在PB8(SCL),PB9(SDA)上面,INT(PC0)未用到).
實驗現象:
本實驗開機后,先初始化MPU6050,然后利用DMP庫,初始化MPU6050及使能DMP,最后,在死循環里面不停
讀取:溫度傳感器、加速度傳感器、陀螺儀、DMP姿態解算后的歐拉角等數據,通過串口上報給上位機(溫
度不上報),利用上位機軟件(ANO_Tech匿名四軸上位機_V2.6.exe),可以實時顯示MPU6050的傳感器狀
態曲線,并顯示3D姿態,可以通過KEY0按鍵開啟/關閉數據上傳功能。同時,在LCD模塊上面顯示溫度和歐拉
角等信息。DS0來指示程序正在運行。另外,本例程也可以通過USMART調用MPU_Read_Byte/MPU_Write_Byte
等函數,來實現對MPU6050寄存器的讀寫操作(僅在UPLOAD OFF狀態下).
注意事項:
1,4.3寸和7寸屏需要比較大電流,USB供電可能不足,請用外部電源適配器(推薦外接12V 1A電源).
2,本例程在LCD_Init函數里面(在ILI93xx.c),用到了printf,如果不初始化串口1,將導致液晶無法顯示!!
3,ANO_Tech匿名四軸上位機_V2.6.exe軟件所在路徑:開發板光盤-->6,軟件資料-->軟件-->匿名四軸上位機
4,ANO_Tech匿名四軸上位機使用方法,請看軟件文件夾下的README.txt。
5,注意:串口波特率為500Kbps!!
PS:ANO_Tech匿名四軸上位機 功能十分強大,學習使用需要花費一點時間(半天左右),請大家耐心看匿名提供
的視頻/文檔教程學習,不要浮躁。
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "usmart.h"
- #include "mpu6050.h"
- #include "inv_mpu.h"
- #include "inv_mpu_dmp_motion_driver.h"
- #include "pwmout.h"
- #include "control.h"
- #include "oled.h"
- #include "exti.h"
- #include "algorithm_pid.h"
- int Encoder_Left,Encoder_Right;
- int Moto1,Moto2; //電機PWM變量 應是Motor的 向Moto致敬
- float Angle_Balance,Gyro_Balance;
- extern short s1,s2;
- extern PID_Struct PID_Pitch;
- float pitch,roll,yaw; //歐拉角
- short aacx,aacy,aacz; //加速度傳感器原始數據
- short gyrox,gyroy,gyroz; //陀螺儀原始數據
- short temp;
- float x;
-
- int main(void)
- {
- u8 t=0;
- int t1=0,t2=0;
- Stm32_Clock_Init(336,25,2,7);//設置時鐘,168Mhz
- delay_init(168); //延時初始化
- TIM4_PWM_Init(7200,0);
- led_init(); //初始化LED
- key_init(); //初始化按鍵
- MPU_Init(); //初始化MPU6050
- mpu_dmp_init();
- OLED_Init();
- MiniBalance_Motor_Init();
- EXTIX_Init();
-
- TIM3_Int_Init(50-1,8400-1);
- while(1)
- {
- if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
- {
- temp=MPU_Get_Temperature(); //得到溫度值
- MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度傳感器數據
- MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數據
- //顯示***************************************************************************************************
- if((t%5)==0)
- {
-
- temp=pitch*10;
- if(temp<0)
- {
- OLED_ShowString(0,0,"-",16); //顯示負號
- temp=-temp; //轉為正數
- }else OLED_ShowString(0,0," ",16); //去掉負號
- OLED_ShowNum(10,0,temp/10,3,16); //顯示整數部分
- OLED_ShowNum(26,0,temp%10,1,16); //顯示小數部分
- t1=s1;
- if(t1<0)
- {
- OLED_ShowString(60,20,"-",16); //顯示負號
- t1=-t1; //轉為正數
- }else OLED_ShowString(60,20," ",16); //去掉負號
- OLED_ShowNum(70,20,t1,5,16); //顯示整數部分
- t2=s2;
- if(t2<0)
- {
- OLED_ShowString(60,40,"-",16); //顯示負號
- t2=-t2; //轉為正數
- }else OLED_ShowString(60,40," ",16); //去掉負號
- OLED_ShowNum(70,40,t2,5,16); //顯示整數部分
- OLED_ShowNum(0,30,PWM2,4,16);
- OLED_ShowNum(0,50,PWM1,4,16);
- OLED_Refresh_Gram();
- t=0;
- LED0=~LED0;//LED閃爍
- //*************************************************************************************************************
-
-
- }t++;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
平衡倒立擺.rar
(684.34 KB, 下載次數: 65)
2018-11-1 02:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|