IrDA

2022年7月23日 (土)

周波数つながりで、赤外線受光モジュールのBPF周波数

2022年7月10日:百均屋さんの紫外線LEDランプ
2022年7月7日:「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー
2022年7月8日:手持ちの赤外線リモコン受光モジュールを発掘してみたら・・・
ということで、周波数や波長をあれこれと考えておりました。

発掘した赤外線リモコン受光モジュールが6種類。
このセンサのBPF周波数、つまり赤外線のキャリアー周波数が
どんなものなのかを計ってみました。

通常は「38kHz」。
品種によってはもっと低い周波数や高い周波数が使われると。
そこで・・・
 ・Arduino-UNOをベースに。
 ・22kHz~54kHzの範囲で周波数を可変。
    中心を38kHzにして±16kHz 
 ・この周波数で赤外光LEDを点灯。
    駆動デューティは1/3
 ・駆動するパルスは「8波」。
 ・5msごとに周波数を200Hzステップで
  変えながらパルスを出力。
 ・160ステップなので0.8秒サイクル。
 ・赤外線モジュールからの応答を見れば
  どのあたりの周波数を拾うのか分かる。
 ・けっこう感度が良いので赤外LEDの駆動
  電流をボリュームで絞れるように。
 ・オシロスコープで観察できるように
  周波数スキャンの様子をPWMでD/Aし、
  ノコギリ波にして出力。
 ・シリアルでも出力。
   5msに間に合うよう115.2kBPSに
 ・センサーからの信号を8波パルスをオフする
  タイミングでラッチしてPB2へ出力。

まず、こんな回路。
E3

LED駆動の様子です。
E1_20220723161901
8波の駆動パルスを出して、その応答を見ます。
  反応無しなら「H」。
  反応があれば「L」。

周波数をスキャンして「L」が続くところが、
BPFの中心周波数になると想像できます。

E2

LEDとセンサーをくっつけると全周波数でLになってしまい、
応答周波数が分からなくなってしまいます。
LEDの電流を小さくして、LEDとセンサーをちょっと
離して様子を見ます。
センサーの種類により、ずいぶんと感度が異なります。
応答感度の中央が見れるよう適当に調整。
  ※センサーの出力信号はデジタルなので、
   強弱はわかりません。
   そこで応答周波数の「幅」から、中心を想像します。
  ※センサーをソケットで抜き差しできるよう
   「OUT GND VCC」の順にピンヘッダに
   ハンダしています。

実験の様子
C01_20220723163901

結果。
センサーの写真とオシロ波形。
オシロの上段波形がスキャンしている周波数に比例した
ノコギリ波。
下段がセンサーの応答。 (Lで検出)

【01】
01_20220723162401
B001_20220723162401  

【02】
02_20220723162501
B002_20220723162501

【03】
03_20220723162701
B003_20220723162801

【04】
04
B004_20220723162801

【05】
05
B005_20220723162801

【06】
06
B006_20220723162901

このように6つある中で4つの中心周波数はほぼ「38kHz」。
2つが「低い目」で、「28~32kHz」あたりになっているのが
浮かんできました。

実質、LEDをセンサーに近づけると、フィルタ周波数の
違いに関係なく応答しちゃいそうでので、到達距離を問題に
しない限り、気にしなくて良さそうです。

実行中の様子
D01

割り込み処理の様子
D04

シリアル出力の様子

 22.0kHz 1 1/727
 22.2kHz 1 1/720
   :
 37.8kHz 0 1/423
 38.0kHz 0 1/421
 38.2kHz 0 1/418
   :
 53.8kHz 1 1/297
 54.0kHz 1 1/296

22kHz~54kHzを繰り返す
先頭から、
 LED駆動周波数(8波の)
 センサー応答 0で検出
 周波数を計算する「16MHz/n」のn値

※制御スケッチ ファイルタイプを .ino→ .txtに。
    ・ダウンロード - ir_frq_scan2.txt

・タイマー0をシステムから取り上げて1msタイマー
 割り込み処理。
    ※delayやmillisが使えないので注意
・タイマー1のPWM出力でLED駆動パルスを生成。
・タイマー2のPWM出力でノコギリ波発生用D/Aを出力。

※参考
  ・Atmega328P タイマー/カウンタ1の高速PWM動作




| | コメント (0)

2022年7月 8日 (金)

手持ちの赤外線リモコン受光モジュールを発掘してみたら・・・

「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー
は、ずいぶん古い赤外線リモコン受光モジュールを使いました。
部品箱を発掘してみると、似たようなパーツが出てきました。

Rr1_20220708174001

何かの捨てる機器から取り外して「いつか使うかも!?」で
置いておいたもの。
  ※こんなことしてるからモノが増えるわけで

