mpu6050 +STM32 休眠唤醒问题+低功耗

这几天在调STM32+MPU6050实现   低功耗唤醒功

功能描述: 1.  平时没有数据的时候,mcu处于 stop模式下,

                   2.  利用RTC实现定时唤醒,

                  3.以上功能中已经实现 mcu低功耗唤醒      及RTC定时唤醒。

下一步要尝试   mpu6050 有数据时唤醒单片机,平时单片机处于低功耗状态

如果有朋友也在做  mpu6050低功耗唤醒单片机的功能希望能够一起交流。

这里附上qq :1812669090  如果 要低功耗  和定时唤醒的代码欢迎和我联系

         首先说一下STM32低功耗模式

这张表意思看一下就行,我这里用的是停止模式,理由很简单,任一中断都能唤醒,只不过唤醒后的配置相对待机模式要麻烦一点。

    那么,第一个问题来了  我们的单片机如何才能进入到低功耗?这个时候,你应该考虑一个问题,在什么位置进入低功耗?这个需要根据你的项目需求是什么,如果你的项目需要单片机一上来进入低功耗,那就把 进入低功耗的指令放在main函数的最前面,当然这种情况几乎是不存在的因为我们在进入低功耗之前  肯定要做一些初始化配置。好了,接下来切入正题进入低功耗。在这之前你应该做好 

RCC_Enter_Stop();

这个函数里面封装了进入低功耗的指令,是我自己写的,我们来看一下函数里面的内容:

void RCC_Enter_Stop(void)
{
	
    
	 // RCC_PLLCmd(DISABLE); //关闭时钟
	
	  MY_GPIO_AN();//将没有用的IO设置为  模拟输入模式
		RTC_ClearFlag(RTC_FLAG_WUTF);//将RTC唤醒中断清除 

	
	  Delay_ms(500);
	 /* Enable Wakeup Counter */
    RTC_WakeUpCmd(ENABLE);//在进入低功耗之前首先 要设置自己的唤醒源
    //这个不一定是RTC 要依据自己的唤醒源

    /* Enter Stop Mode */
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//重点来了这个就是进入STOP
//模式的指令   这个函数是库函数,  咱们不用管

    /* Enable Wakeup Counter */
  //  RTC_WakeUpCmd(DISABLE);  //关闭RTC的计数器 为什么? 应为之后要对他进行配置 配置完成之
//后再去开启
    
    /* After wake-up from STOP reconfigure the system clock */
    /* Enable HSE */
    RCC_HSEConfig(RCC_HSE_ON);
//将外部32.768KHZ的外部时钟打开,因为在进入低功耗之后时钟被切换
//成了内部低频时钟, 所以想要让单片机回到正常工作模式 必须要从新打开时钟
   
 /* Wait till HSE is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
    {}   //等待时钟稳定
    
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    
    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}
    
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    
    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x0C)
    {}
	
}

这个我要说明一下,

1。将IO口设为  模拟输入模式,这里是最关键的,因为直接牵扯到你的硬件电路。我之前就吃了这个的亏,IO口设置没对,功耗一直在200uA一直下不来。

为什么?

1.硬件 ,可能你的板子上连了一大堆没用的器件,如果你的功能中没有用到这些器件最好把他们去掉。当然你要会看原理图别拆错而导致板子无法工作。

2.IO口状态,这里要说的并不是所有的IO口都要设为模拟,而是将没用到的IO口设置为模拟模式。如果IO口在电路中做了上拉或者下拉,那么你在进入低功耗之前就必须将IO口的状态设置为与硬件相同的模式(该上拉的上啦,该下拉的下拉),这里我把我项目中对IO口的操作里出来希望能有所启发。

void MY_GPIO_AN(void)
{

	GPIO_InitTypeDef  GPIO_InitStructure;
//	GPIO_DeInit(GPIOA);
//	GPIO_DeInit(GPIOB);
//	GPIO_DeInit(GPIOC);


	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC, ENABLE);
  
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_11|GPIO_Pin_8|GPIO_Pin_9|\
	GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_15|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 	//
  GPIO_InitStructure.GPIO_Speed	= GPIO_Speed_2MHz;	
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);	
	 
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_12|GPIO_Pin_13|\
	GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_9|GPIO_Pin_0|\
	GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 	//
  GPIO_InitStructure.GPIO_Speed	= GPIO_Speed_2MHz;	
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOB,8);
	GPIO_ResetBits(GPIOB,2);

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 	//
  GPIO_InitStructure.GPIO_Speed	= GPIO_Speed_2MHz;	
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
   
		
}

这段代码不再一一解释其实就是,我这里只是将没有用到的IO口设置为了模拟输入模式。

今后还会更新RTC配置低功耗唤醒功能。

这里留下我的qq:1812669090  可以一起交流学习

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波是一种常用的滤波算法,用于估计系统状态。在STM32上使用MPU6050传感器进行姿态估计时,可以结合卡尔曼滤波算法来提高姿态的准确性。 以下是使用STM32MPU6050传感器进行姿态估计并应用卡尔曼滤波的示例代码: 1. 首先,需要配置STM32的GPIO和I2C接口,以便与MPU6050传感器进行通信。 2. 然后,需要初始化MPU6050传感器,并设置其工作模式和采样率。 3. 接下来,需要编写一个函数来读取MPU6050传感器的原始数据,包括加速度计和陀螺仪的数据。 4. 使用卡尔曼滤波算法来估计姿态。卡尔曼滤波算法需要定义系统模型和测量模型,并根据传感器数据进行状态估计。 5. 最后,可以使用估计的姿态数据来进行相应的控制或应用。 下面是一个简单的示例代码,演示了如何在STM32上使用MPU6050传感器和卡尔曼滤波算法进行姿态估计: ```c #include <stdio.h> #include "stm32f4xx.h" #include "mpu6050.h" #include "kalman.h" int main(void) { // 初始化MPU6050传感器 MPU6050_Init(); // 初始化卡尔曼滤波器 Kalman_Init(); while (1) { // 读取MPU6050传感器的原始数据 MPU6050_ReadRawData(); // 使用卡尔曼滤波算法进行姿态估计 Kalman_Update(MPU6050_GetAccX(), MPU6050_GetAccY(), MPU6050_GetAccZ(), MPU6050_GetGyroX(), MPU6050_GetGyroY(), MPU6050_GetGyroZ()); // 获取估计的姿态数据 float roll = Kalman_GetRoll(); float pitch = Kalman_GetPitch(); float yaw = Kalman_GetYaw(); // 在这里可以进行相应的控制或应用 // 打印姿态数据 printf("Roll: %.2f, Pitch: %.2f, Yaw: %.2f\n", roll, pitch, yaw); } } ``` 请注意,以上示例代码仅为演示目的,实际应用中可能需要根据具体需求进行适当的修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值