重箱の隅

2024年5月31日 (金)

リターンパスの無いオペアンプ入力回路

非反転アンプ 3kΩと27kΩの抵抗
この記事↑では、ゲイン選択ジャンパを外したらどう
なるの?をコメントしましたが、オペアンプの入力
バイアス電流の戻り場所はむちゃ重要です。
  解説記事などでこれを忘れている回路を
  見かけるのです。

ADI Analog Dialogue:アンプ回路設計時の問題を回避するには
ここで↑、詳しく述べられています。

最近だと、コテ先温度を読みたいゾ う~む
熱電対についての記事(昔のトラ技)を調べて
いて、こんな回路を見つけました。

  トランジスタ技術2006年10月号p.244~
   白金測温抵抗体と熱電対の正しい使いかた(後編)
   正確な温度計測のために 【田澤 勇夫】
     (p.249 図18)
Tc11

  ※FET入力OP-AMPなんで、どこかからの
   リークでバイアス電流が流れそうで
   すが・・・ダメです

冷接点補償用の白金測温体のところはちゃんと
してあるのに、ちょっと不思議。
簡単には熱電対の片っぽをGNDつなぎでエエやんと。

※参
トランジスタ技術2012年1月号:計装アンプにもバイアス電流のリターンパスを設けるべし

・AD8253データーシート
Tc12


電子工作実験室 :電位差測定器(電気化学)
  リターンパスについての議論


| | コメント (0)

2024年5月13日 (月)

サーミスタでの温度測定、「inf」の出現に耐えられるか?

2023年3月21日:A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?
で問題にしましたが、A/D入力するサーミスタをつなぐ位置が重要です。
A02_20230321164901
サーミスタを電源側につなぐと、
  温度の上昇でサーミスタの抵抗値が減少
  それに連れてA/D値が上昇
となり、温度が上がるとA/D値も上がり、感覚的に
合うのでしょう。

・A/D値からサーミスタの抵抗値の計算式
A3_20230321165401

このサンプルとして
  ・おもろ家さんのArduino 入門 Lesson 18 【サーミスタ編】
のスケッチ使わせてもらいます。
おもろ家さんの「つなぎ」でもサーミスタは電源側。
基準抵抗がGND側です。

この時の問題点をお復習い。
  (a)サーミスタの接続線が短絡したら
  (b)サーミスタが外れてオープンになったら

まず(a)。
A/D値はフルスケールの「1023」に。
その結果、サーミスタの抵抗値は
  (1024÷1023 - 1) ×10kΩ
となり、約9.8Ω
B定数による温度計算に進むと352℃という
値が出てきます。

次に(b)
A/D値は「ゼロ」になり、サーミスタの抵抗値計算で
ゼロ除算」が生じます。
その結果、抵抗値は「無限大」。
続く、温度計算では「ケルビン温度」の「-273.15℃」が
出てきます。
  ※Arduino UNOの環境ではゼロ除算では
   止まらず、とりあえず計算は進みます。

実際の液晶表示を見てみましょう。

(a)のサーミスタ短絡
T10_20240513111101

(b)のサーミスタ断線
T11_20240513111201

抵抗値の箇所に「inf」という見慣れない「値」が出現します。
  ※inf=無限大
   print()やdtostrf()に食わせると「inf」
   という「文字」が出てきます。
   lround()で整数変換すると0x80000000
   (long値のマイナス目一杯)になって
   しまいます。

サーミスタで温度制御していたら、
  (1)いつまでたってもオンしない (a)のとき
  (2)いつまでたってもオフしない (b)のとき
状態が出現します。

(1)は、放っておいてもとりあえず周囲温度に馴染む
でしょうが(2)の状態が加熱しっぱなしとなり危険です。

何らかの警報的処置(表示だけでも)が必要に
なるのがわかっていただけるかと。

トランジスタ技術2024年6月号トラ技Jr.コーナ
掲載してもらった4チャンネル温度計の製作 では、
温度・抵抗値テーブルから最高値(温度低)と最低値
(温度高)を拾ってきて、値として規制するように
しました。
  ※プログラムエリアがあんましないので
   手抜き。
