gpt4 book ai didi

width - AVR Studio上的脉冲宽度调制(PWM)

转载 作者:行者123 更新时间:2023-12-04 03:39:50 25 4
gpt4 key购买 nike

我试图将PWM用于端口B的任何引脚上的ATmega8上的LED。设置计时器一直很烦人,我不知道该如何处理OCR1A。这是我的代码,我希望收到一些反馈。

我只是想弄清楚如何使用PWM。我知道这个概念,OCR1A应该是我希望脉冲持续的整个计数器时间的一部分。

#define F_CPU 1000000  // 1 MHz

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

int main(void){

TCCR1A |= (1 << CS10) | (1 << CS12) | (1 << CS11);
OCR1A = 0x0000;
TCCR1A |= ( 0 << WGM11 ) | ( 1 << WGM10 ) | (WGM12 << 1) | (WGM13 << 0);
TCCR1A |= ( 1 << COM1A0 ) | ( 0 << COM1A1 );
TIMSK |= (1 << TOIE1); // Enable timer interrupt
DDRB = 0xFF;
sei(); // Enable global interrupts
PORTB = 0b00000000;

while(1)
{
OCR1A = 0x00FF; //I'm trying to get the timer to alternate being on for 100% of the time,
_delay_ms(200);
OCR1A = 0x0066; // Then 50%
_delay_ms(200);
OCR1A = 0x0000; // Then 0%
_delay_ms(200);
}
}

ISR (TIMER1_COMA_vect) // timer0 overflow interrupt
{
PORTB =~ PORTB;
}

最佳答案

不,这是,而不是,您应该如何进行PWM。例如,如何将它的PWM速率设置为例如42%?而且,代码很大,可以用更有效的方式完成。另外,您浪费了16位计时器来执行8位操作。您有2个8位计时器(计时器/计数器0和2)和一个16位计时器Timer/Counter 1

将未使用的端口引脚设置为输出也是一个坏主意。所有未连接任何端口的端口引脚都应保留为输入。

ATmega8在计时器1和2上具有内置的PWM发生器,无需通过软件对其进行仿真。您甚至不必手动设置端口(您只需要设置相应的portpin即可输出)

您甚至不需要任何中断。

#define fillrate OCR2A 


//...

// main()

PORTB=0x00;
DDRB=0x08; //We use PORTB.3 as output, for OC2A, see the atmega8 reference manual

// Mode: Phase correct PWM top=0xFF
// OC2A output: Non-Inverted PWM
TCCR2A=0x81;
// Set the speed here, it will depend on your clock rate.
TCCR2B=0x02;

// for example, this will alternate between 75% and 42% PWM
while(1)
{
fillrate = 191; // ca. 75% PWM
delay_ms(2000);

fillrate = 107; // ca. 42% PWM
delay_ms(2000);
}

请注意,通过使用相同的计时器并设置OCR2B而不是OCR2A,可以将另一个LED与另一个PWM一起使用。不要忘记将TCCR2A设置为启用OCR2B作为PWM的输出,因为在此示例中仅允许使用OCR2A。

关于width - AVR Studio上的脉冲宽度调制(PWM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com