« 2022年9月 | トップページ | 2022年11月 »

2022年10月

2022年10月27日 (木)

テスター精度確認用DC500V電源制御回路案 #2

テスター精度確認用DC500V電源制御回路案の続き。

パワーを取り出そうとしているんじゃないので、
こんなのは・・・・
Ee1_20221027174601
高電圧の定電流電源を用意しておいて、
GND間の電圧が一定になるように制御。

定電流回路、簡単には高圧電源と抵抗だけ
でも実現可能。
Ee2_20221027174701

これだと500V固定レンジじゃなく、250Vとか100V、50Vの
レンジ切換を1回路で実現できそう。

高圧部、プラス側からの定電流回路、こんなのは・・・
Ee4
絶縁型のDC-DCコンバータを使いますが、
Rsの値で電流を決めたらほったらかし。
  この回路だと、高圧電源に乗るリップルはどうなるかな?
  安定化される?

Pch MOS-FETだと、Vgs電圧の特性が関係して、
Trのように「Vbeはほぼ一定」が使えなくなるんで、
ややこしい。
リニアで使おうとすると、ちゃんとフィードバックが要る。
TL431でうまいこと行けへんか?

出力電圧はマイナス側の定電圧回路で決まりますんで、
電流値はエエかげんでエエ。

※追記
汎用SWレギュレータICでの高電圧の発生、
ONセミコンのアプリケーション・ノートを探すと、
参考になるのが出てきます。
https://www.onsemi.com/pub/Collateral/AN920-D.PDF

・FIG27 MC34063  190V/5.0mA
Fig27
・FIG28 uA78S40 334V/45mA
Fig28

重要パーツがトランス。
これをなにかから流用して手抜きできればと
考えるわけです。

| | コメント (3)

2022年10月26日 (水)

「十字接続は避ける」、再び

オペアンプを使った高電圧出力回路を探していて・・・
オペアンプ LT1055の資料
https://www.analog.com/jp/products/lt1055.html#product-reference
このページの
 ・AN18 - Power Gain Stages for Monolithic Amplifiers

(クリックで拡大↓)
Lt1_20221026165601
▼マークの接続に注目。
データシートに記されたサンプル回路では、2つの
ダイオードは上下につながっているだけで、左右に
走っている出力ラインとはつながっていません。

ところが、Digi-Keyの記事ライブラリ。
 ・適切な高電圧オペアンプによる高電圧の効果的で安全な制御と増幅
https://www.digikey.jp/ja/articles/control-amplify-high-voltages-effectively-high-voltage-op-amp

(クリックで拡大↓)
Lt2
データシートの図をトレースし直したのでしょう。
四角内、ダイオードの真ん中が出力ラインにつながっ
ています。
これでは動きません。

件の場所の右側2カ所で十字接続をしています。
これがあるので「同じようにつなげ」となってしまい、
ミスが起きたのかと推測。

この記事をどうぞ↓
  ・2017年7月10日:「十字接続は避ける」



| | コメント (0)

テスター精度確認用DC500V電源制御回路案

DC500Vを作る元となる高電圧発生回路は置いて
おいて、制御系を考えてみます。

まず、普通の可変電圧電源回路。
オペアンプの電源と主電源の電圧が同じ。
D1_20221026102501
オペアンプの出力にNPNトランジスタをくっつけて
電流を増やします。
最大出力電圧はオペアンプのHレベル出力電圧に
依存します。
だから、LM358などの出力電圧が電源電圧まで
上がらないものは不適格。
R-to-R入出力のものを選びましょう。

「CVCC」電源ならこんな構成でしょうか。
D2_20221026102601
NPN Trのベース電流をR3で供給。
それをオペアンプで引っ張ることで電流を減らして
出力電圧を下げるという仕組みです。

さて、オペアンプ電源と主電源(高圧側)を分離したいとき
はどうすれば・・・
オーディオ・パワーアンプだと「正負」の駆動を考えなければ
なりませんが、正電圧電源だとプラス側の電圧可変を考えればOK。
  ※短絡保護や発振対策など、あれこれ
   ありますよ。

ブースターにNPN Trを使うとすると、こんな感じでしょう。
D3
オペアンプの出力を、直接、高電圧の回路につなぐ
ことはできません。
なにかの緩衝部材が必要です。
この場合はTR1。
オペアンプをオープンコレクタにした、という
感じでしょうか。

エミッタ接地のTR1が途中に入りますんで、
オペアンプ入力の正負がひっくり返ります。
また、出力電圧を下げると、R3の両端に高電圧が
かかります。

この回路の心配点が、TR1がオフしたら、TR2は
フル電圧を出そうとしちゃうこと。
電源投入時や電源断時の挙動を考えなければ
なりません。

この出力段NPN回路では、前段のTR1をこんなつなぎに
する回路も見かけます。
D4
エミッタ接地より、ゲインが下がるので安定する
かも。

もう一つが出力段をPNP Trにする方法。
D5
  ※ダーリントン接続ではありません

この場合、オペアンプがオフしたらTR1もTR2もオフ。
抵抗駆動の出力NPN構成より心配は減ります。

しかし、コレクタ接地のTrが2段となってゲインが
上がります。  ・・・発振するかもです。

その対策(ゲインを下げる)にこんな手法が本に載ってます。
D6
TR2のコレクタ電圧が上がったら、TR1のエミッタ電圧を
上げてTR2のベース電流を減らすことでゲインが下がります。
どのくらい効かすかはR3とR4の比率。

