0

我已经在 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 引脚供电,但板载稳压器能否释放电流?

4

1 回答 1

0

你是正确的,空闲模式是你可以去的深度睡眠并且仍然有计时器运行。

在 5V 的 1Mhz 时,您会期望该芯片在活动模式下使用大约 1mA...

在此处输入图像描述

在空闲时,你会期望它下降到大约 0.2mA....

在此处输入图像描述

我的猜测是,您所看到的绝大多数功率消耗都是由 LED 引起的。

如果您需要一些视觉反馈并且仍然想要低功耗,请考虑定期闪烁 LED 而不是让它一直亮着。每秒可以看到 10 毫秒的闪烁一次,并使用 1/100 的功率。

一旦你这样做了,那么你就可以开始进行边际节能,比如关闭外围设备,阻止 Arduino ISR 表单运行,以使 ATINY 高级用户从完全有效的 1mA 降低接近 0.2mA。

如果您禁用了 LED 并且仍然看到高电流消耗,那么我的猜测是您的开发板上有一个线性稳压器,它基本上会烧掉电源。ATTINY85 可以直接接受高达 5.5V 的电源,因此只要您的输入电压低于此电压,您就可以完全移除稳压器,然后将您的用电量降至预期值。

在此处输入图像描述

查看电路板的原理图,我认为您可以通过VINJP2 的引脚 3 ( ) 供电并跳过稳压器。你试过吗?

在此处输入图像描述

于 2019-02-10T22:54:06.597 回答