« Arduino UNO R3(のATmega328P)を使った電流計各種 | トップページ | イチケンさんの動画に居酒屋ガレージ日記(旧ページ)が »

2024年3月25日 (月)

超低速2相パルス発生回路

実験中の回路の動作検証用のジグで、
ジッタの無い2相パルスが欲しいという
のに答えた回路とスケッチです。

過去、あれこれ2相パルス発生器を作っていますが、
その原発振に使っているのはVCO。
手軽に周波数を可変できますが、安定度は
もう一つ。
周波数カウンタで発振周波数を読むのも面倒だし。
ということで、Arduino UNO R3を使って作って
みました。

タイマー1をCTCモードで使います。
OCR1AレジスタでA相周期を決めて、OC1Aを
トグル出力。
これがA相。

B相は、OCR1Aの半分の値をOCR1Bに設定して
(90度位相のため)OC1Bの出力極性をOC1A割り込み
のたびにトグル(CW、CCWに合わせて)します。

こんな回路です。
タイマー1の「ハード」でパルスを作っているので
ジッタはありませんし、安定した周波数が得られます。

Cw_ccw0
タイマー1のクロック源は、設定周波数が150Hz以上
だと内蔵の16MHzクロック。
周波数が低くなると、外部クロックに切り替えて
タイマー2で作った方形波をクロック源にします。

ケースへの組み込みはまだ。
バラックでの試運転。
C21_20240325151801

設定できる最低周波数が「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相パルス発生回路・ケース入れ

|

« Arduino UNO R3(のATmega328P)を使った電流計各種 | トップページ | イチケンさんの動画に居酒屋ガレージ日記(旧ページ)が »

ツール」カテゴリの記事

Arduino」カテゴリの記事

割り込み処理」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« Arduino UNO R3(のATmega328P)を使った電流計各種 | トップページ | イチケンさんの動画に居酒屋ガレージ日記(旧ページ)が »