1

我的目标是从我的 ATtiny84 输出 1ms 高、50hz 的 PWM 信号。时钟以 1mhz 运行,因此我设置了比较输出模式,以便输出引脚应清除 19000 个时钟滴答并设置为 1000。

该设备以 5V 供电,我有一个示波器从引脚 A5 (OC1B) 读取平坦的 5V 输出,没有调制。我的代码在这里:

#include <avr\io.h>

void init_pwm_generator()
{
    PORTA &= ~(1 << (PORTA5));

    ICR1  = 20000;

    TCCR1A = (1<<COM1B1) | (1<COM1B0) | (1<<WGM11);
    TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10); 
}

int main(void)
{
    DDRA |=  (1 << (DDA5));

    init_pwm_generator();

    while(1)
    {   
        OCR1B = ICR1 - 1000;
    }
}

我不明白为什么这不起作用!

4

1 回答 1

1

请参阅第91的数据表章节12.5 输入捕捉单元

ICR1 寄存器只能在使用波形生成模式时写入,该模式利用 ICR1 寄存器定义计数器的 TOP 值。在这些情况下,必须先设置波形生成模式 (WGM13:0) 位,然后才能将 TOP 值写入 ICR1 寄存器。

因此,正确的初始化顺序如下:

    // Init the timer
    TCCR1A = (1<<COM1B1) | (1<COM1B0) | (1<<WGM11);
    TCCR1B = (1<<WGM13) | (1<<WGM12);

    ICR1  = 19999; // set the top value
    OCR1B = 19000; // set compare match value

    TCCR1B |= (1<<CS10); // start the timer

请注意,要使计时器周期为 20000 滴答,您必须将 TOP 值设置为 19999(因为计时器从零开始计数)

于 2019-12-05T12:27:10.253 回答