出力段NPNの場合もこんな方法が。
D7  
出力端子電圧が上がったら、TR1のベース電流を
増やしてTR1のコレクタ電流も増やします。
するとTR2のベース電流が減って出力電圧が
下がるという仕掛け。

玉村俊雄著 「OPアンプIC活用ノウハウ」
  では、この負帰還を「マイナーループ」と
  呼んでいます。
Da11
   ※持っているの、1983年の初版でした。

この本↑とこの本↓
稲葉保著 精選アナログ実用回路集
は、アナログ回路の設計製作では手放せません。


※最大出力電圧DC500Vくらいで、テスターの精度確認に
 使えるような電源回路。
 なにか良いのがあれば、ご教示ください。

 出力電流は、テスターを駆動できればOK。
 2kΩ/Vあたりのメータ感度だと0.5mA。
 2mAもあればOKかと。
 それでも、500Vなら1Wの電力に。

 出力電圧を読むのではなく、指令電圧に対して
 追従して欲しい。
 10Vステップくらい。
 ロータリーエンコーダをぐるぐる回して
 出力電圧を設定するという操作。

 高耐圧デバイス、バイポーラ・トランジスタより
 MOS FETから選ぶほうが良いかもしれません。

| | コメント (4)

2022年10月25日 (火)

「糸ようじ」のプラケースを使うシリーズ:テスター校正用電源

まだ完成形ではありませんが、テスターのDC電圧レンジの
精度を確認するために、でっち上げました。
  1V、10V、25Vの3電圧を出力。

組み込んだのがダイソー「糸ようじ」のプラケース。
F11_20221025092901
2020年4月27日:どなたかいりませんか? まずは抵抗→コンデンサ→IC
の時に頂戴した基準電圧IC「AD2700L」を使った工作です。

  ハーメチックシールのはもう無いようです。
  でも、CER-DIPのはまだ現行品のようです。

F12_20221025092901

25Vを出すため、30V出力のDC-DCコンバータを使いたかったの
ですが、手持ちがありませんでした。
   MINMAX社の±15V出力 MAU109が適合。
   でも、買い置きを使ってしまってました。
そこで、MC34063で昇圧DC-DC回路を。

F21_20221025092901

出力電圧は仕事場のデジボルを「神様」と信じて
ポテンショを調整します。

手抜きで、ユニバーサル基板はネジ止めしてません。
基板を底に置いて、梱包用スポンジ材を使ってフタで
押さえ込んでるだけ。

将来的には・・・
  ・せめてDC 50Vくらいまで出したい。
  ・0.1Vステップくらいで出力電圧を可変。

それがうまいこといったら、最大DC 500Vあたり
のを10Vステップくらいで可変。

直流のがうまいこと行ったら交流に挑戦。

てなところがツール作りの目標でしょうか。

※「糸ようじ」のプラケース関連
2021年3月23日:中波振幅変調電波発生回路 いわゆるAMワイヤレスマイク
2022年7月7日:「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー
2022年10月19日:ダイソー「糸ようじ」のプラケース、単3電池が12本入る


※DC0~+50V出力部案
50v
0Vも出せるよう、マイナス電源が必要に
なります。
PWMの発生と制御はArduino-UNOで。

500Vクラスとなると、高電圧の定電圧電源を作る感じに
なるでしょうね。

| | コメント (0)

2022年10月23日 (日)

ダイソー ミニケース 5個組の加工

今だに「ダイソー ミニケース 5個組」は見つかっていません。
2022年9月29日:「ダイソー ミニケース 5個組」が見つからない
2022年10月12日:「ダイソー ミニケース 5個組」が見つからない #2

で、この材質PP(プリプロピレン)のケース、丸穴以外は
「カッター」での削り込みで加工できます。
例えば、コネクタ出しの角穴。
D11_20221023094201  

外形を現物合わせでマークし、カッター刃先で徐々に
削っていきます。
D12_20221023094201

ヤスリも不要。
使うのはカッターだけ。
お手軽です。
D13_20221023094201
刃先の厚い大型カッターより普通のほうが作業が
やりやすいでしょう。
D14_20221023094601

削り過ぎ(元に戻せない)と、刃先でのケガに注意。
力を入れるので、スカすると出血騒ぎに。

| | コメント (0)

2022年10月21日 (金)

赤はプラスで黒がマイナス。これが常識のはず・・・

「下間はん。これいるか?」っとジャンクまがいの
ブツがあれこれやってきます。
今回はシャープ製のACアダプタ。 (型番EA-74)
5V・0.6Aという仕様でなにかの装置の外部電源。
本体がアウトになったかで、残されたACアダプタ
だけがやってきました。
専用コネクタが付いていて、そのままでは使い物に
なりません。
そこで、電線をぶった切って、2.1φのDCプラグに
付け替えようと企んだのです。

電線を切ると、USBに使われるような感じの芯線
が出てきました。
シールド編線とアルミテープ、その中に「赤・黒・白・緑
の細線が4本。
電源は「赤・黒」だろうと推測してテスターにつないでみ
ました。

これ・・・
E11_20221021133401

テスターリードを細線につないでいるところの拡大。
E12_20221021133401

赤は赤。 黒は黒。
ところが・・・
テスターに表示されている直流電圧は「マイナス」。

あれまぁ。 常識を打ち破ってくれました。
  「あたりまえ」を信じちゃいけません。

昔、こんなこともありましたし。
  ・へんなLED
  ・へんなLED #2
  ・へんなLED再び


※件のACアダプタはこれ。
E22_20221022081201

| | コメント (1)

2022年10月20日 (木)

またまたテスターの修理 三和のSP-10D

フライス屋・佐藤テック君からの依頼。
  「工場に置いてある針式テスタの調子が悪い」と
やってきました。

V11
レンジ切換でそれなりに感度は変わるのですが、
加えた電圧より大きく針が振れます。
抵抗レンジもおかしくなっていました。
昔に抵抗測定用内蔵電池が液漏れしたのでしょう。
それを補修した痕がありました。

V12

まずメータの配線を外します。電池も外します。

分圧器や分流器を構成する抵抗、それぞれの値を
デジタルテスターで見ていきます。

すると・・・「X1」の抵抗レンジにつながる
抵抗が断線。無限大です。

V13

カラーコードから「19.6Ω」と読めますが、
手持ちの「20.0Ω」で代替。
「2%」の誤差ですが、無視。

メータの振れが大きくなるという理由、どうやら
電池の液漏れ跡によるリークだったようです。
ダメージを受けた電線(リード線の中を液が伝う)を
変えたあと、切換スイッチ回りを洗浄(大阪魂だ!)
したら改善しました。

なんとか現場復帰してもらえそうです。


三和電気計器のアナログテスター
CP8D という機種が「16年ぶりに発売」と記されていますが、
これ欲しいとはなりませんなぁ。
残念! テスターじゃなかった に出した、「日置の3012」の
復活を待っています。

※テスター校正用のツール、DCの低圧レンジはなんとか
なりそうですが、問題はDC高圧レンジと交流レンジ。
これ、どんなもんでしょ。

60Hzの正弦波を作ってトランスで昇圧。
先の電圧を分圧して整流。
その値で入力正弦波の振幅を制御かな。
1kHz 10mA交流定電流回路 、これの定電流制御に
似たような手法を使っています。
目標振幅になるよう積分回路を使って、1kHzの元を制御。
こんなので、交流電圧を可変できるかな。

出力電圧を読んで設定するんじゃなく、ダイヤルでセット
した電圧が出てきて欲しい。

| | コメント (2)

2022年10月19日 (水)

ダイソー「糸ようじ」のプラケース、単3電池が12本入る

東成おもちゃ病院仲間からやってきた
ダイソー、糸ようじのプラケース。
あれこれ回路の組み込みに利用しています。

「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー
中波振幅変調電波発生回路 いわゆるAMワイヤレスマイク

ちょっとした小物入れにと、試してみたら・・・
単3乾電池が12本、うまいこと入りました。

D11_20221019085801
新品電池じゃなく、使い古し電池のストック用でしょね。

電池入れケースと名付けられて売られているものより、
お手軽かと。

もうひとつ・・・
ダイソーのプラケースで電池入れ用ケースとして使える
ものがこれ。 「SIKIRI HALF 2」。
D12_20221019092201

単3と単4を区別して保存できます。
D13_20221019092301
単3は、下側に11本で上部に10本。計21本。
単4のほうは15本を2段で30本。

しかし、欠点が。
単4は余裕なのですが、単3を2段に積み上げ、
目一杯で保管しようとすると、この箱を積み上げたときの
荷崩れ防止用凸凹が、上部の電池に当たってしまい、
きちんとフタが締まらなくなってしまうのです。

D14_20221019092301
  内側への出っぱりが電池上部に当たる
D15

ですので、21本目一杯はちょっと。
   フタ、無理すれば締まります。

 

| | コメント (2)

2022年10月18日 (火)

三和の針式テスター「GP-5」不調

長いこと使っている三和の針式テスター、
 「各レンジの応答はあるのだけれど、針の振れが悪い」
という症状。

「回路図ありませんか?」と三和電気計器のサービスに
問い合わせたら、
 ・1982~1994年まで生産されていた機種。
 ・残念だけれど資料が出てこなかった。
とのこと。

このテスター、内蔵電池の液漏れで2012年に修理していました。
  ・2012年11月14日:テスターの電池が液漏れ

「どこかの抵抗でもおかしくなったか」と、メータの配線を
外してから(電池も)、それぞれの抵抗値をチェックしてみま
した。
Ss21

しかし・・・異常なし。
マーキングされたのと、そんなに違わない値です。

怪しいなぁっと思ったのが半固定抵抗。
「ちょんちょん」と触ると・・・復活!
Ss22

これの接触がおかしくなっていたようです。
  ※調整方法が不明のため、交換はせず。

とりあえず復旧できましたが、ちょっと不満があります。
指針の動きがスムーズじゃありません。

例えば10Vレンジで、半分の5Vを加えて針を振らせたとき、
4.8Vくらいで針が止まってしまうのです。
停止後、メーターの保護カバーを指先で一回「トン」と
叩くと5Vぴったりに指針が来るという状態になっています。

可動コイル中心部の軸受けピボットの問題かと思うのですが、
これの調整ってどうすれば良いのでしょう。
  中心軸はマイナスドライバで回ります。
  その外に固定用ナットが。

Ss23

ちょっと回してみたけど(半回転ほど)、改善は
見られませんでした。
Ss24

「壊れてもよいメータでコツをつかんで」ということに
なるでしょかなぁ。