製作した赤外線リモコンチェッカーで使ったのと同じのが
もう一つありましたんで、シールドケースを開けてみました。

Rr2
ソニーの"CX20106A"が見えています。


※実験
  ・2022年7月23日:周波数つながりで、赤外線受光モジュールのBPF周波数

| | コメント (4)

2022年7月 7日 (木)

シリアル通信ボーレートとクロック周波数

デジタルテスター「FLUKE 87IV」の赤外線通信ユニット完成では
4.9152MHzの水晶を使って9600BPSのボーレートを得ました。

シリアル通信のボーレート、昔々は5単位テレテイプの45.5BPS。
マイコンになって110BPS、そして300BPS。
今は最低が1200BPSでしょうか。
9600BPSまでは2倍飛びで2400、4800BPS。
そして19.2kの中間に、9600を1.5倍した14.4kBPSが入っています。
ここから、両方で2倍飛びの値が使われます。

Arduino-UNOの場合、元クロックが16MHzです。
ボーレートのクロック分周比は、BPS値を16倍した値で16MHzを割る。
あるいは16MHz÷16÷BPS値で求められます

1200BPS~115.2kBPSまでその分周比を見てみると・・・
  ・・・割り切れません。
誤差(%)とともに表にしました。

      |   16.000MHz 
------|-------------
1200 | 833 0.04
2400 | 417 -0.08
4800 | 208 0.16
9600 | 104 0.16
14.4k | 69 0.64
19.2k | 52 0.16
28.8k | 35 -0.79
38.4k | 26 0.16
57.6k | 17 2.12
76.8k | 13 0.16
115.2k| 9 -3.55
↑ ↑
1/n 誤差(%)
   ATmega328のBRR(ボーレートレジスタ)へは
   「n-1」を設定する。

見ての通り、どのボーレートも誤差を含んでいて、
115.2kBPSはけっこう大きな値です。
10bit分で3割り越えですから、ちょっと気になります。
水晶発振子じゃなくセラミック発振子だと、素子が持つ
誤差も加わります。

  ※注:追記
   Arduino-UNOのボーレート設定、通常のX16クロックでは
   なく「X8」の倍速設定(UCSRAのU2Xをオン)が使われています。
   ですので、上の表のn値は2倍の値を設定できるということで
   割り切れなくても、微調できます。
   そして、誤差はおよそ1/2になります。
   115.2kなら16MHz/8/115.2k=17となり、
   結果、誤差は2.12%となります。(それでも大きいぞ)

5V電源での最高速20MHzでも割り切れずに誤差が発生します。

      |    20.000MHz
------|--------------
1200 | 1042 -0.03
2400 | 521 -0.03
4800 | 260 0.16
9600 | 130 0.16
14.4k | 87 -0.22
19.2k | 65 0.16
28.8k | 43 0.94
38.4k | 33 -1.36
57.6k | 22 -1.36
76.8k | 16 1.73
115.2k| 11 -1.36


誤差を生じないボーレートのクロックを作るには
ちょっと中途半端な周波数が必要です。
これらの周波数だと、1200BPSから115.2kBPSまで誤差ゼロ
が実現できます。

      | 7.3728 11.0592 14.7456 18.432
------|------------------------------
1200 | 384 576 768 960
2400 | 192 288 384 480
4800 | 96 144 192 240
9600 | 48 72 96 120
14.4k | 32 48 64 80
19.2k | 24 36 48 60
28.8k | 16 24 32 40
38.4k | 12 18 24 30
57.6k | 8 12 16 20
76.8k | 6 9 12 15
115.2k| 4 6 8 10

FLUKE 87IV - IrDAで使った4.9152MHzだと、
14.4kなどの1.5倍系のボーレートで誤差を生じます。

      | 4.608 4.9152 6.144 9.216 9.8304 19.6608
------|----------------------------------------
1200 | 240 256 320 480 512 1024
2400 | 120 128 160 240 256 512
4800 | 60 64 80 120 128 256
9600 | 30 32 40 60 64 128
14.4k | 20 - - 40 - -
19.2k | 15 16 20 30 32 64
28.8k | 10 - - 20 - -
38.4k | - 8 10 15 16 32
57.6k | 5 - - 10 - -
76.8k | - 4 5 - 8 16
115.2k| - - - 5 - -

  ※「-」は割り切れないことを示す。

   ※9.216MHzは18.432MHzの1/2

高ボーレート(通信速度が速く)になると、送受の割り込み処理時間
が問題になってきます。
115.2kだと1文字が86.8us
誤差のないメインクロックを選んだとしても、クロックを低く
してまうと、他の割込処理との輻輳を見ておかなければなりません。
送信は待ってくれますが、受信が間に合わないと文字抜けが生じ
ます。
マイコンの能力に見合ったボーレートを選ぶということで。

