パルスジェネレータを作ってみた:箱に入れた
・2022年8月5日:Arduino-UNOでパルスジェネレータを作ってみた
・2022年8月7日:パルスジェネレータを作ってみた:16MHzクロックを追加
この続きで、完成形に持ってきまして、2台作りました。
※前のとは回路が少し違います。
一つは乾電池2本仕様。
バックライト無しの液晶で。
タカチのプラケース「SW-125」。
こんな中味。
二つ目がバックライト付きの液晶なんで、ちょい
電流が増えるので電池を3本に。
ケースは「ダイソ-」で入手。 税込110円。
安く買ったケース、ついつい手抜きで加工精度が
もうひとつ。
液晶の窓部分の寸法が微妙にずれてます。
※気にしない、気にしない。
買ったのはダイソー。
日本製。東大阪市高井田の「(株)シャルム」
SAI-20-P8 No.141 181 x 90 x 28mm
材質:ポリプロピレン
Arduino UNO単体で試すならこんな接続で。
箱に入れた回路には、電池電圧低下検出回路も
入れてあります。
電池3本仕様のを図示。
さて、これをまとめて製作記事としてトラ技に投稿したの
ですが、記事を出してから、ロータリーエンコーダの入力
部分をちょいと手直しをしました。
原稿では
「A相の↓エッジパルスをINT0に入れて割り込み
処理でカウント」
としました。
そのため、ハード的なチャタリング除去回路
(CRを使ったディレー回路)が必要です。
INT0割り込み内の処理でチャタリングを逃げる手当は
しているのですが、激しいのが来ると、カウントを
ミスることがあるのです。
※立ち上がりの時に出たチャッタを
↓エッジが来たと勘違いすることが
あった。
回路をシンプルにということで、このディレーを
無くして(1000PFのコンデンサだけに)、カウント
処理をタイマー割り込み内に入れてチャタリング
除去を試してみたのです。
タイマー割り込みを2kHzにして4段のシフトレジスタ
のデータ一致で信号の安定を検出します。
この方法↓
・2020年9月16日:ロータリーエンコーダーの2相パルスをタイマー割り込みで
今回のスケッチはINT0割り込みじゃなく、タイマー割り込みを
使ったのをアップしておきます。
・ダウンロード - p_gen16c.txt
※ファイルタイプを.txtにしています。(普通は.ino)
お試し下さい。
※2022-09-03 ちょっと手直し
「SW2長押し」による「duty 50%設定」。
この時も「duty hold」状態になるようにしました。
どっちが使いやすいか・・・
「デューティ50%で使いたいんや」の時、
前のだと、「duty 50%」後に「duty hold」操作、あるいは、
「duty hold」状態で「duty 50%」操作という流れでした。
手直し後は「duty 50%」でそれを維持してくれるという
ことで、ちょい、手間が省けるのではないかと。
duty holdの解除は、
・再度SW3を長押し。 あるいは
・W:パルス幅設定モードにしてエンコーダを操作。
Wモードにしただけでは解除しません。
パルス幅の値を変えた=デューティを変えたぞ
でholdを解除します。
P:周期設定モードのままだとduty 50%を維持。
※周期設定値が奇数だときっちり50%にはな
りません。
※動き、操作の詳細はスケッチを読んでね。
ミスを発見したり、改善点があれば、コメント
してください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※追記 タイマー割り込みでのチャタリング除去処理
まず、INT0割り込みでのカウント処理の様子。
CRフィルタがないと、こんなミスカウントが出ます。
↓エッジだけが欲しいんですが、A相立ち上がりで
発生したチャタリングが悪さをしてミスカウントしています。
拡大
INT0 ↓エッジパルス割り込み処理では、
・直後のA相がHならミスなので除外
・前回の有効↓より4ms経過してないと除外
という処理を入れているのですが、それを逃れる
パルスが出現しています。
ハード的なローパスフィルタが必要です。
それをタイマー0.5ms割り込みで処理すると、
こんな具合に。
中央にジャギジャギが見えていますが、
「0.5ms×4回で安定」
という処理で、ミスカウントは逃れています。
INT0エッジ割り込みか、タイマー割り込みか、
利点、欠点はそれぞれです。
・INT0エッジ割り込み
即応答。 素早いカウントが可能。
チャタリング対策はハードで。
(エンコーダの特性に合ったCRフィルタを)
INT1を使えば4逓倍処理も可能。
・タイマー割り込みで
ポートにつなぐだけでOK。
2相パルスが速いと抜かすかも。
割り込み処理でいつも実行されるので
パルス入力がないときでも時間が食われる。
(もったいないぞ。 タダだけど)
8bitのシフトレジスタなんで、この2相パルス
に加えて、あと6つの信号のチャタリング除去
もついでにできる。
※9月12日:エンコーダを素早く回した時の処理
前回のカウントパルスから20ms未満の時(早回し)の加速処理
をテーブルにしました。
スケッチの中、「const byte enc_spd[] PROGMEM」に
0~19msの加速パルスをテーブルにしています。
ご自由に。
・ダウンロード - p_gen16d.txt
バージョン:P-Gen16d 2022-09-12 です。
| 固定リンク
「ツール」カテゴリの記事
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- アナログ計器(2024.09.27)
- 秋月のI2C接続液晶 AQM1602XAを基板に直付け(2024.09.24)
- 「導通チェッカー」から「配線チェッカー」へ(2024.09.20)
- 40年前の「HAKKO DASH」(2024.07.17)
「Arduino」カテゴリの記事
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
コメント
これ良いですね。とりあえずスケッチをダウンロードしてUNOに書き込むと、シリアルに
P-Gen16c
2022-08-24
と出力されるので動いてるっぽいです。
後でちゃんと配線して動かしてみます。
投稿: ラジオペンチ | 2022年8月25日 (木) 17時28分
ジェネレーターの件ではなくてすみません。
小生は2006年に大富市場、、昭和館でお尋ねした者ですが、この4日前には北鶴橋小で50年ぶりの親友との再会でした。変わるところ(商店街など)は変わり、変わらないところは変わっておらずでした。さて、、、60年くらい前に巽町は田んぼでザリガニ、たにし、カエルを取りに出かけた覚えがあります。多分、、いまのロート製薬??ぐらいのところ。ガキですからずいぶんと遠い距離だった覚えがあります。類似の思いでがもしもありましたらと、、、
投稿: 乾 勝重 | 2022年8月26日 (金) 09時53分
北鶴橋小学校も統廃合問題でたいへんです。
中川小学校はすでに大池小学校を名が変わっています。
場所はいっしょ。
御幸森小、舎利寺小との統廃合で。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年8月26日 (金) 10時40分
この記事ですな。
http://act-ele.c.ooco.jp/blogroot/igarage/article/161.html
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年8月26日 (金) 11時42分
ご丁寧、、感謝致します。4日ほど前に猪飼野中2の45近辺に通称「レンガ路地」がありまして今の百草湯の前。私はS23年生まれ、小2~3年の頃に<駒鬼>が流行、他には<バイ>、路地に住むおばあさん81歳と歓談。近所に住む傘屋の出来損ないのバカ息子が私だと言いますと当時を思い出し震えが来たと感激されました。逆に大感激を貰いました。S30年お生まれだと洪水で水浸したのを覚えてられますか、私は2階の物干しから小便でした(笑い)貴重な生野区の資料に大感謝。なを大人の電子工作と言うFACEBOOKのグループにマイコン、、これまた古く40年前の自作機FIGーFORTH&タイニーBASICの完全自作を投稿しました。笑覧くだされば幸いです。お元気でお過ごしください。どうも失礼致しました。
投稿: 乾勝重 | 2022年8月26日 (金) 17時59分
ちょっと手直した「p_gen16c1」を追記しています。
内容は本文を。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 3日 (土) 08時45分
うちのパルジェネの中身をこの記事のものに入れ替えました。なかなか調子良く動いてます。情報公開ありがとうございます。
https://twitter.com/radiopench1/status/1566613771610574849?s=20&t=tF5uawncHMc-ttaxWU2Iag
投稿: ラジオペンチ | 2022年9月 5日 (月) 11時33分
ラジペンさんの「製作まとめ」、楽しみにしています。
エンコーダの調子はいかがでしょうか?
クリック有のタイプですよね。
品種により、接触具合が違うと思いますんで。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 6日 (火) 08時33分
こんにちは、ちょっと質問してもいいでしょうか?
LCDをI2Cの"I2CLiquidCrystal.h"を使ってやろうとしているのですが、うまく表示できません。
Serialのほうは出てるのでプログラムは動いてるようなのですが、何かアドバイスをお願いします。
まさひろ
投稿: まさひろ | 2022年9月 9日 (金) 01時25分
まさひろさん、スケッチ「p_gen16c1」の改造は置いておいて、I2C液晶単独では動いていますか?
「hello world」文字は出せてるとか。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 9日 (金) 08時14分
I2C液晶の駆動ルーチンは"twi"を使っています。
その中でタイムアウトのチェックに"micros()"で経過時間をチェックしています。
これにはATmega328Pのタイマー0のオーバーフロー割り込みが必須。
p_gen16c1はこれを横取りして2kHz割り込みにしています。
ですので、micros()は動きません。
I2C液晶がダメなのはこれ。
あきらめてください。
あきらめるのがイヤなら自力でI2C液晶の処理ルーチンを頑張って作ってください。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 9日 (金) 08時39分
※参考資料:
http://igarage.cocolog-nifty.com/blog/2020/01/post-8a9ffa.html
Arduinoから「タイマー0」を取り上げる(ユーザーが使う)
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 9日 (金) 08時43分
"wiring.c"の中
(1) volatile unsigned long timer0_overflow_count = 0;
(2) ISR(TIMER0_OVF_vect)で 1.024msサイクルで割り込み
timer0_overflow_count++;
(3) 経過時間の読み出し
unsigned long micros() {
unsigned long m;
uint8_t oldSREG = SREG, t;
cli();
m = timer0_overflow_count;
t = TCNT0;
if ((TIFR0 & _BV(TOV0)) && (t < 255))
m++;
SREG = oldSREG;
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}
(4) 時間関係
clockCyclesPerMicrosecond は F_CPU / 1000000L = 16
1μsで16クロック
return ((m << 8) + t) * (64 / 16));
これは timer0_overflow_countの値を1024倍してる
TCNT0の処理は除いて
(5) 対策:うまくいくかわからんけど
p_gen16c1のタイマー0は2kHz割り込み 500usサイクル
timer0_overflow_countをこの割り込みの中でインクリメントする。
この割り込みの中で
to_cntを +500
to_cntが1024を越えたらtimer0_overflow_countを+1
to_cntを-1024
これでmicorsをごまかせれないか。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 9日 (金) 09時31分
早速のアドバイス有難うございます、イニシャライズの文言がおかしかったらしく、修正したら動きました。
p_gen16cの方です、p_gen16c1の方は試してません、また何かあったら質問させて貰います、有り難うございました。
投稿: まさひろ | 2022年9月 9日 (金) 10時22分
I2Cのタイムアウトチェックを無視した状態で動いたのでしょうね。
p_gen16c1が現在の最新です(便利に)ので。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月 9日 (金) 11時28分
まさひろさん、setup内でのPC4、PC5ポートはどうされました?
現在PCは全部出力。
I2Cで使うとなると、プルアップありの入力にしておくほうが良いでしょう。
wireの初期化でそうなると思いますが、いちおうI2Cの準備ということで。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年9月10日 (土) 09時46分
PORTC = 0b00110000; // data/pull up
DDRC = 0b00001111; // port i/o指定
上記の様にしてます。
投稿: まさひろ | 2022年9月10日 (土) 22時06分