私はAVR Cプログラミングの初心者です。私は、LEDの調光器として機能すると思われるAtmega328pカウンタ/タイマの16ビットタイマを使用して簡単なPWMをテストしています。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;
}
問題は、それが調光効果が表示されないということである、LEDの明るさは、私が最初にOCR1A(PB1)出力端子に設定されたどのような値、その考えるのような一定のまま割り込みが発生したときに値を変更するには、これをやっていないだけですが、これは簡単なテストであると思います。
更新:アドバイスとして
IはTIMSK1レジスタとSEIを(使用して割り込みをイネーブル)が、しかし依然として同じ問題は、LEDの輝度は、で指定されたOCR1Aのどのような元の値のような一定のままinitTimer()。
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が作品に影響を与えるが、そのわずか割り込みハンドラで作業していないので、割り込みであると思われます。