基于stm32的车辆减速灯项目——MPU6050或ADXL345_adxl345和mpu6050哪个精度高(1)

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配置外部高速晶振

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值