AVR 脉宽调制配置

AVR PWM configuration

我知道这很愚蠢,但我真的很困惑。

我想在 Atmega16 上制作具有 3 种模式的 PWM 脉冲: 1- 1Khz 占空比 100% 2- 4Khz 占空比 100% 3- 1Khz 占空比 50%

我离开AVR快2年了,什么都忘了,所以我只需要简单地计算一下定时器1。 我读过的任何东西都让我更加困惑。有什么可以帮助我的吗? 我正在使用 Codevision AVR。

1- 1Khz 占空比 100%

2- 4Khz 占空比 100%

是一回事。根本没有实际的 PWM。一直输出高,频率无所谓

3- 1Khz 占空比 50%

其实就是PWM。有几种类型可供选择,但如果占空比恰好为 50%,则可以通过切换来实现这一点。从手册中,

A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved by setting OC1A to toggle its logical level on each compare match (COM1A1:0 = 1). This applies only if OCR1A is used to define the TOP value (WGM13:0 = 15).

即设置TCCR1A的COM1A1和COM1A0位为01,同时设置TCCR1A和TCCR1B的所有WGM位为1。选择 OCR1A 和 TCCR1B 的 CSx 预分频位,以便每 0.5 ms 到达一次 OCR1A。

我做了这个,但是我有考试,所以 post 它太长了。 我把Fcpu设置为4MHz

这是代码:

void set1KhzDC100()
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 500.000 kHz
// Mode: Fast PWM top=0x01FF
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x82;
TCCR1B=0x0A;
TCNT1H=0;
TCNT1L=0;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=511;
}

void Set4KhzDC100()
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 4000.000 kHz
// Mode: Fast PWM top=0x03FF
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x83;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=1023;
OCR1BH=0x00;
OCR1BL=0x00;
}

void Set1KhzDC50()
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 500.000 kHz
// Mode: Fast PWM top=0x01FF
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x82;
TCCR1B=0x0A;
TCNT1H=0;
TCNT1L=0;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=255;
}