もうひとつ。
制御系で欲しいのがきっちりの「1ms」タイマー
割り切れるボーレート設定値と内部のタイマー設定値。
18.432MHzが魔法の数字のように思えてきます。
  ボーレートはOK。
  1msは18.432MHz ÷ 256 ÷ 72で1kHz。
  あるいは18.432MHz ÷ 1024 ÷ 18で1kHz。

この周波数、TK-80のクロックでした。
  ・2018年6月6日:マイコンのリセット回路
8224:クロックジェネレータICにつながってる
水晶がそれです。
これを9分周した2.048MHzが8080マイコンの動作周波数でした。

※追記
今までのAVRマイコンでは「分周比=16MHz÷16÷BPS値」
という計算で、分周比を求めていましたが、新しいAVRマイコン
では分周比に小数(例えば6bit分)が使えるようになっています。
結果的に分周比の計算は「16MHz×4÷BPS値」となり、
細かな設定ができるように考えられています。

| | コメント (0)

「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー

ダイソーの「糸ようじ」。
以前、この空きケースを使って回路を組み込んだのがこれ。
 ・2021年3月23日:中波振幅変調電波発生回路 いわゆるAMワイヤレスマイク

今回はこのケースに組み込んだ「赤外線リモコンチェッカ-」を紹介
しておきます。
文鎮:ハンダ付け補助ツール 製作元の佐藤テック君が、
「リモコンの調子が悪い! 見て!」っと、赤外線リモコンを
持ってきました。
デジタルカメラや携帯電話のカメラでリモコンの赤外LEDを
見れば発光しているかどうかが分かります。
電池の消耗のように簡単な時はこれで十分なんですが、
今回は「動くときもある。」という不安定な状態とのこと。
こうなると「おもちゃ病院」案件
赤外線リモコンのチェッカー、こんなのを作ってあります。
赤外線を受けたら音を出す!というシンプルなものです。
  ※手書きだった回路図をまとめておきました。

Cd1_20220708091701
 
制御コードを液晶表示するというツールも昔々に
作ってあるのですが、発光しているかどうかをチェック
するには「音で聞く」のが一番手軽。
  ※オシロでの波形観察は、もっと複雑怪奇
   なトラブルに遭遇したときでしょうか。

「糸ようじ」のケース、「タダでもらったもの!」ということで、
ケース加工の気が楽です。
  ※エエかげんでエエやンっと。
   ホットボンドで部品をくっつけて、中ぶらりんの
   配線もok。 (短絡さえしなければ)

Cc12_20220707131901

Cc13

Cc14

赤外線の受光ユニットはジャンク箱からの発掘品。
シールドケースの中を見るとソニーの「CX20106A」という
ICが入っていました。

こんな音が出ます。
https://www.youtube.com/watch?v=8j62ooOGqG8
  ※リモコンが出す赤外光も写っています

※「SONY CX20106A」で検索したら
「共立」で似たようなユニットを発見。
https://eleshop.jp/shop/g/gL4541H/
  外形とピン位置が異なりますが、シリーズもの
  なんでしょう。
  今ふうの赤外線受光ユニット、使用可能な
  電源電圧が広くなってますが、この発掘品は
  5Vでした。 電圧が低くなると動作せず。
  電池2本で動かしたかったので、HT7750Aを
  持ち出してきたという次第。
  すると・・・電源ノイズがぁぁ。

| | コメント (0)

2022年7月 6日 (水)

デジタルテスター「FLUKE 87IV」の赤外線通信ユニット完成

2022年6月29日:デジタルテスター「FLUKE 87IV」の赤外線通信
で、「こりゃ作らなあかんなぁ~」と思い立った
IrDAによるデータ吸い上げユニット」、できました。

こんな回路です。
Ab1_20220706153701

秋月のIrDAモジュール:AE-RPM851A  と
USBシリアル変換モジュール:AE-CH340E-TYPEC
それに 「MCP2122」と 「ATTINY841」 マイコン。

クロックは水晶発振子。
通信速度が9600BPSだけということで、4.9152MHz。
  16MHzで動いているArduino-UNOの処理速度、
  けっこう速く感じますが、4.9152MHzだと
  「ちょっと遅いな~」っという感じがします。

小さなプラケース(ダイソーで入手したけど、もう売ってない)
に入れました。
Ab22
赤外線部は穴をあけなくてもプラケースを通してやりとり
できています。
50cmほど離しても大丈夫。
  でも、1mは届きません。

Ab21