この指針のヒステリシス現象、
  佐藤テック君ところの「SH-83TR」
でも生じています。
相談を受けたのですが、私にはお手上げで・・・。





| | コメント (4)

2022年10月17日 (月)

ICクリップ・・・うまく引っかからない

常用しているICクリップは「ミヤマ電器のMJ-033」。
  ・http://www.miyama.co.jp/products/category/parts.html
ついさっき・・・
んっ! ちゃんと引っかれへんやん」と眺めてみましたら
先端部の「コの字形状樹脂」がどこかへ行ってしまってました。
   ※左側は新品
Bb1_20221017105801

使えなくなっても全部を捨てるのは「もったいない」。

Bb2_20221017105901

スプリングや電極金属は、
 「なにかの時に役に立つかもしれない」ということで
保存です。
しかし・・・なにかの時・・「コレが使えるかも」
「どこに置いたか」を思い出すかどうかが問題。

※関連
2018年5月23日:ミヤマのICクリップ MJ-033
2019年10月17日:ICクリップ、ミヤマのほうが好き
2021年3月19日:形あるものいつかは壊れる でも今はヤメて ミヤマのICクリップ


| | コメント (1)

破裂寸前・・・電解コンデンサの耐圧を間違った

2012年01月27日:爆発寸前だったぜい
  これ↑は「逆接」。

今回は、電解コンデンサの取り違い。
実験していた回路、似たような大きさで耐圧違いの
電解コンがあって、30Vが加わるラインに間違って
16V耐圧」のをハンダしてしまったのです。

実験を続けてると、なぜか電源電流が増加
回路は動いているので、「なんじゃこりゃ」。

手組み基板の部品面、ハンダした部品を指先で触って
みると・・・(まだ匂いは感じなかった)
間違ってた電解コンが発熱。 「熱っ!」。

Aa11_20221017085301
頭が膨れてました。
  「K字溝」が破断寸前。

 

| | コメント (0)

2022年10月14日 (金)

8bitマイコンにも16bitのメモリ読み書き命令があった

8080のニーモニックでは
  LHLD nn と SHLD nn

Z-80なら
  LD HL,(nn)  LD (nn),HL

と、HLレジスタ(8bitレジスタのHとLを合わせて
16bitレジスタとする)を使っての16bitのメモリ
読み書き命令がありました。

割り込みで操作されるワード値を、読むだけ
あるいは書くだけなら、割り込み禁止操作が
不要だったのです。
  ※読んで処理して書き戻すときは
   当然アトミック操作が必要。

Z-80ではHLレジスタだけでなくBC、DEレジスタ
とIX、IYにもこの操作ができました。

タイマーなどのダウンカウンタのゼロチェック
(タイムアップチェック)が割り込み禁止にしなくても
できたのです。

この16bit値の直接読み書き機能、8bitマイコンでは
なかなかありがたかった。

6301にも LDD STD LDX STX命令があって、便利に
使って(アセンブラで)いました。
  6301はA,Bレジスタをペアにして。
  ただ、インデックスレジスタが1個というのがねぇ。
  メモリーの転送のように、あっちをこっちへという
  操作が面倒。

| | コメント (0)

2022年10月12日 (水)

「ダイソー ミニケース 5個組」が見つからない #2

2022年9月29日:「ダイソー ミニケース 5個組」が見つからない
の続き。
ダイソーで「品番3139 カードケース」を試しに買ってきました。

C11_20221012091001

カードケースというだけあって、名刺がゆったりと
入り、ミニケースよりだいぶ大きくなります。

C12_20221012091001

単4電池2本の電池ボックスが入ります。

C13_20221012091001

秋月のCサイズ・ユニバーサル基板だと、
横方向が短いです。
  ケースの内寸 95x57mm
  Cサイズ基板  72x47mm

願わくば「ダイソー ミニケース 5個組」の復活を!

| | コメント (0)

2022年10月11日 (火)

何度も言うぞ! Arduino(8bitマイコン)の割り込みには気をつけろ!

過去、何度も言ってます。
8bitマイコンの割り込み処理で多バイトデータを扱う時は
アトミック操作」を!

  ※1バイトのデータならokということではなく、
   マイコンがどんな動きをするのかを想像して
   (マイコンになりきって)手順を考えなくてはなり
   ません。
   割り込み処理なら別の動きを考えるためにもう
   一つ頭がいるかも。

今月のトランジスタ技術2022年11月号

この「倒立振子 立つ」(著者:藤森 嵩人さん) の記事でも
手を抜かれて(cli、seiしていない)ます。

p.188~p.189のリスト。
volatile」が頭に付いた変数に注目。

  割り込みで読み書き。
  メインループでも読み書き。
  メイン側で「読む」だけでなく、処理したデータを
  「書いて」それを割り込み内で使っています。

  元はintのエンコーダ入力値。
  それを加工してあれこれのfloatデータに。
  モータ制御はMstimer2で駆動される1ms周期の
  タイマー割り込み内。

面倒でも、メイン側 ←→ 割り込み処理 を受け渡しする
データは「割り込み禁止・割り込み許可」を挟まなくては
なりません。

処理全体を割り込み禁止にするのではなく、受け渡しの
データだけで良いのです。

  cli、sei命令の動作は最短の1クロック。
  やりとりのための余分なデータ領域が増えますが、
  実行時間が遅くなることはありません。

  計算には一時的なデータを使って、それを本番データに
  コピーするだけ。 その時、割り込み禁止で。
  読み出すときも、割り込み禁止で本番データを一時データ
  にコピー。
  ただ、それだけ。