オープンだと「-20.0℃」、短絡だと「120.0℃」を
出力します。

| | コメント (0)

2024年4月12日 (金)

I2C液晶のアクセス、割り込みで処理しないようにすると

I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの

I2C液晶の処理と高レートのタイマー割り込みとの競合、
その原因がI2C液晶アクセスでの割り込み処理だという
ことがわかりました。

I2Cアクセスでの最後、I2Cバスを待機状態に戻す
「ストップコンディション」の処理に時間待ちが
入れられていました。
  割り込み処理の中での時間待ちはちょっとなぁ。
そのせいで、こんな具合に抜けや遅れが出たのです。
Aa004

Aa000_20240408135301

そこで、I2C液晶の表示ルーチンを割り込みを使わない方法で
書いてみました。
   詳細(スケッチ例)は、また報告します。

普通は液晶アクセスでの遅れなんて問題にしないでしょうが、
特殊な場合はアカンでぇ!ということで、その解決方法の
一例と見てください。

10μ秒割り込みルーチンの抜けや遅れが無くなりました。
Ff000
Ff001
Ff002

割り込みを使うことで処理が早くなったり便利(次の処理に
早く移れる)になるんなら良いのですが、現状の液晶表示
手順の場合は、割り込み処理にするメリットがありません。

I2Cでの割り込み処理、I2Cアクセスでのエラーが生じた時に
対応しやすいという面は否定しません。
でも、液晶表示の場合はエラーが生じても、一連の表示ルーチン
さえ抜ければ次に進めるという処理でかまわないでしょう。
  ロックせずに「STOP」まで進めれば、なんとかなるかと。

I2Cでのエラー解除、本来はSDA=Hの状態(マスター側がHにする
つもりで)でダミークロックを流し込むという手法を使います。
  ※昔のI2C解説本ではよく見たけれど
現状、そういった処理はしていませんので、せっかくの割り込みが
生かされていません。

I2C簡単そうだけどトラブったときの対策、けっこうやっかいです。
  ノイズが多い環境でスカタンしたら
  そのリカバリーがたいへんなんです。
昔々、マイコンに搭載されたI2C機能を使うのが面倒くさくって、
H/Lパルスを自分で出してI2Cを制御したこともありました。
エラー発生時の手順が自由になりますので。

※参考
ROHMのBR24Lxxx EEPROMデータシートより
https://fscdn.rohm.com/jp/products/databook/datasheet/ic/memory/eeprom/br24lxxx-w-j.pdf

・基本のタイミング
Ep11
・リセット方法
Ep12
・コマンドのキャンセル
   SCLをHにしてSDAをL・H
Ep13

※テストプログラムをアップしておきます。
  ・ダウンロード - test_i2c_lcd_acm0802_2b.zip

ちなみに、超低速2相パルス発生回路 のI2C液晶表示を
wireライブラリを使わないようにしたら(wireの中からtwi
を呼んでいる)、プログラムのサイズが1.8kバイトほど減少。
RAMエリアも200バイトほど減りました。
単一の液晶表示のように、単純に「書くだけ」だとずいぶん
処理が簡単になるというのが理由かと。



| | コメント (0)

2024年4月 7日 (日)

トラ技2024年5月号に「3.3/65535」

トランジスタ技術の最新号、2024年5月号を
パラパラめくりしていたら、p.70のリスト1に
怪しい記述を発見。
A/D値から電圧値を計算するための定数を出す
のに「3.3/65535」と。

Pp21
65536と65535の差はほんの僅か。

でも、リストの7行目のPID演算のところで、
6桁の数値が出ているんで、5桁数値の最小桁で
の1違いは大きくないかいなとちょいと心配。

電源電圧「3.3V」も、「ほんまかいな」だし。

元データはA/D値のまま使い、「CAL(校正)したらこうなった」
にして、「浮動小数点化したmap関数」を使って線形補間して
答えを出すてなほうが「理にかなっている」ような気がします。

