« ゴミかなぁ~・・・3.5インチフロッピー、280枚 | トップページ | 『元素創造』93~118番元素を作った科学者達 »

2021年12月 2日 (木)

Arduino UNOでワンショットパルスを出力

出窓の結露対策で使う「湿度センサー」 をあれこれ調べていて、
『高機能なものより単純なもののほうが良いのではないか?』
っと思い始めました。
ネットを探しますと、センサーのから湿度を引き出す手順を
丁寧に解説されていたのが、このページ。
 ■HS15P 湿度センサーの簡易動作実験■
 ■HS15P 湿度センサーの簡易動作実験 Arduino版■

・湿度でセンサーの抵抗値が変化。
・センサーに直流を加えるのは×。
   1kHzくらいのACで測定と
・湿度による抵抗値の変化が大。
   数百Ω~数メガΩ
・温度による補正が必要。

示されている回路では、センサーにコンデンサを直列につなぎ、
その充電時間とコンデンサ両端電圧から抵抗値を測定しようと
いうもの。
充電時間を変えることで、大きなレンジ幅が得られます。

Arduino用のスケッチを拝見しました。

気になったのが充電時間を決めているタイマーの処置。
Arduinoのソフトウェアタイマー「delayMicroseconds()
を割り込み禁止状態で使われています。
パルスの出力(実際にはハイインピーダンスとH/L出力の切り替え)
も digitalWrite() と pinMode()。
   ※回路は簡単になります。
これでは「遅く」なってしまい、私の好みの処理ではありません。
delay()やdelayMicroseconds()を使うと、
その待ち時間の間は何もできませんから。

必要なのは正確な時間のワンショットパルス
そこで、ちょっとトライ。
・ATmega328Pのタイマー1を利用して、ハード的に
 パルスを発生させる。
・タイマー1のOC1A出力を用いる。
・設定範囲は1μ秒単位で最大4,096,000μ秒。

昔々のタイマーIC、82536840では簡単にできた
ワンショットタイマー、ATmega328Pではちょいと面倒です。

こんな考え方です。
Photo_20211202113201

使うレジスタはTCNT1、OCR1A以外にこれらを駆使します。

・クロックの停止とプリスケーラの設定
A12_20211202113201

・OC1A出力のH/L設定
A11_20211202113201

・OC1A強制出力 (コンペアマッチを待たずに出力)
A13_20211202113201
・プリスケーラのリセット
A14_20211202114101

こんなパルスが得られます。
A21_20211202113201

4000μ秒まではプリスケーラ無しで16MHzをカウント。
それより長いパルスはプリスケーラを切り替えながら
16bitの範囲でOCR1Aレジスタでパルス幅を設定します。

この処理のメリット。
・パルス出力中も他のことができる。
・割り込みも有効。

サンプルスケッチはキー入力した値(μ秒)でワンショットパルス
を発生させます。

   ・ダウンロード - pulse_tm1.txt
      (テキストファイルにしてます)

出力中に新たな値を入れた時は、先のパルス出力を中断して
新しいパルスを出します。
「0」だと出力停止です。
定常的なパルス出力はPWMやアウトプットコンペアで出力
できますが、ワンショットとなるとなかなか面倒な手順に
なりました。

PWMではOCR1Aが2重バッファになり、即値での更新ができなく
なるので、ワンショットには使えませんでした。

湿度計回路に使うには、充放電のためのアナログスイッチを
外付けしなくてはなりません。
しかし、ハード的に正確な時間のパルスが使えるということで、
いかがでしょうか。

|

« ゴミかなぁ~・・・3.5インチフロッピー、280枚 | トップページ | 『元素創造』93~118番元素を作った科学者達 »

出窓」カテゴリの記事

Arduino」カテゴリの記事

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

コメント

コメントを書く



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




« ゴミかなぁ~・・・3.5インチフロッピー、280枚 | トップページ | 『元素創造』93~118番元素を作った科学者達 »