×

通过编程其寄存器在ATtiny上启用PWM

消耗积分:0 | 格式:zip | 大小:0.33 MB | 2023-02-10

李丽

分享资料个

描述

有没有想过在不使用 Arduino 的analogWrite()函数的情况下在微芯片上启用 PWM 有多难?

该项目仅使用本机硬件功能在 ATtiny85 上重新创建 Arduino 的 Fade 示例。在无法访问 Arduino 的语法糖化的情况下,我们需要重新创建 Arduino 的analogWrite()函数。在引擎盖下,此功能通过在 ATtiny85 上设置必要的寄存器来启用脉冲宽度调制 (PWM)。有关 PWM 如何工作的更多信息,请参阅这些精彩教程:

您还需要 Atmel 的数据表来了解寄存器的命名方式以及它们控制的功能:

第 1 步:组装电路

按照项目附带的图表组装电路。它看起来应该类似于:

pxl_20220123_140023728_sGwOarZNYW.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
组装电路
 

第 2 步:将您的 Arduino Uno 配置为充当程序员

我们不会将我们的程序上传到 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 并再试一次。

第 3 步:让我们编写代码

由于我们不想使用 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)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !