标题:
STM32F407平衡小车源码
[打印本页]
作者:
夕阳无限
时间:
2018-10-27 16:48
标题:
STM32F407平衡小车源码
网上搜了很多资料最后用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
作者:
Cortex发烧友
时间:
2019-8-3 11:07
写的乱七八糟的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1