ATMega328P で PWM 波形生成モードを試しています。奇妙な結果が得られましたが、それがファームウェアの書き方に問題があるのか、それともデータシートの解釈に問題があるのか わかりません。
analogWrite() 関数をエミュレートするために私が書いた最初のコードは次のとおりです。
// Waveform Generation Mode 0
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1); // set pin 9 as output
TCCR1A |= (1<<COM1A1);
OCR1A = 125;
}
void loop()
{
}
上記のコードは、ピン 9 から約 2.5V (49% のデューティ サイクル) の平均電圧出力を生成します。(私にとって) 奇妙なことは、データシートによると、TIMER1 は 16 ビット タイマーであるため、65536 ティックでオーバーフローするはずです。 . 私が理解していることから、OCR1Aを0から65535に設定すると、パルスのデューティサイクルが変更されます。では、OCR1A を 125 に設定すると、2.5V ではなく約 0.01V の出力が得られるのではないでしょうか? 結果は、クロックが 255 でオーバーフローしていることを示しているようです。
PWM ランドへの 2 回目の進出では、ATMega の高速 PWM モードを使用して 2.5V 信号を作成してみました。これが私が得たものです:
// Waveform Generation Mode 14
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1);
TCCR1A |= (1<<COM1A1) | (1<<WGM11);
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS10);
ICR1 = 19999;
OCR1A = 10000;
}
void loop()
{
}
ICR1 (オーバーフロー値) を任意に 20000 ティックに設定し、OCR1A (比較値) をその約半分に設定します。チャンネル A を非反転モードに設定しましたが、反転モードに設定しても違いはなかったと思います。これを Arduino にフラッシュしたとき、ピン 9 から平均 5V (100% デューティ サイクル) の安定した電圧が得られました。
あなたが提供できる洞察をいただければ幸いです。