ラズピコだと1/65535が出現:トラ技2022年5月

※検索
ラズパイマガジン2022年12月12日の訂正
   ・・・本文中の「1023」は「1024」、図2下の式の
  「4095」は「4096」の誤りです。
   ・・・Raspberry Piのところで分割数が「4095」と
  あるのは「4096」の誤り、Raspberry Pi Picoでは
  「65535」が「65536」、micro:bitとArduinoでは
  「1023」が「1024」の誤りでした。
訂正が出ています。

 

| | コメント (2)

I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの

超低速2相パルス発生回路・ケース入れでの処理遅れ、
I2Cの処理をしているソース「twi.c」をざっと追いか
けてみると、

・TWI(I2C)の割り込み処理
  ISR(TWI_vect)
 この中にtwi_stop()というルーチンが出てくる。

・twi_stop()の処理を見ると、
  _delay_us(10); という時間待ちがある。
     ※実際にこれが動いているのかどうかは不明

・_delay_us()がどこにあるのか探してみると
  util\delay.hの中
・関数のヘッダは void _delay_us(double __us)
  「double __us」って何よ。

・もし、_delay_us(10)で10us遅らせているとしたら、
 オシロでの観察結果と合っている気がする。

割り込み処理の中では時間待ちはするなぁ~
  っと叫びたくなるゾ!

※追記
波形観察できるよう、簡単にテスト。
・タイマー0を停止
   じゃまされないよう
・タイマー1で10us割り込みを作る
   割り込み期間、Hパルスを出力
・I2C液晶を使い1秒間隔で2文字を表示
   カーソル位置指定+2文字書込みの3データ
・10usパルスはいつも見えるはず
・I2Cの割り込みと重なった時にズレが出る

ところが・・・そのズレの量が大。
I2Cのストップコンディションと重なった部分の
割り込みパルスが1つ消失して、その後の1つ
が遅れて出現しました。

Aa000_20240408135301
終端部を拡大 (時間経過でSDA波形が↑のと異なります)
Aa004

I2C(TWI)の割り込みが悪さをしてるとしか考えられない。
割り込みを使わないでI2Cを処理するプログラムを
書かないといけないなぁ。
マスターだけならそんなに難しくないけどついつい
ライブラリを頼ってしまうんで。

もう一度言います!
  『割り込み処理の中では時間待ちはするなぁ~

Wire.cはI2C処理の手順を示すだけで実際の
ハードウェアアクセスはutility/twi.cの中でごそごそ。

※さらに追記
メインループの先頭でLEDポート(PB5)をトグル出力させると
いろんな処理時間が見えてきます。

今回の10usタイマー割り込みと液晶アクセスは
こんな具合。
A1000

一番下のch4の波形がトグル出力。
なにもせず(メインループがヒマ)グルグル回っていると
フルスピードでパルスが出ます。
しかし、何かの処理が長引くとトグル出力が一次停止
します。

液晶アクセス中にメインが回っていないということは、
何のための割り込み処理なの?
っと、思っちゃいます。
割り込み処理してるんだったら、ひとかたまりを
書き終わったら、メインに戻ってきて欲しいところ。
I2Cの送出完了でバッファから読み出し、無くなるまで
順次転送ということをしてくれたら良いのになぁっと。
  シリアル送信なんかはそうなっている。

10us割り込みのところを拡大すると。
A1001

割り込み処理そのものに加えて、その前準備と後始末に
けっこう時間が食われているのが見えます。
割り込み内で出しているパルスの前後に見えない
時間があるということが、メインループで出す
トグルパルスで見えてきます。

| | コメント (0)

2024年3月30日 (土)

ラズピコだと1/65535が出現

Arduinoでぐだぐだ言ったのが1023 vs 1024問題

トラ技のラズピコ特集、2022年5月号を見ていたら・・・
Pc12
A/D変換の値から電圧を計算するのに「1/65535」が
出ていました。

