Arduino-UNOでパルスジェネレータを作ってみた
ラジオペンチさんとvabenecosiさんのパルスジェネレータを
真似してみました。
・ラジオペンチさん
http://radiopench.blog96.fc2.com/blog-entry-808.html
・vabenecosiさん
http://vabenecosi.blog.fc2.com/blog-entry-37.html
そのままでは、面白くないので、
・トラ技 2010年7月号 ATtiny2313を使ったハンディ方形波発生器
の方式、
・16bitタイマー1のクロック入力T1に
・タイマー2で作った方形波を入れる
ということにしてみました。
クロック源となる方形波の周波数は、
1MHz 100kHz 10kHz 1kHzの4種類。
周期だと1us 10us 0.1ms 1msとなり、
これをクロック源として16ビットで設定できるので、
最大の周期は、
1us : 65.535ms
10us : 655.35ms
0.1ms : 6.5535秒
1ms : 65.535秒
となります。
※ATtiny2313では3桁のデジタルスイッチだったので
もの足りなかった。
とりあえずArduino-UNOをベースに試してみました。
こんな回路。
操作スイッチを4つにして、ロータリーエンコーダで
設定できる入力桁位置を設定できるようにしています。
※←(SW2) →(SW3)がカーソルスイッチ
カーソルより右の下位桁の値をそのままにして
左側(上位桁)の数値だけを±できるようにしました。
「12.345ms」で、2の位置にカーソルがある時CCW回しすると
→11.345ms
→10.345ms
→ 9.345ms
→ 8.345ms
→ 7.345ms
と、下位3桁はそのままにして上位の数値を-1します。
※左右のカーソルを独立させたので、操作スイッチは
4つになっています。
また、スイッチの拡張機能操作は「二つ同時押し」
ではなく「長押し」にしています。
こんな操作画面です。
右上がタイマー1の供給クロック周期。 (4種類)
右下が出力パルスの極性、PosとNegで表示。
周期設定の時は周期から周波数を計算して表示。
SW1の操作で周期設定とパルス幅設定を変えます。
パルス幅設定の時は、デューティ比を表示します。
操作する桁を固定できるので、大きく数値を変えることが
できます。
パルスの周期を0.2秒にしてパルス幅を変えてみました。
エンコーダーのつまみをあわてずに回すと、
デューティが「100% → 0% → 100%」と変化する
様子が見えます。
デューティ100%と0%でH、Lに張り付かせる処理も
面白いかと。
・エンコーダの回転チェック
・操作スイッチの入力
この二つを割り込みで処理しています。
エンコーダをクルクル操作すると、周期やパルス幅が変わ
るので、その値の表示だけでなく、周波数とデューティー比
を計算して表示します。
その処理時間が「7~8ms」。
※液晶表示に時間がかかる
エンコーダのクルクルを速くすると・・・処理が間に合わ
なくなってきます。
でも、エンコーダのカウント処理は割り込みで動いているので、
up/down値の抜けはありません。
メイン側の計算・表示処理がつまってもカウント抜けは
しないというしかけになっています。
その様子です。
エンコーダを速く回した時、表示処理がつまっている
様子が見えています。
※loopの頭で出力ポートをトグルしているので、
処理が間に合わなくなると、トグルが見えるように
なります。
描画中はトグルが止まります。
テスト出力しているパルスで、表示処理中も、エンコーダ
の回転を読んでいる様子が見えています。
割り込みを使わずにエンコーダを読んでいたら・・・
カウント抜けの可能性大です。
ラジオペンチさん、vabenecosiさんの回路そのままでは
動きません。
・OC2A 方形波出力 → T1クロック入力のつなぎ
・エンコーダをINT0、INT1に。
(INT1は割り込みでは使っていない)
ということで、液晶やスイッチのポートが変わっています。
・回路図(BSch3Vファイル) 圧縮
ダウンロード - pgen16a.zip
・スケッチ (ファイルタイプをtxtに)
ダウンロード - p_gen16a.txt
さて、ケース入れを考えなければなりません。
電源は電池かな。
※追記 : 参考、関連あれこれ
(勉強のために読んでみて)
・2020年2月10日:ArduinoのanalogWrite 1/255なの?
・2020年1月28日:Arduinoから「タイマー0」を取り上げる(ユーザーが使う)
・2022年7月25日:Atmega328P タイマー/カウンタ1の高速PWM動作
・2020年8月13日:Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMを使おう
・2020年8月16日:Arduino UNOのPWM出力を(ちょっと精密に)確かめる
・2020年9月19日:クリック有りのロータリーエンコーダーで
・2019年4月1日:ArduinoのEEPROMアクセス、「EEMEM」について
・2020年2月4日:Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ
・2022年3月11日:Arduino-UNO 割り込み処理のミスあれこれ:ロータリーエンコーダー
・2018年10月11日:魔法の言葉「volatile」
| 固定リンク
「ツール」カテゴリの記事
- 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)
「AVRマイコン」カテゴリの記事
- AVRマイコンAT90S1200を使ったデジタル時計(2024.06.02)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
- 数値をBCD出力(表示)するルーチン #2(2024.04.28)
- ATmega4809のシリアルポート(2023.01.18)
- PWMでD/A変換:アナログマルチプレクサの応用で(2023.01.02)
コメント
今回のクロック源はタイマー2で生成する「1MHz 100kHz 10kHz 1kHz」の4種類。
それをタイマー1の外部入力「T1」にほうり込んでいます。
そこで・・・
タイマー1のクロック入力を16MHzのダイレクト接続(分周器無し)に切り替えると、最小クロックが「0.0625us」となり、16倍の高速化(高分解能化)ができるかと。
※誰でも考えるでしょうけど
クロックが1MHz、100kHz・・・だと表示が「ms」と「s」になるので「1 10 100・・」が表示単位となり簡単なのですが、16MHzが基準クロックになると最小桁の変化が「0.0000us→0.0625us→0.125us・・・0.9375us」(1/16の変化)となり、周期表示の桁数が現在のものより増えてしまいます。
さてどうしたものか。
ちょっと試してみます。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年8月 6日 (土) 21時03分
とりあえず動くように
http://igarage.cocolog-nifty.com/blog/2022/08/post-c07c42.html
パルスジェネレータを作ってみた:箱に入れた
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年8月25日 (木) 09時25分