【问题标题】:AVR PWM configurationAVR PWM 配置
【发布时间】:2017-01-04 22:34:45
【问题描述】:
我知道这很愚蠢,但我真的很困惑。
我想在 Atmega16 上制作具有 3 种模式的 PWM 脉冲:
1- 1Khz,占空比 100%
2- 4Khz,占空比 100%
3- 1Khz,占空比 50%
我离开 AVR 快 2 年了,我忘记了一切,所以我只需要简单地计算 Timer 1。
我读过的任何东西都让我更加困惑。有什么可以帮助我的吗?
我正在使用 Codevision AVR。
【问题讨论】:
标签:
microcontroller
avr
codevisionavr
【解决方案1】:
1- 1Khz 占空比 100%
2- 4Khz,占空比 100%
都是一样的。根本没有实际的 PWM。输出一直很高,频率无关紧要。
3- 1Khz,占空比 50%
实际上是PWM。有几种类型可供选择,但如果占空比正好为 50%,那么有很简单的方法可以通过切换来实现这一点。从手册中,
快速 PWM 模式下的频率(占空比为 50%)波形输出可以通过设置 OC1A 在每次比较匹配(COM1A1:0 = 1)时切换其逻辑电平来实现。这仅适用于使用 OCR1A 定义 TOP 值 (WGM13:0 = 15)。
即设置TCCR1A的COM1A1和COM1A0位为01,将TCCR1A和TCCR1B的WGM位全部设置为1。选择 OCR1A 和 TCCR1B 的 CSx 预分频位,以便每 0.5 ms 到达 OCR1A。
【解决方案2】:
我做了这个,但是我有考试,所以发布它的时间太长了。
我将 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;
}