何度も言います。
  起きる可能性があるなら、いつかはアタリます。
  それがバグというものです。

最初からちゃんと考えておかないと、
  「忘れた頃におかしくなる」が発生します。


※この件、トラ技編集部に伝えています。

※公開されているダウンロードサービスでは
本誌に掲載されたのとは異なったスケッチ
(ちょっと手直し)が出てきます。
しかし、まだ不完全です。
面倒がらずに「cli、sei」の手順をお願い
したいところです。
「とりあえず動いているから」とか
「ちょっとした実験だから」という性質のもの
ではありません。

ネットに上がっているミス含有スケッチ、
「初心者だから許される」は言語道断。


※新たに「割り込み処理」というカテゴリを設けました。
これで、過去記事を追跡してもらえるかと。

ターゲットに「8bitマイコンを選んでしまった・・・」と
いうのが、今回のスカタンの根本原因じゃないでしょか。
32bitマイコンなら、現プログラムのままでOKかと思うのです。
電源やらエンコーダ入力割り込み処理の手軽さから
Arduino nanoを選ばれたんじゃないかと推測します・・・
8bitマイコンを使いこなすにはそれなりの覚悟が必須という
ことで・・・

「どれだけ痛い目にあったか」の経験値がスカタン・バグの
予防になるのかと。

簡単なワクチンはありません。
自分で痛い目にあって「抗体」を作るしか、バグから逃れる術は
ありません。

| | コメント (6)

2022年10月 8日 (土)

数値をBCD出力(表示)するルーチン

ROM、RAM容量に余裕のあるマイコンなら
「printf」系の「sprintf」で文字列に
変換してシリアル出力、あるいは液晶表示
という手法が使えます。

しかし・・・
  ROM、RAMに余裕がないなぁ
  BCDにして出力(表示)するだけなのに
てな時に役立つルーチンを紹介しておきます。

・longデータ ということは整数だけ。
・ゼロサプレス付で数値に変換。
・マイナスは最も左側の数字の頭に「-」を付加。
・数値「-12345」の最小桁が0.001を意味する時の
 ため(例えば-12.345Vと表示したい)、整数部桁数
 と小数部桁数を指定できるようにした。
・値が指定桁数より大きくなっても、左にはみ
 出さない。
   液晶表示などでは表示がズレないけれど
   越えた部分の数字は見えない。
・1文字シリアル出力ルーチンの名をtx()として
 記している。
   液晶表示なら1文字書き込みに変える。
・「 -12.345」と出力したいのなら
   (先頭にスペース1コ付けている)
      txbcd(d, 4, 3);
 これで、-999.999 ~ 9999.999 の範囲を
 出力できる。
 -32768 ~ 32767のint値なら(longにキャストして)
   「 -32.678」~ 「  32.767」
  頭にスペース1つ  頭にスペース2つ
 wordなら
   「   0.000」 ~ 「  65.535」
  頭にスペース3つ  頭にスペース2つ

/*****  桁指定BCD出力       *****/
// n:整数部文字数 p:小数部文字数
// 数値は整数を入力 浮動小数点ではない
// 小数部は整数の基数が0.01などの時に用いる
// 12345が123.56を意味する時 (d,3,2)と指定
void txbcd(int32_t d, byte n, byte p)
{
char bff[20]; // 20文字(null入れず)
byte i, m;
byte sgn = 0; // 符号フラグ
memset(bff, ' ', sizeof(bff)); // スペースで埋める
if(d < 0){ // マイナス?
d = -d;
sgn = 1;
}
m = n + p; // 整数+小数 文字数
for(i = 0; i < (sizeof(bff) - 2); i++){ // longで12文字とマイナス
bff[i] = (d % 10) + '0'; // 下位桁から0~9に
d = d / 10; // 1/10して上位桁の処理
if((d == 0) && // 0になったら終わり
(i >= p)) break; // 小数桁ok?
}
if(sgn){ // 元値がマイナス?
bff[i + 1] = '-';
}
for(i = 0; i < m; i++){
tx(bff[m - i - 1]); // バッファを逆順で
if(p){
if(i == (m - p - 1)) tx('.'); // 小数点
}
}
}

例に記した「12345が123.56を意味する時 (d,3,2)と指定」
だと、整数部が3桁だけですのでマイナスを考えると正常に
出力できる(落ち無く)数値の範囲は「-99.99 ~ 999.99」
となります。

プログラムそのものは30行もありませんが、実プログラム
ではこれでも300バイトを越えてしまいます。
もっと小さくしたいときは、
 ・long:int32_t → int16_tに
 ・bffをローカル変数(スタックの処理が入る)で
  はなく関数の外に持ってくる。
てなところでしょうか。

sprintfだと、数値の単位や区切り文字を含めて1行
に表記できて便利ですが、これは数字だけ。

longの剰余と除算を使っています。
アセンブラで書くとなると、ここらから始めなければ
なりません。

Arduinoの「print」は数値の桁数を指定できない
ので不便。
数値とゼロサプレスの数を合わせて桁を揃えて
出力したい時は面倒でも「sprintf」。

 

| | コメント (6)

2022年10月 6日 (木)

5chサーミスタ温度計のA/D入力、map関数を使って補正

