C 采用ATMega164PA的PWM

C 采用ATMega164PA的PWM,c,microcontroller,avr,pwm,atmega16,C,Microcontroller,Avr,Pwm,Atmega16,我试图在ATMega164PA上使用PWM和定时器0来增加LED的亮度。在运行下面的代码后,LED保持发光状态,亮度不变 请查看我的代码,并告诉我是否有什么地方我做错了: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int dutycycle = 0; // Variable for dutycycle /*************************

我试图在ATMega164PA上使用PWM和定时器0来增加LED的亮度。在运行下面的代码后,LED保持发光状态,亮度不变

请查看我的代码,并告诉我是否有什么地方我做错了:

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

int dutycycle = 0;  // Variable for dutycycle 

/********************************************** MAIN ****************************************************/
int main(void)
{
    DDRB |= (1 << PB3); // Make pins output and OC0A pin for PWM 

    TCCR0A |= (1 << COM0A1) | (1<<WGM01) | (1<<WGM00);  // Clear OC0A on comare match and set OC0A at BOTTOM

    TIMSK0 |= (1<<TOIE0);   // Overflow Interrupt Enabled 

    TCNT0 = 0;  // Set Counter Value Register for comparison with OCR0A

    OCR0A = (dutycycle / 100) * 255;    // Set duty cycle ON period

    sei();      // Enable global interrupts 

    TCCR0B |= (1 << CS00);  // Prescale of 1 - start timer 

    while (1)
    {
        _delay_ms(500);

        dutycycle += 10;        // increase duty cycle by 10% every 500ms 

        if (dutycycle > 100)    // if duty cycle is greater than 100% set to 0
        {
            dutycycle = 0; 
        }
    }
}

ISR(TIMER0_OVF_vect)
{
    OCR0A = (dutycycle / 100) * 255;    // Set duty cycle ON period
}
#包括
#包括
#包括
int dutycycle=0;//dutycycle变量
/**********************************************主要****************************************************/
内部主(空)
{

DDRB |=(1我不确定您的方法的逻辑,但我可以看到一个明显的问题,它正在给您带来困难


整数除法不产生分数。相反,它将结果向下舍入到最接近的整数。这意味着
dutycycle/100
几乎总是0,因为您确保
dutycycle我不确定您的方法的逻辑,但我可以看到一个明显的问题,它给您带来了困难


整数除法不会产生分数。相反,它会将结果向下舍入到最接近的整数。这意味着
dutycycle/100
几乎总是0,因为您确保
dutycycle我正在尝试将占空比增加10%,直到达到100%。发生这种情况时,我希望将占空比值重置回00并重复。仅当我更改代码顶部的整数值时,才会得到输出,似乎忽略了main中的计算,而OCR0A只是被分配给占空比整数。我进行了您建议的更改,但仍然没有成功:(我试图将占空比增加10%,直到达到100%。当这种情况发生时,我想将占空比值重置为0并重复。我只在更改代码顶部的整数值时得到输出,似乎忽略了main中的计算,而OCR0A只是被分配给占空比整数。I ma取消您建议的更改,但仍然没有成功:(