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、8253や6840では簡単にできた
ワンショットタイマー、ATmega328Pではちょいと面倒です。
使うレジスタはTCNT1、OCR1A以外にこれらを駆使します。
・クロックの停止とプリスケーラの設定
・OC1A出力のH/L設定
・OC1A強制出力 (コンペアマッチを待たずに出力)
・プリスケーラのリセット
4000μ秒まではプリスケーラ無しで16MHzをカウント。
それより長いパルスはプリスケーラを切り替えながら
16bitの範囲でOCR1Aレジスタでパルス幅を設定します。
この処理のメリット。
・パルス出力中も他のことができる。
・割り込みも有効。
サンプルスケッチはキー入力した値(μ秒)でワンショットパルス
を発生させます。
・ダウンロード - pulse_tm1.txt
(テキストファイルにしてます)
出力中に新たな値を入れた時は、先のパルス出力を中断して
新しいパルスを出します。
「0」だと出力停止です。
定常的なパルス出力はPWMやアウトプットコンペアで出力
できますが、ワンショットとなるとなかなか面倒な手順に
なりました。
PWMではOCR1Aが2重バッファになり、即値での更新ができなく
なるので、ワンショットには使えませんでした。
湿度計回路に使うには、充放電のためのアナログスイッチを
外付けしなくてはなりません。
しかし、ハード的に正確な時間のパルスが使えるということで、
いかがでしょうか。
| 固定リンク
「出窓」カテゴリの記事
- 出窓:鯉のぼりを振る(2023.05.04)
- 出窓:鯉のぼりを振れたらというリクエスト(2023.04.26)
- 「壊れたオルゴールの人形」を回せ!(2022.05.17)
- 「ダイソーの観覧車」を回せ! 回路図(2022.05.08)
- 緊急指令! 「ダイソーの観覧車」を回せ!(2022.05.04)
「Arduino」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
- Arduino UNOで3相モーターを回す(2023.05.01)
- Arduino サーミスタを使った温度測定で 【ゼロ除算問題】(2023.03.23)
- A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?(2023.03.21)
「割り込み処理」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 8ビットマイコンの割り込み処理・・・1バイトに収まるなら1バイトに(2023.03.01)
- 8bitマイコンにも16bitのメモリ読み書き命令があった(2022.10.14)
- 何度も言うぞ! Arduino(8bitマイコン)の割り込みには気をつけろ!(2022.10.11)
- ロータリーエンコーダーのチャタリング波形(2022.09.11)
コメント