« トラ技CD-ROM 2002年版発掘 | トップページ | 『バーニング・ワイヤー 』 »

2022年8月24日 (水)

パルスジェネレータを作ってみた:箱に入れた

2022年8月5日:Arduino-UNOでパルスジェネレータを作ってみた
2022年8月7日:パルスジェネレータを作ってみた:16MHzクロックを追加
この続きで、完成形に持ってきまして、2台作りました。
  ※前のとは回路が少し違います。

一つは乾電池2本仕様。
バックライト無しの液晶で。
P11_20220824162601
タカチのプラケース「SW-125」。
こんな中味。
P13

二つ目がバックライト付きの液晶なんで、ちょい
電流が増えるので電池を3本に。
P12_20220824162601
ケースは「ダイソ-」で入手。 税込110円。
P14
安く買ったケース、ついつい手抜きで加工精度が
もうひとつ。
液晶の窓部分の寸法が微妙にずれてます。
  ※気にしない、気にしない。
   買ったのはダイソー。
   日本製。東大阪市高井田の「(株)シャルム」
   SAI-20-P8  No.141  181 x 90 x 28mm
   材質:ポリプロピレン

Arduino UNO単体で試すならこんな接続で。
Pa11

箱に入れた回路には、電池電圧低下検出回路も
入れてあります。
電池3本仕様のを図示。
Pa12

さて、これをまとめて製作記事としてトラ技に投稿したの
ですが、記事を出してから、ロータリーエンコーダの入力
部分をちょいと手直しをしました。
原稿では
  「A相の↓エッジパルスをINT0に入れて割り込み
   処理でカウント」
としました。
そのため、ハード的なチャタリング除去回路
(CRを使ったディレー回路)が必要です。
INT0割り込み内の処理でチャタリングを逃げる手当は
しているのですが、激しいのが来ると、カウントを
ミスることがあるのです。
  ※立ち上がりの時に出たチャッタを
   ↓エッジが来たと勘違いすることが
   あった。
Pa13

回路をシンプルにということで、このディレーを
無くして(1000PFのコンデンサだけに)、カウント
処理をタイマー割り込み内に入れてチャタリング
除去を試してみたのです。
タイマー割り込みを2kHzにして4段のシフトレジスタ
のデータ一致で信号の安定を検出します。
この方法↓
2020年9月16日:ロータリーエンコーダーの2相パルスをタイマー割り込みで

今回のスケッチはINT0割り込みじゃなく、タイマー割り込みを
使ったのをアップしておきます。

  ・ダウンロード - p_gen16c.txt
    ※ファイルタイプを.txtにしています。(普通は.ino)

お試し下さい。

※2022-09-03 ちょっと手直し
「SW2長押し」による「duty 50%設定」。
この時も「duty hold」状態になるようにしました。

   ・ダウンロード - p_gen16c1.txt

どっちが使いやすいか・・・
「デューティ50%で使いたいんや」の時、
前のだと、「duty 50%」後に「duty hold」操作、あるいは、
「duty hold」状態で「duty 50%」操作という流れでした。
手直し後は「duty 50%」でそれを維持してくれるという
ことで、ちょい、手間が省けるのではないかと。

duty holdの解除は、
 ・再度SW3を長押し。  あるいは
 ・W:パルス幅設定モードにしてエンコーダを操作。
    Wモードにしただけでは解除しません。
    パルス幅の値を変えた=デューティを変えたぞ
    でholdを解除します。
P:周期設定モードのままだとduty 50%を維持。
   ※周期設定値が奇数だときっちり50%にはな
    りません。

  ※動き、操作の詳細はスケッチを読んでね。
   ミスを発見したり、改善点があれば、コメント
   してください。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※追記 タイマー割り込みでのチャタリング除去処理

まず、INT0割り込みでのカウント処理の様子。
CRフィルタがないと、こんなミスカウントが出ます。
Ww11m
↓エッジだけが欲しいんですが、A相立ち上がりで
発生したチャタリングが悪さをしてミスカウントしています。

拡大
Ww12m
INT0 ↓エッジパルス割り込み処理では、
  ・直後のA相がHならミスなので除外
  ・前回の有効↓より4ms経過してないと除外
という処理を入れているのですが、それを逃れる
パルスが出現しています。
ハード的なローパスフィルタが必要です。

それをタイマー0.5ms割り込みで処理すると、
こんな具合に。
Ww21m
中央にジャギジャギが見えていますが、
  「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 です。




|

« トラ技CD-ROM 2002年版発掘 | トップページ | 『バーニング・ワイヤー 』 »

ツール」カテゴリの記事

Arduino」カテゴリの記事

コメント

これ良いですね。とりあえずスケッチをダウンロードして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分

コメントを書く



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




« トラ技CD-ROM 2002年版発掘 | トップページ | 『バーニング・ワイヤー 』 »