avr pd3和pb3一起工作为pwm

时间:2016-04-18 20:34:09

标签: avr

我正在尝试学习计时器和pwm方法。我使用timer2进行快速pwm,但我只想使用pd3作为pwm。下面的代码将两个引脚组合在一起作为pwm。我怎么能分开这些针脚。

mcu是Atmega328p

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile unsigned char duty_cyc_a,duty_cyc_b;

int main(void)
{

    DDRB = 0b00001000;
    DDRD = 0b00001000;
    PORTD = 0x00;
    PORTB = 0x00;

    TCCR2A = 0b10100011; 
    TCCR2B = 0b00000001; 
    TCNT2 = 0;           
    OCR2A = 117;          
    OCR2B = 117;
    duty_cyc_a=0;   
    duty_cyc_b=255; 

    while (1) 
    {
        PORTB = (1<<3);
        _delay_ms(1000);
        PORTB &= 0;
        _delay_ms(1000);
    }
}

1 个答案:

答案 0 :(得分:0)

您应该查看manual,特别是timer2部分末尾的页面,了解寄存器如何设置控制波形和引脚。这些引脚称为OC2A和OC2B,它们也是PB3和PD3的名称。

可读代码的另一个技巧是使用描述引脚功能的宏,而不是将它们组合成一个困难的二进制数。如果前一位作家已经这样做了,那么你的工作会更容易。

TCCR2A = 0b10100011; 
TCCR2B = 0b00000001;

应该是

TCCR2A = 1 << COM2A1 | 1 << COM2B1 | 1 << WGM21 | 1 << WGM20; 
TCCR2B = 1 << CS20;

现在您可以看到前一位作者设置为1的位数。(其余位设置为0)。

通过寄存器部分的表格来确定需要在这两个控制寄存器中设置哪些引脚。 (您不会使用COM2A1,您需要选择不同的WGMx引脚。)