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;
}
我知道这很愚蠢,但我真的很困惑。
我想在 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;
}