STM32f103rc单片机驱动mpu6050单片机实现低功耗

最近几天,老师让我做个项目,关于是STM32f103rc单片机驱动mpu6050单片机实现低功耗。首先想到的是单片机的低功耗,大概有三种模式,

分别为睡眠模式、停止模式、以及待机模式。
1.睡眠模式:M3内核停止工作,所有的外设处于工作状态(当然是你不关闭外设的前提下)。
  特点:SRAM的内容和寄存器的状态保持不变。
  唤醒条件:任意的中断和事件
2.停止模式:停止所有内部的1.8V部分的供电,PLL、HSI、RC振荡器和HSE振荡器。CPU停止工作,外设也停止工作
  特点:SRAM的数据和寄存器依然保存
  唤醒条件:任意的外部中断,RTC闹钟,PVD输出,USB唤醒条件
  3.待机模式:内部电压调节电路被关闭, HSE、HIS、PLL被关闭,CPU停止工作,外设停止工作。
   特点:SRAM的内容和寄存器的内容将会丢失
   唤醒条件:NRTS的外部复位信号,IWDG复位、WKUP引脚上的一个上升边沿或者RTC闹钟

 

通过网上查看资料,待机模式的功耗最低,因此在本项目中直接选择了待机模式。因为电路板直接焊接好了,单片机和陀螺仪模块焊接在了一起。一开始并没有考虑太多,直接调试待机程序,移植MPU6050程序,比较顺利就移植通过(陀螺仪程序不同例程中的初始化方式不同,各有优缺点,回头再说)。感觉项目做的比较顺利,老师让我测试一下电路板电流,结果拿万用表一测试,傻眼了,在单片机一上电(待机状态)的时候,电流为3ma左右,然后通过按键唤醒单片机,电流到了惊人的50ma,然后再待机,电流为8ma,很是疑惑,为什么两次待机模式的电流这么大?为什么两次待机模式的电流不一样,而且相差几个ma?为什么正常工作的电流这么大?完全不符合要求。

通过查阅,发现在单片机正常工作方式下,如果想降低功耗,唯一的办法就是降低单片机的主频。

 

 

根据上面的表中得知,系统选择外部时钟,只有将外部晶振降低,倍频降低,才可以降低功耗,因此选择了4M的外部晶振(晶振选择范围4-16M),而且不采用倍频。程序调试通过后,万用表检测唤醒后的电流,为22ma,瞬间降低了一半还要多,感觉有了希望。

主频降低了,功耗降低了,但是在待机模式下功耗还没有下来。而且在正常工作前后的待机电流不相同,感觉很是奇怪。开始认为是程序的问题,尝试了其他两种休眠方法(睡眠模式、停止模式)之后,感觉现象是一样的。这个时候想起来,是不是陀螺仪对系统的影响,瞬间把陀螺仪卸下来,发现确实是这样,单片机的功耗降得很低了,而且一上电后的电流和唤醒之后的待机模式的电流是相同的。也就是说,问题就是陀螺仪。

MPU6050陀螺仪是有休眠模式的,也就是说,一上电陀螺仪进入了休眠模式,但是之后陀螺仪一直处于工作状态的,虽然单片机进入了待机,但是陀螺仪并没有进入休眠,因此一直消耗的电流较大。通过查看,陀螺仪的休眠模式是对陀螺仪的电源进行设置,对其寄存器中的值进行设定。休眠模式就是MPU6050内部所有寄存器恢复默认值,通过对电源管理寄存器1(0X6B)的bit7写1实现(也就是对0X6B寄存器的值写0x40),这个时候陀螺仪就进入了休眠模式,电流瞬间下降。然后正常工作的时候,对电源管理寄存器1(0X6B)必须设置该寄存器为0X00,以唤醒MPU6050,进入正常工作状态。这个就完美解决了休眠与唤醒间的交替变化。

 

Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x40);//进入休眠状态  

Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x00);//解除休眠状态  

 

其中进入休眠模式的程序:

Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x40);//进入休眠状态

Sys_Enter_Standby();//单片机进入休眠模式

最终,单片机在待机时候的电流不到1ma,在唤醒状态的电流为21ma,但是待机模式仍然没有达到网上各位大神写的几个uA,不知道什么原因,望请各位大神进行评论。

你可能感兴趣的:(C语言,单片机)