ただし言語は「python」。
analogioを検索してみると、Aanaloginは
16bitの値になるそうで、
https://learn.adafruit.com/circuitpython-essentials/circuitpython-analog-in
ここでは1/65536して電圧に変換しています。

https://www.denshi.club/pc/python/circuitpython/circuitpython-10-3.html
ここは、「65535は間違いなので」と注記があって
1/65536になっています。

https://logikara.blog/raspi-pico-basic/
ここは1/65536。

もう一つ、気になったのが
  v / (ref - v)
のところ。
Pc11

vが電圧値でrefが基準電圧つまり3.3Vなら、
adc.valueがフルスケールの65535になったときは
  v = 65535 / 65535 * 3.3 で
   = 3.3 となります。
すると、
  3.3 / (3.3 - 3.3)
で、ゼロ除算が発生。

図15のCDSが外れて、A/D値がフルスケールになると
ゼロ除算してしまうわけです。
1/65536にしていれば、v = 3.29995となり、
ゼロ除算は避けられます。

pythonでの数値型がよく分かってないので、
これでどんな挙動になるのかは知りません。
記事をぱっと見して、
  1/65535が出てきたぞ
  1023 vs 1024と同じ匂いか
っと、感じた次第です。

 

| | コメント (0)

2024年2月13日 (火)

トラ技のArduino Uno R4特集でも1/1023

Arduino Uno R4を知っておこうと
トランジスタ技術2024年1月号
パラパラめくりしていたら・・・
1/1023」を発見。

場所はp.106。
R42
記事のタイトルは
  Uno R4低消費電力の実力!
   家庭菜園用バッテリ動作2ch温度ロガー

その中の「R3からR4への乗り換え時の注意!
という章。
P.107の【図5】にはこんなものさしの絵も。
R43
1023と10進じゃなく0x03FFと16進表記にして
半値やら1/4値、3/4値を入れ込むと目盛がはっき
りするかと。

こちらでの「ものさし」表記。
Ss12

・1cmを1mm分解能で
Ss2_20221126092001
※こんな解説かな
・絵の縮尺の関係で、1cm位置が実際は5.0mやった。
・mmでの測定値a (0~9の範囲)から実際の長さを
 求める式は・・・
   a × (5.0 ÷ 10) が答え (単位はm)
          [ ÷9ではない ]

※参照
1023 vs 1024 、255 vs 256 なんでみなさん「2^n-1」が好きなの?

| | コメント (0)

2024年2月10日 (土)

delayMicroseconds(50000)をオシロで確認

トランジスタ技術2024年3月号に掲載してもらった
  ・『実はワナだらけ…確実に動かすArduino Uno R3』
この記事の中の『時間待ちのワナ』、これの実際の様子を
オシロ波形で見てもらいましょう。

Dm11_20240210085601

ch1がオシロトリガ用の波形。
  1サイクル回るごとにPB4をトグルしています。
ch2がdelayMicroseconds時間確認のための波形。
  1msのH/L
  50msのH/L  ←のつもり
を出力して回っています。
しかし実際は・・・
  delayMicroseconds(50000)が0.85msほどに
  なっています。

こんなスケッチを使って見ています。

#define PB5_H       (PORTB |=  (1 << PB5))  // LED on
#define PB5_L (PORTB &= ~(1 << PB5)) // LED off
#define PB4_X (PINB |= (1 << PB4)) // PB4トグル

void setup() {
pinMode(13, OUTPUT); // PB5 基板上LED
pinMode(12, OUTPUT); // PB4 トグル出力(オシロのトリガ用)
}

void loop() {
cli(); // 割り込み禁止でloopを回る
while(1){
PB4_X; // PB4トグル
PB5_H;
delayMicroseconds(1000); // 1ms H
PB5_L;
delayMicroseconds(1000); // 1ms L
PB5_H;
delayMicroseconds(50000); // 50ms(???)
PB5_L;
delayMicroseconds(50000); // 実際は0.85msほど
}
}