電源はUSBから供給。
PCを起動しなくてもSDカードでシリアルデータロガー
が使えるように、TTLレベルでも出力しています。

通信している間は、テスターのオートパワーオフは延長されていて
勝手に電源が切れるということはありませんでした。

・起動メッセージ タイトル表示
 # FLUKE model 87IV IrDA com reader
 # Op-key       (2022-07-05)
 # 1 : Start measure  ←PCでのキー操作は0,1,2の3つ
 # 2 : Stop
 # 0 : Clear cyc counter
 # FLUKE 87, V1.01,75530000 ←IDコマンドで機種名取得
   0 +0.0576 V AC  ←勝手にデータ取得開始
   1 +0.0576 V AC
   2 +0.0576 V AC  ←1秒サイクルで読み出し
   3 +0.0576 V AC
   4 +0.0576 V AC
 # Stop.  ←「2」キーで停止
 # Start.  ←「1」キーで再開
   12 +0.0575 V AC  ←停止中もサイクル秒値を進めてる
   13 +0.0575 V AC
   14 +0.0575 V AC
 # Clr cyc.  ←「0」キーでサイクル秒値をクリア
   0 +0.0576 V AC ←測定は継続
   1 +0.0576 V AC
   2 +0.0576 V AC
 # Stop.     ←停止
 # Clr & Start.  ←クリアして測定再開
   0 +0.0577 V AC
   1 +0.0578 V AC
   2 +0.0578 V AC
   3 +0.0578 V AC
   4 +0.0578 V AC
   5 +0.0708 mV AC ←途中でレンジを変えている
   6 +30.080 mV AC
   7 +24.909 mV AC
   8 +40.721 mV AC
   9 + Out of range. V DC ←オーバーレンジの表示
   10 +0.0000 V DC
   11 +0.0000 V DC
   12 +0.0000 V DC
   13 +0.0000 mV DC
   14 +00.022 mV DC
   15 +00.023 mV DC
   16 +00.023 mOhms
   17 + Out of range. kOhms
   18 + Out of range. MOhms ←抵抗レンジ オープンだ
   19 + Out of range. MOhms
   20 +01.474 mV DC
   21 +01.758 mV DC
   22 +0.0008 V DC
   23 +0.0008 mV AC
   24 +40.148 mV AC
 # Err  ←通信遮断でエラー表示
   41 + Out of range. mV AC ←通信回復で自動的に測定再開
   42 +43.682 mV AC  ←サイクル秒値を見ればエラーが
   43 +43.174 mV AC   生じていた時間が分かる
 
・起動直後、テスターとの通信
   赤外線でやりとりできるか?
   機番を読めるか? をチェック
(太字がテスターからの応答)
<CR> 「0x0d」を送って応答を見る。
 1
<CR>  4回実行
 1
<CR>
 1
<CR>
 1
ID<CR>  「ID」コマンドを送って機番を待つ
 0
 FLUKE 87, V1.01,75530000
QM<CR>  測定開始「QM」コマンドでデータ要求
 0
 QM,+0.0434 V AC
QM<CR>
 0
 QM,+0.0435 V AC
QM<CR>
 0
 QM,+0.0435 V AC
    応答文字の「0」と「QM,」を除いてから、
   測定データとしてPCに送信しています。
起動直後あるいは測定中に、テスターとの通信が失敗しても
1秒ごとに「QM」コマンドを送っています。
テスターから応答が返ってくればそこから自動的に測定が
再開されます。

※制御プログラム
  Atmel studio 7.0を使いました。
  ソースは「main.c」1本。
  関連ファイルといっしょに圧縮しています。
    ダウンロード - fluke87_irda_tn841.zip

  割り込み処理しているのは2つのシリアル送受だけ。
  タイマーはフラグを見ています。
  メインの中でタイムアップをチェックして計時処理。

| | コメント (0)

2022年6月29日 (水)

デジタルテスター「FLUKE 87IV」の赤外線通信

IrDA絡みでひょんなことから見つけたFLUKEのデジタルテスター
model 87IVの赤外線通信

このテスターを買って22年ぶりの快挙!
こりゃ、使えそうです。

まず、資料。
 ・EEVblog Electronics Community Forum ≫Fluke 87IV please whisper in my IR
この中で通信コマンドが記された資料が示されていました。
 ・http://www.pewa.de/DATENBLATT/DBL_FL_FL187-9-89IV_BEFEHLSSATZ_ENGLISCH.PDF
   ※これが見つかったから試せたわけで!

こちらでは、こんな具合に対向させて通信してみました。
F10
テスター側の赤外線ポートは頭。
楕円形の黒い窓です。

記事内の写真、テスター内部見ますと、TIの「UART←→IrDA」
インターフェースIC「TIR1000」が写っています。
  ※このIC、昔からあったんですな。

