GND --> GND
接下来,我们介绍一下利用 STM32F1 读取 MPU6050 的加速度和角度传感器数据(非中断方式),需要哪些初始化步骤:
**(1)**初始化 IIC 接口 ;
(2)复位 MPU6050;
(3**)设置角速度传感器(陀螺仪)和加速度传感器的满量程范围;**
(4**)设置其他参数;**
(5)配置系统时钟源并使能角速度传感器和加速度传感器 ;
该部分主要在MPU6050.C文件中有详细解释与编写过程,MPU6050主要采用I2C通讯(软件模拟)。
DMP 使用简介 :
我们可以读出 MPU6050 的加速度传感器和角速度传感器的原始数据。不过这些原始数据,对想搞四轴之类的初学者来说,用处不大,我们期望得到的是姿态数据,也就是欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。有了这三个角,我们就可以得到当前四轴的姿态,这才是我们想要的结果。(由于本项目比较简单并不需要欧拉角作为减速的判定依据,所以这里不过多介绍,代码中也没有使用到。为了满足读者各种需求,开源的代码中会放置DMP的可移植程序供大家参考)
补充说明:MPU6050姿态传感器的使用面很广,例如:无人机,平衡小车,运动手环等等,是一个值得学习的模块,希望读者有时间的情况尽可能地好好研究一下。
二、模拟PWM的闪烁呼吸灯
笔者前文有介绍,很多老师亦或是学生会习惯性直接使用PWM调节LED灯达到呼吸效果,来作为车辆减速灯的效果。但是,笔者认为PWM呼吸灯起不到警示作用。这里给大家介绍一种模拟PWM呼吸的闪烁警示灯。这种闪烁警示灯的编程原理有点类似于增量式PID的增量数值化,在51单片机中也很常见类似的编程效果。
总所周知,PWM调节时利用占空比去进行计数器比值,通过与设定的阈值比较后重装载来实现稳步呼吸的效果。而这里模拟PWM呼吸闪烁警示灯则是利用逐步增大或减小delay延迟的us秒数去亮灭LED灯来实现该功能。
其中,HAL库只提供了ms级别的延迟函数。所以这里需要自己去使用定时器TIM去编写一个us级别的延迟函数。
该方法思路是将定时器设置为1MHZ的计数频率,定时器计一个数就是1us,实现如下:
#define DLY_TIM_Handle (&htim4)
void delay_us(uint16_t nus)
{
__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
__HAL_TIM_ENABLE(DLY_TIM_Handle);
while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
{
}
__HAL_TIM_DISABLE(DLY_TIM_Handle);
}
实现模拟PWM呼吸闪烁警示灯的代码函数:breathing_led()函数
void breathing_led()
{
if(flag == 0)
{
for(i = 0 ; i <= 10 ; i++){
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,0);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,1);
HAL_Delay(41-t);
}
t++;
if(t == 40) flag = 1;
}
if(flag == 1)
{
for(i = 0 ; i <= 10 ; i++){
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,0);
HAL_Delay(t);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,1);
HAL_Delay(41-t);
}
t--;
if(t == 1) flag = 0;
}
}
三、CubexMX配置
1、RCC配置外部高速晶振