我已经在 ATTINY85 数据表、谷歌和不同的论坛上度过了一个完整的工作日,但睡眠的东西对我来说只有部分意义。
项目目标:我正在构建一个迪斯科球速度控制器,为廉价的中国电池供电迪斯科球旋转器中的微型直流电机供电和 pwm 控制。
硬件:便宜的移动电源(5V USB 端口输出)-> 来自 ebay 的常见 ATTINY85 digispark 克隆板 -> 带 n-FET 的 pwm -> 电机。一键切换速度设置。
启动后,我运行设置循环来监听按键(实际上是最终形式的电源开关的快速轻弹)并在几个预配置的 pwm 设置之间进行更改。自上次按键后约 2 分钟后,正在使用的设置将保存到 EEPROM 以供下次启动。这一切都在起作用。
更新 EEPROM 后,我想尽量减少功耗,因为迪斯科绝不能停止。从阅读各种教程和数据表来看,使用 pwm 时似乎只有 SLEEP_MODE_IDLE 是可能的。
我想尽可能地使电路板僵尸化,只需保持 pwm 的设置即可。永远不需要醒来。
实际上可以关闭哪些其他东西以及如何正确关闭?提示和建议?
到目前为止,这是我微弱的尝试。它有点工作,我设置的调试 LED 保持在 pwm = 30 (在主循环中它脉冲)但系统在按钮按下时唤醒(进入主循环 - LED 开始脉冲)所以我怀疑还有更多工作要做。
void timeout() { // this happens when settings loop has run long enough and its time for eternal sleep
analogWrite(PINLED, 30); //debug
countsmall = 0; //DEBUG, in case we wake up be ready for main loop
countbig = 0; //DEBUG, in case we wake up be ready for main loop
// save the setting
EEPROM.update(0, savedlevel);
// conserve power -- go zombie state for eternity
noInterrupts();
ACSR |= _BV(ACD); //disable the analog comparator?
ADCSRA &= ~_BV(ADEN); //disable ADC?
mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE); //turn off the brown-out detector?
mcucr2 = mcucr1 & ~_BV(BODSE);
MCUCR = mcucr1;
MCUCR = mcucr2;
set_sleep_mode(SLEEP_MODE_IDLE);
//sleep_enable(); //redudant
sleep_bod_disable();
sleep_mode();
}
整个程序:http ://uvkk.kirah.fi/jotainmuutarandomia/randomfiles/liskodiskoboltsi.cpp
添加 1 11.2.2019:
当前情况,电源开启 LED 已移除,调试 LED 在睡眠时关闭(循环时每秒闪烁 2 毫秒),只有电源连接到电路板,从地线测量:
1 MHz:13,8 ma 循环,12,9空转
8 MHz:19,0 ma 循环,15,1 ma 空转
16,5 MHz:24,7 ma 循环,17,9 ma 空转
我认为这使它运行在 500kHz:1MHz 设置但clock_prescale_set(clock_div_32);
在 setup() 中。至少一秒的闪烁现在是 2 秒长,电流消耗循环为 13.2 ma 和空闲 12.6 ma。
但这些数字太高了......我在这里做错了吗?尽管我直接给 5V 引脚供电,但板载稳压器能否释放电流?