超低速2相パルス発生回路
実験中の回路の動作検証用のジグで、
ジッタの無い2相パルスが欲しいという
のに答えた回路とスケッチです。
過去、あれこれ2相パルス発生器を作っていますが、
その原発振に使っているのはVCO。
手軽に周波数を可変できますが、安定度は
もう一つ。
周波数カウンタで発振周波数を読むのも面倒だし。
ということで、Arduino UNO R3を使って作って
みました。
タイマー1をCTCモードで使います。
OCR1AレジスタでA相周期を決めて、OC1Aを
トグル出力。
これがA相。
B相は、OCR1Aの半分の値をOCR1Bに設定して
(90度位相のため)OC1Bの出力極性をOC1A割り込み
のたびにトグル(CW、CCWに合わせて)します。
こんな回路です。
タイマー1の「ハード」でパルスを作っているので
ジッタはありませんし、安定した周波数が得られます。
タイマー1のクロック源は、設定周波数が150Hz以上
だと内蔵の16MHzクロック。
周波数が低くなると、外部クロックに切り替えて
タイマー2で作った方形波をクロック源にします。
ケースへの組み込みはまだ。
バラックでの試運転。
設定できる最低周波数が「0.1Hz」。
つまり周期が10秒。
150.0Hzまでは0.1Hzステップで可変できます。
越えると1Hzステップに。
設定できる最高周波数は5kHzまでにしていますが、
2.8kHzを越えたあたりから1Hzステップの可変では
分周器での誤差が目立ってきます。
こんなスケッチです。
・ダウンロード - cw_ccw2k1.zip
I2C液晶のライブラリを同梱しています。
ソースファイルだけ。 (.inoを.txtにして)
・ダウンロード - cw_ccw2k1.txt
パルスジェネレータ では周期を設定していましたが、
今回のは周波数。
(入力周波数に反応する回路の検証用です)
DDS機能なんかは無いので、
クロック周波数 ÷ 設定周波数
で、タイマー1の分周比を得ています。
そのため、設定Hzと実際のHzに少々の狂いが
生じます。 (Arduino 発振子の誤差とは別に)
実験中のArduino UNO R3では1000.0Hzに設定
したら1000.074Hzが出てきます。
この末尾の74は発振子の誤差。
999.9Hzにすると999.0753となって、分周比が
整数になることによる誤差が積まれます。
1000.0Hzなら8MHz÷1000で8000.0000が分周比。
999.0Hzなら8008.008008に。
目標周波数で少数以下が変わります。
そして周波数が上がると飛んでしまう設定も
出てきます。
3007Hzも3008Hzも3007.742Hzが出て、
3009Hzになると3008.873Hzになります。
(実物の試験回路で)
周波数が高くなると分周比が小さくなって、
微妙なところが出せなくなるのです。
それと・・・
周波数を低くした(周期を長く)ときの応答。
0.1Hz→0.2Hzに変えた時、実際の波形が変わるのは
最大で5秒後。
A相波形をトグルするOC1A割り込みの中で次の周期を
設定しているのでこんな動作になります。
・トラ技2005年10月号:2相パルス発生器
・29年前に製作したツール 2相パルスカウンタ
・アナログ入力で2相パルスの周波数と正転逆転を制御する発振器
・高速2相パルス発生回路
※アナログコンパレータ入力
Low Batのチェックをしてますんで
(液晶右下に電池マーク点滅表示)
AIN1/PD7がオープンだとチラチラするかもです。
※なんでこんなめんどくさいことを
タイマーで計時してポートをH/Lさせれば、どんなマイコンでも
2相パルスを作れます。
今回の要望は2相パルスの安定性。
ジッターが出て欲しくなかったのです。
ATmega328の場合、タイマー1(16biit)でのハード的な
波形出力が使えました。
割り込みの中でコンペアマッチの値を書き換えているのは、
出力波形を崩さないため。
OCR1Aをメイン側で書き換えたとき、タイミングとその値で
TCNT > OCR1Aになってしまうと、コンペアマッチの発生
が1周(65536パルス)遅れてしまう可能性があるからです。
低周波ではその影響が目立ちます。
コンペアマッチの直後だと、TCNTはゼロからちょいと進んだ
値に留まっているはずなので、それより大きな値だと
1周抜けは避けられます。
これ、データシートでは「2重緩衝」という表現が使われています。
CTCモードでのOCR1Aはその機能が無効になるのです。
PWMモードでのOCR1Aは2重緩衝されますので、割り込み処理
しなくても自由に周期を変えることができます。
ただし、ICR1でのTOP値設定では2重緩衝されないでの、
単純な操作ではコンパエマッチのミスが発生します。
タイマー周期を自由に変えたいときは、データシートよく読ま
ないとスカタンします。
※続き
・2024年4月3日:超低速2相パルス発生回路・ケース入れ
| 固定リンク
「ツール」カテゴリの記事
- 40年前の「HAKKO DASH」(2024.07.17)
- ひさしぶりのバージョンアップ:チャートレコーダ(2024.07.02)
- 松下の「ホロホロブザー」つながりで(2024.06.19)
- 非反転アンプ 3kΩと27kΩの抵抗(2024.05.30)
- ハンダゴテのコテ先温度を上げたい エエ感じに(2024.05.19)
「Arduino」カテゴリの記事
- 液晶表示:CG-RAMの表示がちょいと違う(2024.09.12)
- ひさしぶりのバージョンアップ:チャートレコーダ(2024.07.02)
- 最適化処理のせいで悩んだぞ 呪文volatile再び(2024.06.06)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
- ダイソー SHOOTING LIGHT:撮影用ライト LEDの輝度変化を探る #2(2024.05.03)
「割り込み処理」カテゴリの記事
- 最適化処理のせいで悩んだぞ 呪文volatile再び(2024.06.06)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
- I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの(2024.04.07)
- 超低速2相パルス発生回路・ケース入れ(2024.04.03)
- 超低速2相パルス発生回路(2024.03.25)
コメント