首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVR (调试) PWM生成

AVR (调试) PWM生成
EN

Stack Overflow用户
提问于 2017-10-06 13:53:56
回答 1查看 155关注 0票数 0

我写了一个简单的程序来产生占空比为50%的PWM波。然后我在AtmelStudio中进行了调试。除OCR0之外的所有寄存器都被分配了各自的值。为什么OCR0没有赋值。ATmega32,快速脉宽调制。

代码语言:javascript
复制
#include <avr/io.h>
int main(void)
{
DDRB = (1 << PB3);
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01);
OCR0 = 127;
TCCR0 |= (1 << CS02);
return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2017-10-06 17:11:16

所以不管怎样。

您在Atmega32上使用的是8位counter0。让我们看看你是如何设置它的:

代码语言:javascript
复制
// Set Pin B3 as output, others as input
DDRB = (1 << PB3);

// Set Clear on compare match + Fast PWM mode + Counter stopped
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01);

// Set comparator value to 127
OCR0 = 127;

// Enable clkIO/256 from prescaler, turning on the counter
TCCR0 |= (1 << CS02);

好吧。首先,有几件事:

  • 在初始设置时,你通常希望赋值,而不是或它,以确定它的状态。
  • 即使在之后,设置它而不是或它也可以避免无用的读取。不会影响此寄存器的行为,但performance.
  • The文档建议仅在正确设置后才启用输出,以避免虚假输出。所以你应该把第一行移到最后。

我将从数据表的that version中读取。

现在,在快速PWM模式下,根据表38和40,计数器的行为如下:

  • 它从底部计数到最大值(0到0xFF)。
  • OCR0仅用于切换OC0引脚,不用于重置counting.
  • OCR0具有双缓冲。其实际值直到下一个周期才会更新。

这可能是你的问题。如果这些都是真的:

  • 计数器不能正常启动(如果CS2-0由于或而不是设置them).
  • Counter被提前停止而不是正确,就可能发生这种情况)(因为你的程序结束了,如果工作室检测到它,它可能会在那个时候禁用它-我不使用工作室,所以我真的不知道)。

那么,您写入双缓冲区的值可能永远不会到达实际的寄存器。遗憾的是,数据手册并没有详细解释这是如何处理的。它也不知道在双缓冲处于活动状态时读取OCR0返回的是当前值还是等待值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46599108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档