この↓記事でテスターをバラして中を見ています。
 ・2018年3月19日:FLUKE 87IV、切り替えダイヤルが回らない!
よく見ると・・・
IrDAモジュールとTIR1000が写っています。
当時の写真を引っ張り出してきました。
F11_20220629091901
「HPL837」。 この下側がボディの「窓」。

F12

右隣は発振器かなぁ。
「FPX7?37」と読めます。

※検索で
  ・マルチメーターの歴史

※桁数表記「3・1/2桁」について
フルークのデジタルテスターをあれこれ検索していたら、
このページ、
  ・デジタルマルチメータの基礎と概要 (第1回) 「DMMの歴史と変遷」
に「桁数表記」の話が出てます。

~~~~~~~~~~~~~~~~~~~~~~~~~
  参考ですが、DMMの桁数について触れます。
  前述したように、DMMはハンドヘルドタイプの
  3.5桁からベンチトップの8.5桁のものまで多種
  多彩です。
  最大の数値表示が、1999のものも4000のものも、
  3.5桁や3-1/2などの呼び方をしますが、正確を
  期す(底数10の対数で解く)と、
    1999表示は3.3桁、
    4000表示は3.6桁、
    6000表示は3.8桁、
    9999表示でフル4桁
  ということになります。
  しかし、この表現は、一般的にはあまり
  使われていないようです。
~~~~~~~~~~~~~~~~~~~~~~~~~

log 1999」は「3.3008…」。 確かに3.3桁っぽいです。
しかし、「1999」表示のテスターは、「0~+1999」
じゃなくマイナス側も含めて「-1999~+1999」を
表示してくれます。
ということで、正の値だけでlog変換して桁数を
出すのは間違っているような。

※過去記事
  ・2011年01月31日:1/2桁とは
  ・2011年08月10日:1/2桁とは 「セグメント説」


| | コメント (2)

2022年6月28日 (火)

「UART←→IrDA」変換IC、MCP2122のクロック供給 #3 トラブル遭遇!

記事
「UART←→IrDA」変換IC、MCP2122のクロック供給 #2
への6月27日のコメントで書いたのですが、MCP2122のリセットが
もうひとつ不安定なのです。

↑の記事で公開した制御ソフトでは、
 ・MCP2122のリセット入力はプルダウン。
 ・電源投入
 ・クロック発生用マイコンが起動するまでは
  プルダウンの働きでリセットはLレベルを維持。
 ・マイコン起動でクロック発生。
 ・その後、リセット端子をHにしてリセット解除。

これでうまく行くはずなんですが、リセット解除後、
受信パルスが復調されない(RXDが出力されない)状態
になってしまうのです。
  ※うまく行くときもある。
  ※再リセットしたら動き始める。

で、あれこれ動きを調べてみました。
  ※結果を先に。
リセット端子の抵抗、プルダウンではなくプルアップ
するとうまく行くようだ。

ということは、
 ・電源オン
 ・マイコンのリセット期間中はプルアップなので
  リセット端子がHに。
 ・リセット終了後、クロック発生とともに
  ポートの初期化でリセット端子はLに。
 ・しばらくしてリセットをHにして解除。

MCP2122のリセット入力をいったんHにして
からL(リセット状態)に。
その後、Hにしてリセットを解除。
するとうまいこと動き始めるのです。

あれこれ試した回路がこれらです。

Bc1
リセットのためのLレベルの遅延を行うより、
プルアップ抵抗1本だけのほうが、動く率が
高いのです。

通常のCR遅延や電圧検出ICを使ったリセット回路は
あきません。
こういった回路では、電源オン後にリセット端子を
GNDに落としてリセット操作しないと、まともに動き
ませんでした。

さて、いったい何なんでしょ。
電源はUSBのコネクタから供給していますので、
物理的なコネクタの差し込み操作で電源が入ります。
このあたりが、悪さをしてるのでしょうか?

※こんな回路にしました。
Bec2
  ※前のとの違いは「R2」。

クロック発生にマイコンを使ていましたので、リセット
信号の発生は自由にできます。

普通なら「L→H」で負論理のリセット状態から
Hにするとリセット解除となります。
  ※リセットって普通、これ。
   リセットICもこの動作。

それが、「L→H」といったんリセット解除してから
もう一度「L→H」とパルスを与えるようにしなければ
ならないようなのです。
  ※このHパルス、Lパルスの時間も関係するようで
   短いとダメでした。

---リセットのタイミング---

※プルアップ抵抗を使って
Bc4

※プルダウンしたた時のために、「L→H」パルスを追加
Bc5

