gpt4 book ai didi

c - 带 ATMega164PA 的脉宽调制

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:32 25 4
gpt4 key购买 nike

我正在尝试在 ATMega164PA 上使用带有 Timer0 的 PWM 来增加 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
}

最佳答案

我不确定你的方法的逻辑,但我可以看到一个明显的问题给你带来了困难。

整数除法不产生分数。相反,它将结果向下舍入到最接近的整数。这意味着 dutycycle / 100几乎总是 0,因为你确保 dutycycle <= 100 .所以OCR0A几乎总是 0。一个异常(exception)是 dutycycle正好是 100,它设置了 OCR0A到 255。

解决此问题的一种方法是使用 OCR0A = dutycycle * 255 / 100;反而。我不知道这是否会解决所有问题,只是我看到的第一个问题。

关于c - 带 ATMega164PA 的脉宽调制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42274642/

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