在完成了上一个低功耗小应用之后,发现有些问题还是需要解决。一是整体功耗不够低,二是用无线功能的话功耗难以做到极低。所以这次打算做一个去除无线功能的超低功耗的温湿度计。
一、硬件选型
1.主控和LDO:对于低功耗最重要的就是主控和LDO,所以主控选择STM32Lxx系列LDO选择HT7533。
2.传感器:选用AHT10采集温湿度和BMP280采集大气压强数据,这两款传感器运行功耗都是ua级别,所以可以直接采用CPU引脚对其进行供电,在低功耗模式下可直接切断引脚对其的供电。
3.充电和充电管理芯片:使用非晶硅太阳能光伏板弱光发电板为其搭载的锂电池充电,这个太阳能板的优点就是即使是在室内光线下也有电流产生,不过很小就是了,大概1-2ua。
使用TP4056充电管理芯片,这款芯片待机电流较高,达到了40ua是这块板子的耗电大户,但其仅会在对其充电的时候才会耗电因此不会消耗电池电量。
4.显示模块:使用COG低功耗液晶显示屏
本来想的是能够在单片机进入低功耗模式下还能以极低功耗显示数据,但是商家这个屏幕不太好用,宣传的是30ua但事实上却达不到,即使是用了商家的低功耗例程也降不下去功耗。
使用我自己设计的板子,HT7533和TP4056被BMP280和AHT10遮住了
二、软件实现
本文打算使用STOP和STANDBY模式进行低功耗设计,而这两种模式都能被事件唤醒,而RTC闹钟中断就是一个事件,所以整体思路就是:初始化----显示温湿度数据----进入低功耗----RTC中断唤醒-----显示数据.....
cubeMX设置
首先设置时钟,低功耗模式不需要这么高的主频,给个2MHz意思意思。
其次初始化一下各个传感器的引脚
AHT10使用iic
BMP280和液晶显示屏使用GPIO模拟通信
设置一下RTC
最后,将其他空闲IO口设置为模拟输入,这样可以节省电流的消耗
进入和退出低功耗代码
void enter_stop(){
MX_GPIO_Init1();
//sleep_mode_ON();
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
//HAL_PWR_EnterSTANDBYMode();
}
void exit_stop(){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_RTC_Init();
MX_I2C1_Init();
MX_TIM1_Init();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_VCC_GPIO_Port,LCD_VCC_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BMP_VCC_GPIO_Port,BMP_VCC_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(AHT_VCC_GPIO_Port,AHT_VCC_Pin,GPIO_PIN_SET);
AHT10_Init();
bmp280Init();
LcdInit();
LcdClearScreen();
LcdDispBK();
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, 50);
//sleep_mode_OFF();
}
main函数
int main(void)
{
/* USER CODE BEGIN 1 */
float BP_pressure,BP_temperature,BP_asl;
float temp = 0,hum = 0;
char p[32];
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_I2C1_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_VCC_GPIO_Port,LCD_VCC_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BMP_VCC_GPIO_Port,BMP_VCC_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(AHT_VCC_GPIO_Port,AHT_VCC_Pin,GPIO_PIN_SET);
AHT10_Init();
bmp280Init();
LcdInit();
LcdClearScreen();
LcdDispBK();
sleep_mode_ON();
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, 50);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
bmp280GetData(&BP_pressure,&BP_temperature,&BP_asl);
sprintf(p,"%.1f",BP_temperature);
LcdDispStr8x16(1,6,60,(unsigned char *)p);
if(AHT10_Read_predata(&hum, &temp) == 0){
sprintf(p,"%.1f",temp);
lcd_dis_48_48(0,10,p);
sprintf(p,"%.1f",hum);
LcdDispStr8x16(1,6,6,(unsigned char *)p);
}
enter_stop();
exit_stop();
}
/* USER CODE END 3 */
}
三、功耗测试
低功耗显示数据
电流测试工具用的是合宙的电流表,可以看到功耗高达700ua,这远远高于低功耗的要求,这可能是这款屏幕的原因 ,至于为什么这么说,往下看
这张与上面的区别就是把屏幕显示关掉,而就这一个步骤就将功耗降到了3ua左右
在运行模式4ma,低功耗模式5ua。每休眠60分钟工作1秒钟,使用225mAh的电池供电(不算太阳能电池板的充电)的情况下经CubeMX的功耗计算机计算可以运行2个月20天
四、结尾
最终结果算是差强人意吧,要全部工程的私我
标签:CODE,HAL,STM32L4,低功耗,STM32,Init,USER,GPIO From: https://blog.csdn.net/xxxyyyyyx/article/details/142344119