在Arduino系统上以8 MHz和3.3 V运行ATmega328P的含义是什么?


8

我正在研究一种自定义arduino,它将在3.3 V电压下运行,没有稳压器或USB芯片(用于功耗)。我听说以16 MHz / 3.3 V对芯片进行超频通常是可以的,但是无论如何我都希望保持在规格范围内。

第一:要以8 MHz的频率运行,我是否需要更换晶体?还是我还有什么需要做的?

第二:我是否需要进行任何代码更改以反映新速度?我在这个项目中使用串行,SPI和I2C连接,以及NilRTOS操作系统和millis / delay函数。这些都会被打破吗?代码运行会明显变慢吗?

第三:如何编程芯片?可以在Arduino Uno上以16 MHz进行编程,然后将其移植到自定义的arduino吗?

第四:功耗会在8 MHz时变化吗?

谢谢!


2
有很多3.3V Arduino兼容板,Sparkfun Pro mini是一个例子。IDE支持它,因此一旦从“ boards”下拉菜单中进行选择,将为您进行所有针对时钟的调整。
奥列格·马祖洛夫

在8MHz频率下,您可以使用内部振荡器代替晶体振荡器。当您编译代码时要当心,例如,当您选择“ Pro Mini 328p at 8MHz”时,会将8应用于代码,因此我不建议编译为16MHz然后移植,否则您可能会发现delay(1000)需要两秒钟作为一个简单的例子。并在H2OhNo代码中检查省电/睡眠状态。(又一刻,我建议您让所有程序员都来使用,而不是局限于串行上传,请在Tindie中搜索“ ISP”。)
Patrick Tudor

Answers:


7

该公式似乎是volt * 5.9-6.6 = mhz(在1.8v和4.5v之间有效),因此在3.3v时,该值为12.8mhz。请注意,如果您以12.8MHz的频率运行,则任何低于3.3v的电压降都可能引起问题(并且也很难诊断!),或者您可能会逃脱它。

但是,Arduino Atmega328p芯片的“欠压”检测设置为4.3v-低于此电压时,芯片都会关闭。您可以让ISP(AKA ICSP)更换保险丝-转到http://www.engbedded.com/fusecalc/确定要设置的保险丝。您还可以使用ISP读取当前的保险丝,或者在没有Arduino板的情况下对芯片进行重新编程-我所有的项目都有6针接头。如果这样做,则在使用Arduino板进行重新编程之前,您必须“刻录Bootloader”(在工具菜单中)。请注意,仍然可以通过Arduino IDE进行编程。

另外,如果您想“变轻”(并拥有ISP),则可以更改保险丝以使用内部8MHz时钟-这样也可以释放2个额外的引脚!但是请注意,内部时钟每天可能漂移1.2小时(= 5%),而典型的石英晶体每天可能漂移1.7秒(=百万分之20)。如果您不使用它进行计时,则可能没有关系。

您需要更改代码的时序,您需要添加带有正确设置的芯片/时钟速度等的boards.txt文件-您可以从开发板条目中复制设置,更改名称并更改设置“ build.f_cpu”;重新启动(或启动)您的Arduino IDE,转到“工具”->“板”,然后选择添加的板。

您可以将芯片移到板上,也可以在板上重新编程(注意,在Tools-> Board中选择的板是FINAL板,而不是编程板)。小心插入/拔出插头-最终,您将弯曲插针!另外,您也可以使用ISP(ICSP),如上文所述-非常推荐。如果芯片为出厂默认设置,则ISP编程也将起作用,只要它具有工作时钟即可。

芯片使用多少功率在很大程度上取决于您对芯片的处理方式-不仅包括时钟速度,时钟源等,还包括睡眠模式。如果您睡了很多时间,则运行速度快时比运行速度慢时消耗的时间少(如果几乎所有时间都处于睡眠状态),则应该按时钟周期而不是按秒计算功耗-如果时钟速度是时钟的一半,并且半电流,则每条指令消耗相同的电流。由于剩下的时间都花在睡眠上,因此您没有任何好处。请参阅http://www.gammon.com.au/power,以获取有关电源使用情况的很好分类,有关如何节省电源的提示等。

如果您将时钟减慢太多,串行和i2c可能会变得不可靠(除非您减慢速度),但我希望在此之前可以降到1MHz,这是一个1MHz的芯片尝试执行9600bps的问题每传输的数据位有104条指令。i2c的运行频率为100khz,因此每位(1mhz)可获得10条指令-可能会推动它。8MHz应该可以了。测试,测试,测试。

更新:欠压检测有3种可能的设置-AtMega328p有3种可能的值:disabled,1.8v,2.7v和4.3v。(以上)我给人的印象是Arduino通常设置为4.3v。显然不是这种情况(请参阅下面的评论)。我记得在某个地方看到过掉电检测。如果您的arduino重置,尤其是在给电池(运行的电动机,多个LED等)施加更大的负载时,请记住这一点。


感谢您的回复!您对节电检测器在4.3 V以下关闭时所说的话,我有些困惑。我现在工作在3.7 V,它可以正常工作。不必对保险丝进行任何更改。
火神

@ user40,请参阅我的帖子底部的“更新”部分。
AMADANON Inc. 2015年

4

第一:要以8 MHz的频率运行,我是否需要更换晶体?还是我还有什么需要做的?

不,按照AMADANON Inc.建议在内部振荡器上运行。

或者,设置“ 8分频时钟”保险丝(它将从16 MHz晶体以2 MHz运行),然后在代码中将分频更改回2。

#include <avr/power.h>

void setup ()
  {
  // slow clock to divide by 2
  clock_prescale_set (clock_div_2);
  } // end of setup

或者,要在另一个Uno中进行编程,请不要使用保险丝,以16 MHz进行编程,然后将时钟降低到目标芯片中,希望它在3.3V的电压下工作足够长的时间来执行该第一条指令。最安全的方法是在目标板上安装8 MHz晶体或谐振器。但是,如果时序不是很关键,则可使用内部振荡器运行。

第二:我是否需要进行任何代码更改以反映新速度?我在这个项目中使用串行,SPI和I2C连接,以及NilRTOS操作系统和millis / delay函数。

如果您告诉IDE您有一个8 MHz处理器(例如Lilypad),则它应适当调整延迟,波特率计算等。

这些都会被打破吗?

I2C和SPI是自时钟的。它们可以以各种速率运行。我怀疑它们会有任何问题。至于串行,只要计算正确,仍然可以使用各种波特率。

代码运行会明显变慢吗?

是的,它将以16 MHz的一半速度运行。

第三:如何编程芯片?可以在Arduino Uno上以16 MHz进行编程,然后将其移植到自定义的arduino吗?

你可以做到的。或者,您可以连接ICSP头或FTDI头并对其进行原位编程。

此处的示例:http : //www.gammon.com.au/breadboard

第四:功耗会在8 MHz时变化吗?

是的,它有所减少。

您可以使用http://www.gammon.com.au/power中所述的其他技术(由AMADANON Inc.引用)来进一步降低它。


谢谢尼克!我实际上已经阅读过您的网站,它帮助我从根本上减少了功耗。结果,AA和AAA现在已成为该设备的可行电源,这很重要,因为重量很重要。因此,也感谢您提供的网站-这是对社区的一项巨大服务,对像我这样的人真的很有帮助。
Vulcan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.