作为stm32初学者如何快速入门是一个问题,
综合所得决定做一辆二轮平衡车。
选材:
stm32c8t6核心板
mpu6050陀螺仪
tb6612fng电机驱动
iic0.96寸oled屏幕
hc-05蓝牙串口
三串12V18650锂电池
稳压ic电容电阻若干
程序:
关于程序的话,说一些我自己在做的过程中遇到的问题吧
(1)mpu6050的基准零点,就是水平位置一定要调好,否则在以后的使用中会有很大的干扰。
(2)pid参数的调节,没有别的办法,就是从小试到大,一点一点来,才能调出来,因为站立pd的参数在很大一个范围内都能使车站起来,就是好坏程度不一样,所以就慢慢试吧。
(3)中断时间,一般的中断时间为10ms,但是根据电机的不同这个数值也可以更改,以硬件为基础,感觉不错就行。
(4)mpu6050采取官方的dmp库
附上主程序源码:
#include "sys.h" /****************************全局变量*************************************/ float Voltage; //电池电压采样相关的变量 float pitch,roll,yaw; //欧拉角(姿态角) short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 float UltrasonicWave_Distance; //超声波测距 int Encoder_Left,Encoder_Right; //左右编码器的脉冲计数 int Moto1=0,Moto2=0; //计算出来的最终赋给电机的PWM int Flag_Qian,Flag_Hou,Flag_Left,Flag_Right; //蓝牙遥控相关的变量 u8 flag_UltrasonicWave=0; //超声波是否超出安全距离标志位 u8 flag_fall=0; //摔倒标志位 u8 key=0; //按键的键值 u8 KEY_MODE=0; //模式0,遥控模式 //模式1,超声波模式 //模式2,参数模式 u8 DIS_STATE=255; //用来实现只刷新一次屏幕的变量 /***********************************************************************/ int main(void) { LED_Init(); //=====初始化与 LED 连接的IO KEY_Init(); //=====初始化与按键连接的IO delay_init(); //=====延时函数初始化 uart1_init(128000); //=====串口1初始化 uart3_init(9600); //=====串口3初始化成能与蓝牙进行通信的波特率,蓝牙默认通信波特率9600 delay_ms(100); NVIC_Configuration(); //=====中断优先级分组,其中包含了所有的中断优先级的配置,方便管理和一次性修改。 Adc_Init(); //=====初始化ADC Encoder_Init_TIM2(); //=====初始化编码器2 Encoder_Init_TIM4(); //=====初始化编码器4 Timer3_Init(5000,7199); //=====超声波定时器初始化 OLED_Init(); //=====OLED初始化 OLED_Clear(); //=====OLED清屏 MPU_Init(); //=====初始化MPU6050 mpu_dmp_init(); //=====初始化MPU6050的DMP模式 UltrasonicWave_Configuration();//=====初始化超声波的硬件IO口 TIM1_PWM_Init(7199,0); //=====初始化PWM 10KHZ,用于驱动电机。 delay_ms(1000); //=====延时2s 解决小车上电轮子乱转的问题 delay_ms(1000); //=====延时2s 解决小车上电轮子乱转的问题 Motor_Init(); //=====初始化与电机连接的硬件IO接口 MPU6050_EXTI_Init(); //=====MPU6050 5ms定时中断初始化 while(1) { KEY_mode_Select(); //=====模式选择以及屏幕表情显示 } }