スカタンな応用例ばかり出てくるArduinoのmap関数
サーミスタ103JTで計った温度をシリアル出力 でのA/D変換値補正
で使ってみました。

まず、A/D入力電圧実測値と基準電圧値から真のA/D値を計算します。
  ツールはデジタルテスター。
  それと電圧発生器、あるいは抵抗を組み合わせて
  安定した入力電圧を得ます。
マイコンにはその時のA/D値をシリアル出力させます。
0に近いある値と1023に近いある値の2点をチェック。
どちらも同じなら補正の必要はありません。
ちょっとのズレなら「直線補間」の出番です。

今回の回路、サーミスタをつなぐch1~ch4はポートAでしたが
ch5だけがポートB。
この間でちょっとズレが出ていました。
まず0Vに近い方。
正値20に対してch1~4が17と-3。
ch5が16と-4と低めの値が出ていました。
フルスケールに近い方は、正値991に対して
ch1~4が992にと+1。ch5は誤差なし。

パラメータのテーブルにはこれらの値を10倍して設定します。
  ※浮動小数点にするとメモリーを食うので。
読み込んだA/D値も10倍してmap関数に食わせて補正を
行い、出てきた値の1の位を見て四捨五入。
10倍することで四捨五入の処理ができます。

これで、ずいぶんと温度測定の調子が良くなりました。
サーミスタの抵抗が低くなる高温域ではA/D値が小さくなります。
A/D入力電圧の低いところで誤差が生じていたのでこの補正が
うまく働いたのでしょう。
80℃付近ではA/D値の1bitが0.3~0.4℃の差になります。

map関数の応用例ということで、ご覧下さい。

//  A/D補正パラメータ
// 四捨五入のためA/D値を10倍にして
// x0とx1に実測値を設定する
// Rs = 10kΩで
// Lo側 200Ωでy0=20  Hi側 300kΩでy1=991
const struct{
const word x0; // in min (Lo)
const word x1; // in max (Hi)
const word y0; // out min
const word y1; // out max
}adj_tbl[] PROGMEM = {
{ 170, 9920, 200, 9910 }, // ch1 ADC1 PA1
{ 170, 9920, 200, 9910 }, // ch2 ADC2 PA2
{ 170, 9920, 200, 9910 }, // ch3 ADC3 PA3
{ 170, 9920, 200, 9910 }, // ch4 ADC7 PA7
{ 160, 9910, 200, 9910 }, // ch5 ADC8 PB0
};
/***** 線形補間 *****/
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
/***** A/D値補正 *****/
// in ad : 0~1023 A/D値
// ch : 0~4 ch1~ch5
// 10bitの範囲でリターン
word adadj(word ad, byte ch)
{
long a, d;
a = map((long)ad * 10L, // 線形補間
(long)pgm_read_word(&adj_tbl[ch].x0), // in_min
(long)pgm_read_word(&adj_tbl[ch].x1), // in_max
(long)pgm_read_word(&adj_tbl[ch].y0), // out_min
(long)pgm_read_word(&adj_tbl[ch].y1)); // out_max
d = a / 10; // 1の位で四捨五入 10の位を+0か+1,-1
if(a >= 0){ // プラス
if((a % 10) >= 5) d++;
}
else{ // マイナス
if(((-a) % 10) >= 5) d--; // 正にして1の位で判定
}
if(d < 0) d = 0; // マイナスは0に
else if(d > 1023) d = 1023; // 最大は1023
return (word)d; // wordにしてリターン
}


5chの温度測定で重要なのが「Rs」=「神様抵抗」。
今回の製作では「0.1%」精度のを使ったので、
補正テーブルの「y0、y1」(out_min、out_max)は5chとも
同じになっています。
Rsの誤差は、この値の変更で吸収できます。

使っているAVRマイコンは14ピンのATtiny841。
ROMが8kバイトにRAMが512バイト。
現在のプログラムサイズが3826バイト。
このうち2048バイトが10bit ADC→0.1℃温度データ
の変換テーブル。
プログラムは実質1778バイト。BSSエリアが58バイト。

浮動小数点使わず。sprintf使わず。
この結果だと。

ROM、RAM容量半分のATtiny441にも入るかしら。

| | コメント (0)

ArduinoのA/D:1/1023 vs 1/1024 その後

ちょっとネットを検索。
単純に1/1023や1/1024しているスケッチを見つけるの
じゃなく、いろんな考えを探してみました。

(1)ADCの出力値をアナログ値に換算する考え方
 http://kumikomi.k.asablo.jp/blog/2017/09/25/8683672

(2)DL03_ADCの細かい話:2021年06月17日
 https://kousukeno.seesaa.net/article/482057043.html

(3)A/D,D/Aの量子化の単位は、 2^n ? 2^n-1?
 https://community-ja.renesas.com/cafe_rene/forums-groups/analog/f/analog/1988/a-d-d-a-2-n-2-n-1

(4)analogReadの値の変換を誤解していた話(1023、1024問題)
 https://qiita.com/c_in_g/items/a87e5632aacbc79ba5d0

(5)10 bit ADC - divide by 1024 or 1023:Using ArduinoProgramming Questions
 https://forum.arduino.cc/t/10-bit-adc-divide-by-1024-or-1023/657174/9

(6)ADC: dividing by 1024 or 1023?
 https://forums.adafruit.com/viewtopic.php?f=25&t=25830


