[英]16-bit Timer PWM LED Dimmer
我是 AVR C 編程的新手,我正在使用 Atmega328p 計數器/定時器上的 16 位定時器測試一個簡單的 PWM,它假設充當 LED 的調光器。
我的代碼:
#define F_CPU 16000000UL
void initTimer();
int x = 1;
int n = 1000;
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
x++;
if(x > 65) {
x = 1;
}
}
}
void initTimer() {
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
// used for TOP, makes for 50 Hz PWM
ICR1 = 40000;
OCR1A = n * x;
}
ISR(TIMER1_OVF_vect)
{
OCR1A = n * x;
}
問題是它不顯示調光效果,對於我最初為 OCR1A (PB1) 輸出引腳設置的任何值,LED 的亮度保持不變,它假設在中斷發生時改變值,但它只是不這樣做,這應該是簡單的測試我做錯了什么?
更新:
作為建議,我使用 TIMSK1 寄存器和 SEI() 啟用中斷,但是仍然存在相同的問題,無論 initTimer() 中指定的 OCR1A 的原始值如何,LED 亮度都保持不變。
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
x++;
if(x > 65) {
x = 1;
}
}
}
void initTimer() {
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TIMSK1 |= (1 << ICIE1);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
sei();
}
ISR (TIMER1_COMPA_vect)
{
OCR1A = n * x;
}
雖然我嘗試了另一種方法,這給了我調光效果:
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
_delay_ms(20);
OCR1A = n * 4;
_delay_ms(20);
OCR1A = n * 8;
_delay_ms(20);
OCR1A = n * 15;
_delay_ms(20);
OCR1A = n * 25;
_delay_ms(20);
OCR1A = n * 1;
}
}
void initTimer() {
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
}
所以看起來問題出在中斷上,因為 PWM 影響有效,但它只是不與中斷處理程序一起工作。
我首先想到的是 x 和 n 應該是 volatile 。 您還應該在 TIMSK0 寄存器中啟用中斷。 還可以通過調用 sei 來啟用中斷。
如果我是你,我會從一些熟悉的示例代碼開始。 我提到的頁面有一個示例,它每 4 毫秒觸發一次中斷。 獲取該代碼並打開和關閉 LED。
另一個問題是你在改變 x 而不管 isr 是否被調用。 所以實際上你每次都會在 isr 中得到一個隨機的 x。 這段代碼很簡單,可能會卡在一個簡單的模式中。 而是將 x 的設置移動到您的 isr。
這是 avr 計時器的一個很好的介紹: https : //sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
這是錯誤的,需要在初始化ICR1和OCR1A之前配置TCCR1A和TCCR1B。 有關更多詳細信息,請參閱此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.