※これでデジタルテスター「FLUKE 87IV」と赤外線
 通信できました。
赤外線でコマンドを送れば、切り替えダイヤルで設定した
レンジでのデータを送り返してくれます。
こんな感じ

送:ID<cr>
受:0
受:FLUKE 87, V1.01,7xxxxx   xxxは製品番号

送:QM<cr>
受:0
受:QM,-00.017 mV DC

50cmくらい離しても大丈夫な様子。
「QM」送出を繰り返せば、データをログできます。


※うまくいくリセットタイミング
Ba002

※プルダウン抵抗だとLが連続してダメ。
Ba001
  リセットL時間を変えてもダメ。
  クロックの供給タイミングを後にしてもダメ。

※単純には、あれこれするより、プルアップ抵抗だけの
 ほうがうまくいった。
Ba003
  クロック供給開始直後、1bitだけのLパルスが出現。

※製作した回路
Fa1
ダイソーで売ってた小さなプラケースに入るように。
あれこれ試すのに、ジャンパーピンを付けてます。

赤外線は半透明のケースを通り抜けるようで、
IrDAモジュールのところに穴は開けてません。
Fa2


※参考メモ ATtiny25やATtiny85のISP接続。
Bc6
Fa3
Fa4
ターゲット回路のICソケットに差し込んで、
インサーキットプログラムできるようにする
ためのアダプタ。



| | コメント (0)

2022年6月27日 (月)

「UART←→IrDA」変換IC、MCP2122を検索すると

「MCP2122」を検索すると、こんな出来合いの回路が
出てきます。
本家、マイクロチップのデモ基板。
 ・MCP212XEV-DB MCP212X DEVELOPER'S DAUGHTER BOARD
 ・MCP212XDM MCP2120/22 DEVELOPER'S BOARD

実験用アダプタ基板。
 ・MCP2122 INFRARED ENCODER/DECODER
 ・MIKROE-2871

どちらも通信ボーレートは115.2kBPS固定。

TIR1000」のは見つかりませんね。
でもこんなのが。
 ・https://www.eevblog.com/forum/testgear/fluke-87iv-please-whisper-in-my-ir-p/

フルークのテスターの改造記事。
FLUKE-87IV」といや、使ってるぞい!
 ・2018年3月19日:FLUKE 87IV、切り替えダイヤルが回らない!
 ・2019年6月27日:FLUKE 87IV、抵抗レンジが安定しない

| | コメント (0)

2022年6月24日 (金)

「UART←→IrDA」変換IC、MCP2122のクロック供給 #2

MCP2122のクロック供給(ボーレートの16倍の周波数)、8ピン・マイコンで
処理しようとすると、こんな感じかな。

まず、外部発振子が使える「ATtiny25~85」。
Cal20
「4.9152MHz」の発振子から素直に153.6kHzが作れます。
水晶でもセラロックでもOKというところ。

内部クロックしかダメな「ATtiny13A」の場合、
「工場出荷」状態のクロック精度が「10%」。
Cal12
ちょっときびしい。

ATtiny13Aだと、OSCCAL値を変えることでクロック周波数が
変化します。
Cal11
代表特性だと、9.6MHzで90くらいでしょうか。
  ※しかし、これがけっこう変動

そこで・・・まず問題。
9.6MHzから153.6kHzを出したいんだけれど・・・割り切れない。
クロック 9.6MHz÷153.6kHz = 62.5
デューティ50%の方形波駆動なのでタイマーの設定は1/62。
  9.6MHz÷62 = 154.839kHz
解決方法として、内蔵クロックを9.6MHzにするのではなく、
  153.6kHz × 62 = 9.5232MHz
  153.6kHz × 64 = 9.8304MHz
に調整すると1/62あるいは1/64で誤差が出なくなる
分周比が使えるようになります。
  9.8304MHzはATtiny25で図示した
  4.9152MHzの倍の周波数。

問題はこの校正方法。
こんな回路にしてみました。
Cal21
小さい字で書いていますが、
TP2に「1kHzパルス」を入れ込んでリセットしたら、
1kHzの周期を数えてそこから9.8304MHz近傍の
OSCCAL値を出そうという試み。
結果は内蔵フラッシュROMに自分書きして保存。
ATtiny13Aでの「Self-programming」は初体験。
  ※何かいけないようなことをしている気分・・・
EEPROMでも良かったのですが、
  プログラムの中に置いたデータを書き換えるのは
  どうすれば?
  ATtiny13AのSPM命令、どう使うんだ?
  SPMCSRレジスタ、制御の手順は?
の検証です。
ATtiny13AのROMメモリーは、わずかに1kバイト。
制御はとうぜんですが、アセンブラー。
  なかなか楽しい。