(3)と(4)で「2bitでの A/D」を示されています。
この考えで10bitまで有効桁を増やすとどうだ、でエエでしょう。

あと、半値や1/4値で考えるのも良。

それと、「D/Aだとどう考える」です。
A/Dだと電圧変換の結果が小数になるので、四捨五入がどうの
量子化がどうのが出てきます。
しかし、D/Aの入力値は1bit単位の整数。
そして、最大出力電圧は「Vref - 1LSB」。
どう頑張ってもVref電圧そのものは出せません。
出力電圧の変化量は「基準電圧÷分解能」。
正しくD/Aをするには・・・


※ArduinoでのD/Aというと
 Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMを使おう
map関数 の問題とともに、これ↑が絡んできます。

| | コメント (1)

トランジスタ技術 2022年11月号

トランジスタ技術 2022年11月号に半ページだけですが、
「ボヤキ」のコラムを載せてもらっています。
T11_20221006094101
橘 昌良 さんの連載「抵抗,コンデンサ,コイルの描き方」の
半ページを頂戴しました。

T12_20221006094101

この話。
  ・んっ? ボリュームの記号が! 
橘さんの連載、ちょうど可変抵抗が出てくるので、ナイスタイミング!
と編集部に取り上げていただきました。

それと、トランジスタ技術編集部からこんなヘルプが。
  トランジスタ技術の創刊号(1964年10月号
  を復刻するにあたり、創刊号の著作権者を
  探しています。
と。

| | コメント (0)

2022年10月 5日 (水)

サーミスタ103JTで計った温度をシリアル出力

サーミスタ103JTで計った温度をアナログ出力
この製作で使ったマイコンは8ピンのATtiny85
内蔵タイマーが8ビットで、PWM出力でD/Aするには
分解能不足。
そこで、DACを使ってアナログ電圧を出力しました。

今回の「ダイソー ミニケース 5個組」を使った工作
やはりサーミスタ103JTを使った温度計なのですが、
シリアル出力でデータを得ようと目論見ました。

14ピンのATtiny841を使って、5つのサーミスタを
つなげられるようにしています。

ブロックダイヤグラム
C51_20221005170901
1秒間隔で測定値を出力します。
先頭が6桁数字が連番。
  データ抜けをチェックできます。
スペース区切りで5つの温度を出力。

セミテックの103JT温度・抵抗値表が元データ。
-30.0℃~125.0℃をテーブルにしています。

  ※10bit A/D値から温度データテーブルを
   直に呼び出すことで、浮動小数点関数計算
   を使わなくて済みます。
   ATtiny841のROMサイズは8kバイトしかあり
   ません。
   浮動小数点や「sprintf」による数値→文字列
   変換関数を使うと、ROM領域が足らなくなって
   しまいます。
   可能ならROM半分のATtiny441でも動くようにと。

ところが・・・ここでも失敗に遭遇。
  ATmega328Pを使ったピピちゃん温度計
では、外に取り出した内蔵基準電圧1.1Vを使っての
サーミスタ抵抗測定がうまく行ったので、ATtiny841でも
大丈夫だろうと考えたのです。

  ※ATtiny841と同じ14ピンのATtiny84は
   内蔵基準電圧を外に取り出せない。
   そして、外部からの基準電圧も2.0Vが
   最低というスペックで断念。
   ・回路設計はデータシートの熟読から。 スペックをちゃんと調べろ!

こんな接続をしたかった。 (ATmega328Pでは実績あり)
C52_20221005171201
ATtiny841のAREFピンからちゃんと1.1Vは出てきました。
これを低オフセット電圧のオペアンプでバッファします。
しかし、この出力を「神様抵抗」のプラス側としてA/D変換
すると・・・オープンにしても(10kΩでAREF電圧につながる)
フルスケールの「1023」が出てこないのです。
5つのチャンネルとも、計算値より低い値が出るのです。
フルスケールに近い電圧の高い所だと2~3。
電圧が低い所だと、3~4、出てくるA/D値が小さいのです。

全体に下へシフトしてる感じです。
  ※ATmega328Pではこんなことには
   ならなかった・・・

そこで、外部から基準電圧を供給してみることに
しました。
  ※基準電圧を出力するAREF端子。
   ノイズ低減のためにパスコンを入れる
   ためのもの。この電圧出力を利用
   できるとは、データシートには記され
   てない。
  ※ATtiny85や84では2.0Vが最低電圧
   という制限あり。
C53
そうすると大丈夫に。
  ※完璧に誤差がないというわけではく
   そこそこエエ感じ。

ということで、
 「同じシリーズのチップでうまいこと行った
  経験があっても、始めて使うチップは、何が
  あるかわからへんでぇ」
と、あたりまえの結果に。

ダイソーのプラケースに入れるとこんな感じ。
Cc1_20221005171601

  ※L型ダブルのピンヘッダーが無かったんで、
   オムロンのツメ付ヘッダーを切断改造。

| | コメント (0)

FDKの長寿命電池「HR-AAULT」 50cyc目のゆっくり放電

2022年9月24日:FDKの長寿命電池「HR-AAULT」がやってきた
これの初回放電では、充電池の残容量がほぼカラっけつ
だったため(用途が組電池で一般家庭用とは異なる)、
初回の「0.2Cでのゆっくり放電」のグラフが得られま
せんでした。
充放電実験、今は61サイクル目まで進んでいますので
50サイクル目の放電データを取り出してみました。

まず、これが初回放電~4回目の充電。
Cap020
「0-D」と記したラインが初回放電。(左下)
放電開始からすぐ1.0Vに落ち込んでいて
残容量がほぼ無かったことを示しています。
  ※これはそういうふうにしてあると
   考える方が妥当かと。

これ↓が50サイクル目のゆっくり放電~54回目の
充電までのグラフ。
Cap009_20221005084501

0.2C放電の5時間=300分を越えています。

また、充電時間を見ますと、「-ΔV検出」で止まるので
はなく、「132分」(定格0.5Cの1割増しの時間)で止まっ
ていました。

こんな具合に、2時間を越えたあたりで充電電圧の
ピークが出現して、そこから徐々に電圧が低下。
しかし、「-10mV」を検出する前に132分に到達
して充電停止となっています。

54サイクル目の充電。
1h56m 1.512V : 1分ごとの電池電圧
1h57m 1.518V
1h58m 1.522V
1h59m 1.526V
2h00m 1.527V
2h01m 1.529V
2h02m 1.529V
2h03m 1.530V ←ピーク電圧出現
2h04m 1.530V ←
2h05m 1.530V ←
2h06m 1.529V
2h07m 1.529V
2h08m 1.529V
2h09m 1.528V
2h10m 1.528V
2h11m 1.527V
2h12m 1.527V
2h12m 1.527V ★ 132分経過で充電停止

| | コメント (0)

2022年10月 3日 (月)

サーミスタ103JTで計った温度をアナログ出力

失敗談、2022年9月28日:回路設計はデータシートの熟読から。 スペックをちゃんと調べろ!
この発端の製作物です。

「温度→電圧」変換はLM35やTMP35あたりのセンサーが
便利なんですが、ブツに接触させて温度を測るときにちょいと
問題があるんです。
 ・形状のせいか応答が遅い。(TO-92パッケージ)
 ・足から熱が逃げるのか、低い目の温度が出る

  ※型番、LM35は、昔はナショセミ。今はTIに。
   そしてTMP35はアナログ・デバイセズに。
   ややこしいぞ。

応答が早くて間違いなくブツに接触できる温度センサーという
ことで、「セミテックのサーミスタ103JT」を使って、
 ・センサーの抵抗値から温度を算出。
 ・温度をD/A出力。
という方法で、アナログ値を得るようにしました。
  ※単純なことをするのに、むちゃたいそうな回路。

Tn85_thm1

ATtiny85を選んだんがそもそも失敗。
でも、作りかけたんで、完成形に仕上げてみました。

測定温度範囲は0~80℃。
10bit分解能のA/Dで温度を得てますんで、分解能は
ざっと0.1℃。
これを0.0V~4.0Vの電圧に変換します。
1℃あたり0.05Vのスケールです。

AVR studioでプログラムを組んでます。
フォルダーごと圧縮。
   ・ダウンロード - thm_85_da1.zip

10bitのA/D値から2kバイトのテーブルで温度に変換
という手抜き手法。
複雑な算術関数は使っていません。

回路を組み込んだプラケースはダイソーの「ミニケース5個組」
M31
M32

この回路の電源は、
Arduino-UNO 12bit×4chアナログ SDカードデータロガー完成形
から供給します。

さて、温度センサーIC:LM35(TMP35)とサーミスタ103JTの
違い、どんなもんかと調べますと・・・

15Ωのホーロー抵抗の側面にセンサーをくっつけて、
抵抗を通電して発熱させます。
その時の温度変化を電圧として記録しました。

M11_20221003101301

M12_20221003101301

まずは、センサーを軽く貼り付けした状態から。
M13_20221003101301
すると・・・
Cap004_20221003101401
センサーICとサーミスタの出力に差が生じます。
時間が経過してもそれが埋まりません。

M14_20221003101301
テープでぐるぐる巻きにして、温度が逃げないように
したつもりでも・・・
Cap005_20221003101401
途中で段ボール箱をかぶせましたが、時間が経っても
2℃くらいの差が埋まりません。

そこで、2017年11月6日:液晶表示器「焼き鈍し」
で使った「保温箱」で試してみました。
この2種以外にも、センサーICとサーミスタを加えます。
M21
2と4が今回のセンサー。
1はセンサーICの外周を熱収縮チューブで覆っています。
4は同じ103JTですが、先端近くまで熱収縮チューブが来ています。

センサー部分はむき出しのまま、電線のところでマスキングテープを
巻いてまとめました。

65℃で保温された箱の中に投入しますと、数分で4つとも温度が
安定、収束します。
  ※電線部分、およそ20cmは保温箱の中に入っていて、
   先端のセンサー部と同じ温度になっているかと。
Cap006_20221003103401

また、4つのセンサーを箱に入れたまま、箱を室温
から加熱した場合も20分ほどで65℃に到達し、
その後の温度差はそれほど感じません。

Cap007_20221003103401
  赤:保温箱温度制御センサー
  緑:サーミスタ 4
  青:サーミスタ 3
  マゼンタ:センサIC 2
  シアン: センサIC 1

発熱体に直接接触させて温度を測る場合と、周囲の空気ごと
温度を測るということで差が生じるのでしょう。

このあたりをもうちょい勉強しようとすれば、何を
調べれば良いでしょうか?

| | コメント (6)

« 2022年9月 | トップページ | 2022年11月 »