有没有想过在不使用 Arduino 的analogWrite()函数的情况下在微芯片上启用 PWM 有多难?
该项目仅使用本机硬件功能在 ATtiny85 上重新创建 Arduino 的 Fade 示例。在无法访问 Arduino 的语法糖化的情况下,我们需要重新创建 Arduino 的analogWrite()函数。在引擎盖下,此功能通过在 ATtiny85 上设置必要的寄存器来启用脉冲宽度调制 (PWM)。有关 PWM 如何工作的更多信息,请参阅这些精彩教程:
您还需要 Atmel 的数据表来了解寄存器的命名方式以及它们控制的功能:
按照项目附带的图表组装电路。它看起来应该类似于:
我们不会将我们的程序上传到 Arduino Uno,而是将其用作编程设备以将我们的代码传输到 ATtiny。要使任何 Arduino 硬件充当程序员,请打开 Arduino IDE 并选择文件 > 示例 > ArduinoISP 。验证我们的 Arduino Uno 在Tools > Board and Tools > Port中被正确选择。打开示例草图,选择Sketch > Upload 。我们的 Arduino Uno 现在充当程序员。
接下来我们需要为 ATtiny 安装核心,这样我们就可以使用它的库了。打开首选项并在其他 Board Manager URL下添加:
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
重启 Arduino IDE,点击Tools > Board > Board Manager…并搜索 ATtiny。您应该找到David A. Mellis 的结果 attiny 。点击Install将 ATtiny 的代码添加到 Arduino IDE 中。
现在我们可以选择我们的 ATTiny 作为上传目标。在“工具”>“电路板”中选择ATtiny85 ,在“工具”>“端口”下选择 Arduino Uno。在工具 > 程序员下选择 Arduino 作为 ISP。要将代码上传到我们的 ATtiny,请选择Sketch > Upload Using Programmer 。打开此项目附带的代码并将其上传到 ATtiny。几秒钟后,LED 应该开始闪烁,因为 ATtiny 开始执行程序代码。如果抛出任何错误,通常是因为布线错误。仔细检查所有内容,重新启动 Arduino IDE 并再试一次。
由于我们不想使用 Arduino 的任何内置功能,我们现在需要手动包含 avr-libc 库。
#include
#include
接下来,我们需要在 ATtiny 上启用脉冲宽度调制 (PWM)。PWM 允许我们像使用 analogWrite() 函数一样控制输出。幕后发生的事情是特殊寄存器中的某些位被设置为启用 PWM:
int main()
{
DDRB = 1 << DDB0;
TCCR0A = 1 << COM0A1 | 1 << WGM01 | 1 << WGM00;
TCCR0B = 1 << CS00;
}
第一个寄存器是数据方向寄存器端口 B ( DDRB )。这类似于“pinMode(0, OUTPUT)”,它设置引脚的数据方向。我们在 DDBO(端口 B 引脚 0)位置启用该位。接下来的两个寄存器是定时器/计数器控制寄存器 A 和 B ( TCCR0A , TCCR0B) 。它们控制 PWM 定时器。我们正在启用用于比较匹配输出 A 模式(将 PWM 设置为非反相模式)的位和用于波形生成模式寄存器 0 和 1 的另外两位。这将启用快速 PWM。
我们设置的最后一位是在定时器/计数器控制寄存器 B 中:我们禁用 PWM 定时器的预分频。现在我们不调用 analogWrite()(就像我们使用 Arduino 的函数时那样),而是将输出比较寄存器 A ( OCR0A ) 设置为所需的值:
OCR0A = value;
其余部分类似于 Arduino IDE 中的原始 Fade.ino 示例草图。整个项目代码如下所示:
/*
Fade for ATtiny85 using only avr-libc
*/
#include
#include
int fadeAmount = 5;
int brightness = 0;
int main()
{
DDRB = 1 << DDB0;
TCCR0A = 1 << COM0A1 | 1 << WGM01 | 1 << WGM00;
TCCR0B = 1 << CS00;
while (1) {
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
OCR0A = brightness;
_delay_ms(30);
}
return 0;
}
这个项目是在麻省理工学院许可证下发布的。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !