历史上的今天
今天是:2024年12月26日(星期四)
2019年12月26日 | 高精度简易电子称第二步——低功耗测试
2019-12-26 来源:eefocus
虽然这个称做出来的样子不是便携式,外观有些简陋(自己用木头架子搭起来的),但是对于使用两节3.7V的18650的锂电池供电来说,还是需要设计一下低功耗的。
称的使用频率不高,不能让触摸屏一直亮着,也不能让单片机一直处于工作状态,那样也太不节能、太不绿色了。
一、STM32低功耗设计
查阅stm32参考手册,可以看到低功耗有以下三种:

我想要的效果是在称上没有放任何东西的时候,如果持续30秒没有放置,立即进入低功耗模式,但是SRAM和寄存器中的数据不要丢失,在这个基础上,功耗尽量小就可以了。
对比上面的模式说明,我需要进入的是停止模式。
停止模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止, PLL、HSI和HSE RC振荡器的功能被禁止, SRAM和寄存器内容被保留下来。
关键的一点是在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。
确定了进入的是停止模式,那么如何才能进入停止模式呢?

其实这么多操作,ST全都给我们封装在了一个库函数中:void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
具体内容是:
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_PWR_REGULATOR(PWR_Regulator));
assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));
/* Select the regulator state in STOP mode ---------------------------------*/
tmpreg = PWR->CR;
/* Clear PDDS and LPDS bits */
tmpreg &= CR_DS_MASK;
/* Set LPDS bit according to PWR_Regulator value */
tmpreg |= PWR_Regulator;
/* Store the new value */
PWR->CR = tmpreg;
/* Set SLEEPDEEP bit of Cortex System Control Register */
SCB->SCR |= SCB_SCR_SLEEPDEEP;
/* Select STOP mode entry --------------------------------------------------*/
if(PWR_STOPEntry == PWR_STOPEntry_WFI)
{
/* Request Wait For Interrupt */
__WFI();
}
else
{
/* Request Wait For Event */
__WFE();
}
/* Reset SLEEPDEEP bit of Cortex System Control Register */
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
}
我们只需要在需要低功耗的时候,调用这个函数就行了。
但是我们要选择自己需要唤醒时的方式——中断WFI(wait for interrupt) or 事件WFE(wait for event)
这两个有点绕:事件是中断的触发源,开放了对应的中断屏蔽位,则事件可以触发相应的中断。在STM32中,中断与事件不是等价的,一个中断肯定对应一个事件,但一个事件不一定对应一个中断。
比如我想要使用外部按键唤醒停止中的STM32,那么需要把按键引脚映射在了外部中断线上,然后对应的上面配置成中断唤醒方式:
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
在按键的中断函数中配置退出低功耗时的操作即可。
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line15) != RESET) //确保是否产生了EXTI Line中断
{
Restart_From_Low_Power(); //停机唤醒后需要启动HSE
EXTI_ClearITPendingBit(EXTI_Line15); //清除中断标志位
}
}
关于退出时的操作,参考手册上说:

HSI时钟是板子上的8M晶振提供的,而我们使用的是72M的时钟,所以还需要重新配置一下时钟:
//启动并配置stm32
ErrorStatus HSEStartUpStatus;
//使能 HSE
RCC_HSEConfig(RCC_HSE_ON);
//等待 HSE 准备就绪
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//使能 PLL
RCC_PLLCmd(ENABLE);
//等待 PLL 准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//选择PLL作为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL被选择为系统时钟源
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
二、触摸屏低功耗设计
使用的是HMI串口屏,一个指令即刻让屏幕进入sleep模式
//HMI息屏
void HMI_Sleep_Mode(void)
{
sprintf(buf,"sleep=1");
HMI_Send_String(buf);
Delay_ms(20);
}
三、CS1237低功耗设计
还是查看芯片手册:

void CS1237_power_down(void)
{
SCLK_1;
CS1237_delay_us(100);
SCLK_1;
CS1237_delay_us(100);
}
//cs1237重新唤醒,SCLK回到低电平并保持10us
void CS1237_restart(void)
{
SCLK_0;
CS1237_delay_us(20);
}
四、进入低功耗的判断
一开始考虑使用定时器定时对比读出的重量数据,如果数据在30s内没有变化并且一直小于1g,则进入低功耗模式,但是又怕定时器的中断正好发生在CS1237的读写过程中,
这样会打断时序,造成读数误差。
我看了一下我程序主循环循环一次的用时,大概在0.2s左右,其实这个也能当做一个基准,因为每次循环的时间都是差不多的。
那么我可以每循环一次就进行一次数据对比,每满足上面的情况就+1,当循环计数150次的时候,进入低功耗。否则清零计数。
这样每次进入低功耗的时间其实都是相差无几,而且节省了一个定时器。运用循环体本身的时间作为计时标志。
//下面是关于进入低功耗的判断
// 仿真发现在没有收到触摸屏的按下时,循环一次的时间大致为4s,这样省去了一个定时器,避免了中断
low_power_weight_1 = now_weight;
if((low_power_weight_1 < 1) && ((low_power_weight_1-low_power_weight_2 < 1) || (low_power_weight_2-low_power_weight_1 < 1)))
{
low_power_num++;
}
else
{
low_power_num = 0;
low_power_weight_2 = low_power_weight_1;
}
//重量低于1g并且在40秒内没有变化,即开始进入低功耗
if(low_power_num >= 80)
{
//计数清零,准备下一次的计数
low_power_num = 0;
//蜂鸣器首先响用来提示
Beep_Warning_Slowly(3);
//进入低功耗
Low_Power_Mode();
}
参考资料:
https://www.cnblogs.com/yangguang-it/p/7441756.html
https://www.jianshu.com/p/540fff36fcc0
史海拾趣
|
一.使用css缩写 使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则请参看《常用css缩写语法总结》,这里就不展开描述。 二.明确定义单位,除非值为0 忘记定义尺寸的单位是CSS新手普遍的错误。在HTML中你可以只写widt ...… 查看全部问答> |
|
据说是资料最全的6410开发板...分享一些资料大家看看: 立宇泰ARMSYS 6410开发板硬件用户手册 立宇泰ARMSYS 6410开发板WINCE6.0用户手册 立宇泰ARMSYS 6410开发板Linux2.6.28用户手册… 查看全部问答> |
|
日前,Achronix 半导体公司宣布全球速度最快的 FPGA 现已开始供货。Speedster 系列的首款产品为 SPD60,该产品系列的速度可达 1.5 GHz,性能比现有 FPGA 提高了 3 倍。 参加 Achronix 早期试用合作的客户已经利用 Speedster 在需要类似 ASIC 性能 ...… 查看全部问答> |
|
各位朋友!小弟经过几天努力eboot问题终于有成绩了!我现在想把我bsp升级成三星官方的?我的nboot是ads编译的。现在 FMD_ReadSector(dwSector,(LPBYTE)dwRAM,NULL, 1);函数读取nand中数据,调试信息如下: WinCE NAND Boot v1.00 Nov ...… 查看全部问答> |
|
ARM 官方就正式公布了新一代 64 位 Cortex-A50 系列处理器将于 2014 年问世的消息。这一系列中既有同等功耗下「性能为现有产品三倍」的 Cortex-A57,又有更为省电、全球最小的 64 位处理器 Cortex-A53。ARM 表示更出色的平行计算技术 ...… 查看全部问答> |