※元記事/関連記事
Arduino-UNOでのdelayMicrosecondsの設定は16383までだ!
Arduinoから「タイマー0」を取り上げる(ユーザーが使う)

| | コメント (1)

2023年11月 1日 (水)

C-MOS ICの入力ピンをオープンにすると


MMさんからのコメントで未使用「74HC74」の端子処理

の話が出てました。

ブレッドボードを使ってゴソゴソしていたところだったので、
74HC74を捜索。
モトローラのと東芝のが見つかりました。

7_12

HC74にはフリップフロップが2つ入っていて、
入力が CLK D /SET(/PR) /CLR(/CL) の4本。

/SET(/PR)をHに、/CLR(/CL)をLにして、CLKとD入力に対し
0~5Vのノコギリ波を加えてみました。 
チップの電源は5V。

道具はこれ↓
2023年9月27日:6年ぶりの改造:0Vから出力電圧が直線的に上昇するノコギリ波発生回路

  ※オシロ波形のメモ、「三角波」と記してしまいましたが
   正しくは「ノコギリ波」。

電流の測定ツールはこれ↓
2022年12月14日:Arduino UNOを使ったUSB電流計 4桁表示も

電流検出抵抗が75mΩ。
電流検出アンプが100倍。
出力電圧を100で割って実ドロップ値を求めて、
それを電流検出抵抗値の75mΩで割ったら電流が
計算できます。

Hc74

まず、東芝の74HC74。 (クリックで拡大↓)
Hc74_004
Hc74_005
Hc74_003

続いてモトローラの74HC74
Hc74_001
Hc74_000
Hc74_002

電源電圧の中央付近で電流が増えてます。
いわゆる貫通電流。
入力部のバッファに電流が流れるのでしょう。

/CLR=Lで出力を固定できる条件ですが、やはり入力端子の
放置はマズイです。
ハイインピーダンスなので、放置入力の電位がどうなるかは
周囲の環境次第。
近所にパルス信号が走っていたら、その誘導を受けてしま
います。
74の出力(Qと/Q)は変化しませんが、電源電流がうろうろと
挙動不審に。
面倒でも、ちゃんとしておかないといけません。

※関連
2020年04月25日:Arduino やっぱり気になる放置ポート
2020年05月02日:Arduino 放置したポートが及ぼす電源電流変化 
2020年05月02日:Arduino ポートの初期化と通信設定

※参考
(続)その未使用ピンをどうにかしなさい! アナログデバイセズ


| | コメント (0)

2023年10月31日 (火)

トラ技の作図能力が落ちている・・・かもの続き

2023年10月27日:トラ技の作図能力が落ちている・・・かも
トランジスタ技術2023年11月号
  「メカ式7セグを使ったラジオ周波数表示回路」

しつこいですが、この続き。
  磁気反転式表示器が出てきたので、
  興味深く読んでいたら、アラが気に
  なり出したという次第。
掲載回路図で気になるところが、さらに出てきました。

p.73の「・」抜けのすぐ上。
AM帯とFM帯の周波数入力切り替えにHC157が使われています。
Ca1
その未使用入力端子がオープン。
C-MOS IC使用法の基本に反しています。
TTLならほったらかしでエエんですが、C-MOSは
HかLにレベルを安定させとかなくちゃなりません。

よく見ると、ディケードカウンタ HC390のBクロック入力も、
C結合だけ。
常にクロックが入る場所ですが、これも×。

その下のU21インバータは1M抵抗で帰還してアナログ的動作を
期待。

さらに、p.72のHC373も未使用入力がオープン。
Ca2

「×」マークがプルアップ抵抗接続なりを意味する注記が
あるのかと探したのですが不明。
未使用出力端子にも「×」が付いてますし。

そして、p.76のC14。
「なんだぁ この描き方は」という表記。
Ca3

貫通コンデンサ」かと思いましたよ。

筆者さんの手抜きなのか、編集側での作図ミスなのか・・・
「ちょっとなぁ」です。

| | コメント (5)

より以前の記事一覧