« 月の夜部に★を描く:太田忠司さんの本でも | トップページ | パルスジェネレータを作ってみた:16MHzクロックを追加 »

2022年8月 5日 (金)

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をベースに試してみました。
こんな回路。

Pg11

操作スイッチを4つにして、ロータリーエンコーダで
設定できる入力桁位置を設定できるようにしています。
   ※←(SW2) →(SW3)がカーソルスイッチ
カーソルより右の下位桁の値をそのままにして
左側(上位桁)の数値だけを±できるようにしました。

「12.345ms」で、2の位置にカーソルがある時CCW回しすると
→11.345ms
→10.345ms
→ 9.345ms
→ 8.345ms
→ 7.345ms
と、下位3桁はそのままにして上位の数値を-1します。

  ※左右のカーソルを独立させたので、操作スイッチは
   4つになっています。

また、スイッチの拡張機能操作は「二つ同時押し」
ではなく「長押し」にしています。

こんな操作画面です。
Ga001
右上がタイマー1の供給クロック周期。 (4種類)
右下が出力パルスの極性、PosとNegで表示。
周期設定の時は周期から周波数を計算して表示。

SW1の操作で周期設定とパルス幅設定を変えます。
Ga002
パルス幅設定の時は、デューティ比を表示します。

Ga003

操作する桁を固定できるので、大きく数値を変えることが
できます。
パルスの周期を0.2秒にしてパルス幅を変えてみました。
エンコーダーのつまみをあわてずに回すと、
デューティが「100% → 0% → 100%」と変化する
様子が見えます。

Pg21
デューティ100%と0%でH、Lに張り付かせる処理も
面白いかと。

・エンコーダの回転チェック
・操作スイッチの入力
この二つを割り込みで処理しています。

エンコーダをクルクル操作すると、周期やパルス幅が変わ
るので、その値の表示だけでなく、周波数とデューティー比
を計算して表示します。

その処理時間が「7~8ms」。
  ※液晶表示に時間がかかる

エンコーダのクルクルを速くすると・・・処理が間に合わ
なくなってきます。
でも、エンコーダのカウント処理は割り込みで動いているので、
up/down値の抜けはありません。

メイン側の計算・表示処理がつまってもカウント抜けは
しないというしかけになっています。

その様子です。
エンコーダを速く回した時、表示処理がつまっている
様子が見えています。
  ※loopの頭で出力ポートをトグルしているので、
   処理が間に合わなくなると、トグルが見えるように
   なります。
   描画中はトグルが止まります。
Pg22

テスト出力しているパルスで、表示処理中も、エンコーダ
の回転を読んでいる様子が見えています。

割り込みを使わずにエンコーダを読んでいたら・・・
   カウント抜けの可能性大です。

ラジオペンチさん、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」


|

« 月の夜部に★を描く:太田忠司さんの本でも | トップページ | パルスジェネレータを作ってみた:16MHzクロックを追加 »

ツール」カテゴリの記事

Arduino」カテゴリの記事

AVRマイコン」カテゴリの記事

コメント

今回のクロック源はタイマー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分

コメントを書く



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




« 月の夜部に★を描く:太田忠司さんの本でも | トップページ | パルスジェネレータを作ってみた:16MHzクロックを追加 »