高速 PWM モードで TC0 (8 ビット タイマー) を使用して、ATmega2560 でハードウェア PWM を使用しようとしています。デューティ サイクルを動的に調整する必要があり、これにはゼロ デューティ サイクルが含まれます。ただし、これは簡単ではなく、可能でもないようです。データシートの引用:
OCR0A レジスタの極端な値は、高速 PWM モードで PWM 波形出力を生成する特殊なケースを表しています。OCR0A が BOTTOM に等しく設定されている場合、出力は MAX+1 タイマー クロック サイクルごとに狭いスパイクになります。OCR0A を MAX に設定すると、(COM0A1:0 ビットで設定された出力の極性に応じて) 常にハイまたはローの出力になります。
したがって、OCR0A を 0 (=BOTTOM) に設定しても、実際にはデューティ サイクルがゼロになることはなく、私のテストではこれが確認されています。他のアプローチを取る必要があります。
最初に、上記の引用で説明した OCR0A=MAX 特殊ケースの使用について説明しました。反転モードへの一時的な切り替えと組み合わせると、デューティ サイクルがゼロになります。ただし、COM0A1:0 ビットはダブル バッファリングされていない (そして OCR0A と同期していない) ため、出力がハイのときにモードが切り替わると、出力にグリッチが発生する可能性があります (次のオーバーフローまでハイのままになります)。 )。OCR0A の変更とモードの変更がどの順序で行われたかは問題ではないようです。
COM0A1:0=0 を設定して PWM をオフにする別の解決策も検討しました。これにより、出力が PORT レジスタの値 (ゼロ) に即座に設定されます。しかし、ゼロ出力からゼロ以外のデューティ サイクルに戻るという問題がまだ残っています。データシートで読んだ内容から、COM0A1:0 を設定して PWM を再度有効にすると、すぐに出力ピンが PWM の出力に切り替わります。これは、次の比較一致またはタイマー オーバーフローまで正しくない値になる可能性があります。したがって、グリッチ。
PWM 全体を反転することは適用可能かもしれませんが、問題は完全なデューティ サイクルを達成することになり、対称的な問題が発生します。
データシートで説明されているように、PORT 経由でピンの出力を強制している間は、PWM 波形生成を有効のままにすることはできないことに注意してください。
コンペア出力モード (COM0x1:0) ビットには 2 つの機能があります。波形ジェネレータは、COM0x1:0 ビットを使用して、次の比較一致での出力比較 (OC0x) 状態を定義します。また、COM0x1:0 ビットは OC0x ピンの出力ソースを制御します。
PWM を 1 サイクルほど実行し、準備ができたら切り替える方法はありません。PWM を有効にすると、すぐにピン出力が強制されます。
アップデート。位相補正 (中央揃え) PWM モードにはこの問題はなく、私の場合は問題ありません。私はそれを試して、ゼロとフルの両方のデューティ サイクルで動作することを確認しました。