完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
最近搞一个低功耗的项目,用到STM8L152R8的芯片。
首先硬件方面简单介绍一下: 硬件完全小白,没搞过,这次是从网上花了500块买的别人硬件Demo,特别简单支持超宽低温段码lcd屏带电量显示QYT12429液晶显示和SHT20温湿度传感器,BH1750光照度传感器,以及RT9193-33G降压芯片。 后来几天在这个硬件Demo基础上又花500块找人给重新更新了一次,增加了LORA模块电路(433无线传输模块)和几个三极管的电路,用来控制低功耗状态下给传感器断电。 软件方面简单介绍一下: 在之前的开源SHT20传感器采集软件基础上,增加了lora无线串口AT发送指令,整体代码简单,新手水准。 结果分析: 最终在Active-halt模式下,待机功耗降低到430ua,太高了,看别人的都讲到十几ua。 经过测试发现裸芯片情况下,用下面这段程序代码直接跑。 int main( void ) { PWR_FastWakeUpCmd(ENABLE); //快速唤醒使能 //所有IO输出低电平 GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); GPIO_Init(GPIOE, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); GPIO_Init(GPIOF, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); GPIO_Init(GPIOG, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow); PWR_UltraLowPowerCmd(ENABLE);//超低功耗 enableInterrupts(); while(1) { halt(); } } 用福禄克电流ua当,功耗在60ua左右。考虑可能LDO是RT9193-33G降压芯片有一定功耗消耗,LDO准备更换XC6206 奇怪的是我增加完LCD显示和读取温湿度数值后,并且已经关掉了不用的GPIO,halt后的功耗430ua,功耗增加了370ua,这就不对了。准备继续往下走 2020-11-06 经过调试后,发现BH1750的光照度这段读数代码执行后,导致功耗增高 优化后代码 void Cmd_Write_BH1750(u8 cmd) { u8 ack; u16 i=0; do{ delay_ms(1); I2C_Start(); I2C_Send_Byte(BH1750_Addr+0); i++; ack = I2C_Wait_Ack(); if(i==30) break; }while(ack != 0); I2C_Send_Byte(cmd); I2C_Wait_Ack(); //等待从机应答 I2C_Stop(); delay_ms(5); } void Start_BH1750(void) { Cmd_Write_BH1750(BH1750_ON); //发送启动命令 Cmd_Write_BH1750(BH1750_RSET); //清除寄存器内容 Cmd_Write_BH1750(BH1750_ONE); //设置测量后模块转到PowerDown模式 } void Read_BH1750(void) { I2C_Start(); //iic起始信号 I2C_Send_Byte(BH1750_Addr+1); //发送器件地址+读标志位 I2C_Wait_Ack(); //等待从机应答 BUF[0]=I2C_Read_Byte(1); //读取并数据 BUF[1]=I2C_Read_Byte(0); //读取并保存低八位数据 I2C_Stop(); //发送停止信号 delay_ms(5); } 代码优化后,温湿度和光照度先后读取后,关掉传感器电源。再次测量ac-halt模式下功耗降到了70uA。 2020-11-07 继续加功能,加了一片LORA模块,接线直接了GND,VCC,RX,TX,H_WAKE,WAKE六个引脚,其中H_WAKE是模块唤醒MCU的引脚,WAKE引脚是MCU主动唤醒LORA模块的引脚。 开始初始化串口 //函数1 串口1初始化 void my_usart1_init() { GPIO_Init(GPIOC,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC,GPIO_Pin_3,GPIO_Mode_Out_PP_Low_Fast); CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE); USART_Init(USART1,115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)(USART_Mode_Rx|USART_Mode_Tx)); //USART_ITConfig (USART1,USART_IT_OR,ENABLE);//使能接收中断,中断向量号为28 USART_Cmd(USART1,ENABLE); } 初始化LORA模块 // 一键配置所有参数 void series_send() { Usart_SendString(USART1,"AT+SPD=5rn"); delay_ms(2000); Usart_SendString(USART1,"AT+CH=72rn" ); delay_ms(2000); Usart_SendString(USART1,"AT+AID=00000002rn" ); delay_ms(2000); //Usart_SendString(USART1,"AT+NID=0001B38Brn" ); //delay_ms(2000); // Usart_SendString(USART2,"AT+ENTMrn" ); // delay_ms(1000); } 调用Usart_SendString发射函数开始通过MCU和LORA模块之间的串口来发射数据,发现网关无法收到数据。 这个情况可能有多种,一是模块配置的网关ID不对,二是没有接天线,三是模块在休眠状态,四是模块之间数据碰撞,五是其他。 经过排查,网关无法收到lora原因竟然是一次失误导致,由于之前调试温湿度采集为了降低功耗,将没有用到的MCU引脚全部推免低输出了。导致USART发射时候无法发送到LORA模块。 经过如下调整即可,放开这两个RX,TX引脚的设置,正常应该如下。 GPIO_Init(GPIOC,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT); GPIO_Init(GPIOC,GPIO_Pin_3,GPIO_Mode_Out_PP_Low_Fast); 再次烧写程序,模块重启上电,可以收到模块发射数据了。而且AC-HALT模式下功耗仍然在70ua左右。 后续看看是否还以在优化优化。 |
|
|
|
只有小组成员才能发言,加入小组>>
3208 浏览 9 评论
2894 浏览 16 评论
3401 浏览 1 评论
8840 浏览 16 评论
3994 浏览 18 评论
9625浏览 3评论
998浏览 3评论
518浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
521浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2244浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-29 05:56 , Processed in 0.787695 second(s), Total 47, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号