Arduinoで使用されているAtMega328またはATTiny85のいずれかのAtmel AVRマイクロコントローラーのTimer1を使用して、互いに鏡像の2つのクロック信号を出力しようとしています。私が生成しようとしている周波数は1 MHzから2 MHz以上の可変であり、コントローラーで他にほとんど何もしたくない場合を除いて、出力ピンを切り替えるコードを使用してこれを行うには高すぎます。したがって、関連するピンで直接タイマー出力を使用したいと思います。私はGCCツールチェーンを使用しているため、arduinoライブラリまたは言語に制限されません。
Atmega328のTimer1には2つのピンが関連付けられており、それらから2つの同じ1MHz〜2MHz信号を取得できます。データシートに反転波形が表示されるようですが、混乱しています。Timer1のPWM設定を使用して、1 MHzでデューティサイクルが異なる2つの信号を取得することもできますが、両方の信号が同時にハイになり、短い方が早くローになります。これは私のプロジェクトに役立ちません。PWMパルス幅の変動も必要ありません。反対位相の2つの同一の「クロック」タイプの信号が必要なだけです。
私がこれを行うためのコードを書くことを誰かに求めているのではなく、タイマーのどのモード/フラグがタイマーに関連付けられた2つのピンの1つに単純な反転波形を与えるべきかを誰かに教えてくれる必要があります。それが唯一の選択肢でない限り、可能であれば、出力の1つに外部反転回路を使用しないようにします。
これがATTinyで可能な場合は、さらに良いでしょう。ATTinyには、1つのタイマーに関連付けられた2つのピンもありますが、ATMegaと同じオプションがあるかどうかはわかりません。
PCBに接続された20 MHzの水晶振動子とコンデンサーを既に持っており、20 MHzのクロックはATMega328で確実に機能しています。ATTiny85 PCBには8 MHzの水晶があり、これも確実に機能しています。
助けてください。ありがとうございました。
更新:これまでの回答とコメントにはいくつかの無効な仮定がありますので、おそらく明確にする必要があります:私の元の投稿では、8 MHzではなく 20 MHzクロックを使用していること、およびPWMは不要であることを指摘しました。
PWMモードは2 MHzの出力では機能しないため、十分に高い出力周波数を提供する唯一のモードはCTCモードのようです。CTCモードでタイマー1の出力Aまたは出力Bを反転する方法はありますか?
私のコードをチェックするために、自分の20 MHzボードではなく、標準のArduino Uno(ATMega328、16 MHz)に切り替えました。これは、CTCモードでピン9と10からの安定した2 MHzクロックのタイマーです。タイマー1つの出力ピン:
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
両方のピンのオシロスコープのトレースは同一で同期していますが、2つの信号のいずれかを反転するにはどうすればよいですか?データシートの反転モードは、CTCモードでは何もしないようです。データシートを間違って読んでいますか、それとも結局、低い周波数とPWMモードを使用する必要がありますか?
特定の「賞金」の質問を元のクエリに追加するには:
上記のコードにどのような変更を加える必要がありますか。16MHzクロックの可能な最高周波数でピン9と11に完全に反転した信号を提供するには、それは2 MHzかどうか?
とりあえず標準のArduino Unoを使い続けます。ホームスパンボードによってエラーモードが導入されることはなく、Arduinoを持っている人は誰でも上記のコードを試して、私が述べたとおりに機能することを確認できます。必要!