※ATtiny13A制御のソースファイル(圧縮)
  ・ダウンロード - irda_x16_1.zip
ちょっと手直しして↓
  ・ダウンロード - irda_x16_1a.zip

※ATtiny25を使う場合 (XTAL必要)
  ・ダウンロード - irda_tn25_1.zip

     ご自由にどうぞ。

・ヒューズの設定はソースファイル内に記しています。
   正しく設定しないと動きません。

・ATtiny25だとプログラムはわずか58バイト。
 RAMエリアの初期化ルーチンもありません。

・AVRマイコン・ATtiny13Aのフラッシュメモリ
 「自己プログラミング」の例題になるかと思います。
 この時しか使わない「AVRマイコンのSPM命令」
 その使い方のサンプルにどうぞ。
 アセンブラで書けばマイコンへ命令している
 様子がよくわかるかと。
 「C」はいろんな関数があって便利なんですが、
 あれこれ余計にところ(いろんなマイコンに対応)まで
 記述されていて「ほんまはどう動いてんねん!?」が
 隠れてしまうことがありますんで、困ったものです。

そうそう。「自己プログラミング」する時は
  AVRマイコンのSUT、BODヒューズ
の中の「SELFPRGEN」ヒューズを「許可=0に」しなくちゃ
いけません。

※1kHzクロックパルス供給によるOSCCALの校正実行
校正処理、こんなタイミングです。
2秒ほどで終了。
Cal11_20220625113301
OSCCALに設定する値を0から順に+1。(maxは127)
その時の1kHz↓エッジパルス間隔をソフトのループでカウント。
目標9.8304MHzと処理サイクル数から欲しいカウント値を
越えたところで停止。
今のと直前のカウント値を見て、どちらのOSCCAL設定を
使うかを決めています。
オシロ波形、PB4に出してる確認パルスを数えれば、
どれだけOSCCALを変えたかが分かります。
その値をフラッシュROMに記録(自己プログラミング)して、
次回の起動はその値を使ってという流れになります。
  フラッシュROMの空きには、そのあたりの
  情報も書いてますんで、読み出せば校正の結果が
  見えます。

※実験(デバッグ)してる様子
12_20220625155501
SOPのATtiny13Aを4つ用意して(DIP変換基板にハンダ)
あれこれと。

※ATtiny13Aでの校正値の取得方法
 MCP2122への供給クロックは153.6kHz。
 153.6kHz* 64 = 9.8304MHz。←これに合わせ込む

(1) OSCCALを0から順に+1。 maxは127。
(2) INT0入力1kHzパルスの↓エッジ間の時間を
  ループカンタで計測。
(3) 目標の「9.8304MHz」は1msで=9830クロック。
  そして、ループのサイクル数が7。
(4) 9830/7で「1404」が判定するカウント値。
(5) この値と同じか大きくなったらOCSCALの
  インクリメントを停止。
(6) 直前のカウント値と停止したカウント値、
  どちらが「1404」に近いかを判断して、
  どちらのOSCCALを使うか(今のか直前のか)
  を判断。
(7) 結果をフラッシュROM(0x01F0~0x01FF)に残す。

・フラッシュROMに残すデータ(wordで示す)

0x01F0: 1kHz校正データ これをOSCCALとして使う。(a)
    CNT_H検出時のOSCCALデータ。
0x01F1: 工場出荷時のOSCCALLデータ。
    0x00
0x01F2: 1kHzチェックカウンタ L側。
    カウント越え直前のカウント値
0x01F3: 1kHzチェックカウンタ H側。
    1404カウントを越えた時のカウント値

   ※欲しいのは(a)のデータだけ。
    あとはチェック用。

・校正例 チップ#2
工場出荷時のOSCCAL値    65
工場出荷時OSCCALでの周波数 149.9kHz
校正後のOSCCAL       67
校正後の周波数       153.1kHz
直前のカウント値      1397 ←1404に近い
直前のOSCCAL値       67  これを使う
検出カウント値       1413
検出OSCCAL値        68

・チップ#4
工場出荷時のOSCCAL値    77
工場出荷時OSCCALでの周波数 142.0kHz
校正後のOSCCAL       84
校正後の周波数       153.3kHz
直前のカウント値      1392
直前のOSCCAL値       83
検出カウント値       1407 ←1404に近い
検出のOSCCAL値       84  これを使う

 

| | コメント (1)

2022年6月20日 (月)

「UART←→IrDA」変換IC、MCP2122のクロック供給

秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す)
では、MCP2122へのクロック供給(ボーレートの1/16の周波数)
に「74HC4060:14bit バイナリカウンタ」を使いました。
「4060」の前段には発振回路を構成できるゲートが
仕込まれているので、4000番C-MOSの頃から、便利に
使っています。

  ※時計用の32.768kHz水晶から2Hzを取り出せますので
    (1Hzを出すには残念ながら1bit不足)
   計時用パルスを得るのに便利です。

秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2
この時は、Arduino-UNOのタイマー2:OC2Aからクロックを供給。
Atmega-328Pの内部レジスタを直触りして「16MHz / 104」の
方形波を得ています。

Arduinoで用意された関数では、この手の「ハード直いじり」は
できません。
近いところは「tone()」ですが、
  Arduino-UNOでtone()の挙動を調べる

↑このようにソフトでパルスを出していますので、安定した
方形波は出てきません。(高い周波数も無理)


【余談】
AVRマイコンで覚えておいて欲しいテクニック
AVRマイコンの出力ポート、
  ポート入力レジスタに1を書くと出力がトグルする
という機能があるのです。

いわゆるLチカ。 代表はこれでしょか。
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay( 1000 );
  digitalWrite(LED_PIN, LOW);
  delay( 1000 );
}

delay()を使わず、あるタイミングで点滅させると
なると、こんな感じ。
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));

LEDがつながったピンのH/Lを読んで、それを反転出力する
というまっとうな方法です。
  ※負荷が重くって(電流の流し過ぎ)ポート入力の
   H/L読み出しをミスると、誤作動。

そして、レジスタの直書きを許容すると、
  PORTB ^= (1 << PB5); // LEDはPB5
となります。
これは、
  出力ポートの状態を読んで
  特定ビットをXORで反転
  出力ポートに書きもどし
と、3つの命令に分けて処理します。
  ※AVRマイコン、I/Oレジスタのビット反転を
   1命令で行う命令を持っていないので。
ということは、割り込み処理と競合するポートなら
「アトミック操作」(割込禁止、割込再開)の手順が
不可欠です。

さて、ここからが覚えておいて欲しい内容。
AVRマイコンのデータシート、「I/Oポート」のところを
読むと「Toggling the Pin」という項目をが見つかります。
「PINレジスタに1を書くと、ピンの出力がトグルする」
と解説されています。

PINレジスタはポートの入力レジスタ。
それへの書き込みなんで違和感がありますが、AVRマイコン
特有の機能です。

SBI命令が使えるので「2クロック」で処理ができます。
割り込みとの競合も無関係。

LEDの点滅だと、
  PINB |= (1 << PB5); // LEDはPB5

コンパイラはこんなアセンブラの命令を出します。
  SBI PINB,5  // PINBのbit5をセットせよ

ポートの反転が1命令でできるのです。

さて、今回の本題。
「UART←→IrDA」変換IC、MCP2122のクロック供給を
どうしたものか・・・

・74HC4060を使うとシンプルだが、MCP2122のリセット
 操作に電源電圧検出ICがいる。
・8ピンのマイコンを使ってクロック供給してもOKだが
 マイコン内蔵のクロックの精度だとちょい不安。
・クロック精度はせめてセラミック発振子級で。
  もちろん水晶でもOK。
・マイコンを使ったら、マイコン内蔵の電源電圧低下
 検出が使えてリセットICが不要になる。

AVRマイコンにしろPICマイコンにしろ、
 ・外付け水晶(セラミック発振子)が使用可能。
 ・内蔵タイマーから直接方形波を出力するポートがある。
 ・電源電圧低下検出機能(BOD)あり。
という条件かと。

電波リモコンTele Auto FX-1修理:300kHzセラロック発振子がアウト
ここではATtiny13Aの内蔵クロックを利用しました。
  ※単品の修理だし、精度はあまり要求されなかったから

マイコンの内蔵クロック、その周波数を微調できる機能を
持っているものがあります。
昔々、「内蔵クロック周波数の自動補正」を試したことが
ありました。
  ・クロック周波数を読む。
    (特定ポートに出すパルスの)
  ・許容範囲外なら発振周波数補正値をちょいと
   触って、フラッシュROMを再書き込み。
  ・周波数の動き具合を見て補正値を増減。
こんなことを試したことがあります。
しかし・・・
電源電圧や温度での周波数変動を考えると、
「発振子を使うほうが間違いないでぇ」となって、
やめちゃいました。

今回のクロック供給、さて、どうしたものかと・・・

MCP2122は8ピンのICですが、シリーズのMCP2120(14pin)
だと、発振回路が内蔵されています。
ボーレートに合った水晶をつなげばOK。
9600BPSなら3.6848MHzあるいは7.3728MHz
  ※ボーレートの384倍あるいは768倍を切り替え
このICだと発振回路の心配はなくなります。
  ※リセット回路は必要


| | コメント (1)