网上搜了很多资料最后用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)
|