電子工作

2020年9月21日 (月)

『アトミック操作』・・・8bitマイコンに限り何か別の言い方なかったか?

2019年3月25日:割り込みで処理させるwordデータの扱い
に書きましたが、Arduino-UNOで使われているAtmega-328Pは
8ビットマイコンです。
ですんで、割り込みで処理される2バイト以上のデータをメイン側で
読み書きする時は「割り込み禁止状態にして」というのが基本です。

この手順を「何て言うの?」っと調べたら・・・
  ・アトミックに処理を
  ・アトミック操作
  ・不可分処理
っと、出てきます。

でも、アトミック操作とはで調べると、8ビットマイコンでの
割り込み処理の話が出てこずに、
  スレッドやプロセスや
  RISCやCISCや
  マルチスレッドやシングルスレッドや
っという8ビットマイコンの世界とはちょいと縁遠いお話し
ばかりが出てきます。

この「アトミック操作」ですが、昔々の8ビットマイコンの
世界じゃ(8080,6800~Z80あたりの年代で)なんかもっと他の
言い方、無かったでしょうか?

「8ビットマイコンの割り込み処理で多バイトデータを扱う時、
 メインでは割り込み禁止で読み書きを」を一言で表現できる
言葉、こんなの無かったですかね?

当時、アトミック処理や不可分処理なんて言葉で言わなかった
よう・・・

『アトミックにアクセス』なんて言い回し・・・
ラジオペンチさん に教えてもらった。
   (この↑記事のコメントの前にもあったはずだけど探し出せてない)


| | コメント (0)

2020年9月15日 (火)

操作スイッチ接触不良 →大阪魂の出番に

ずいぶん昔に使ったとある装置のテストジグ。(30年以上前だわ!)
ひさしぶりに引っ張り出してきて使おうとしたら、操作スイッチが接触不良に。

ミヤマ電器 DS-193 という小型のプッシュスイッチ。
ずっと押してれば、ちゃんと接点は接触はしてくれます。
しかし、「ちょん・ちょん」と寸動するとダメ。
ツン・ツン」と動くはずが「バ・バ・バ・バ・バ」っと振動して
しまうのです。
回路的にはハードウェアーで10mS程度のチャタリング除去はしてい
ますんで、たいていは大丈夫なはずなんですが・・・

とりあえずオシロで接点の状態を見たら、チャタリングなんてもんじゃ
ありませんでした。
「チョン」押しで100mSほどオンしたら、その間、明確なオン・オフ
の断続が2~3回。
接点のチャタリングじゃなく、接触不良状態というか、素早く手で
オン・オフしたような信号、正規の信号のようになってます。
これじゃチャタリング除去回路では吸収できません。
同じような不良のスイッチが2つ。

とりあえず手持ちの新品押しボタンスイッチに交換。
小型のスイッチだったんで、元の穴が大きすぎたんでワッシャ
をかまして無理やり取り付け。

取り外したDS-193↓
11_20200915114001

ジグを使い終わってから、アウトになったスイッチをバラしてみました。
接点部が取り付け金具部にねじ込まれています。
これを緩めると、接点金具と小さなバネが出てきます。

12_20200915114201

接点部の奥に、ハンダ付けする接触が見えてます。
   (リングライトを出すのが面倒だったんで
    懐中電灯で照明)
13_20200915114201

接点も接点金具もキレいです。
これで接触不良?というのがちょい不思議。
  ※過去、ひどい接触不良を見てますんで

さてここからが「ものは試し」。 使うのは「大阪魂 」。
接点と接触片の両方をプシューしてから組み直します。
すると・・・
あらま、ちゃんと回復しちゃいました。
単純な構造の接点ですんでチャタリングは発生します。
しかし、「バ・バ・バ・バ」というむちゃな接触不良は無くなりました。
導通チェック しても大丈夫。
  ※抵抗値の変動があれば音ですぐに分かるんで。

まぁ、一度トラブったスイッチです。
とりあえず非常用の予備品に。

しかしまぁ「大阪魂」。こいつはなかなかやってくれます。

※関連
2018年8月27日:モノタロウのパーツクリーナ
2018年8月24日:はじめてのArduino MICRO
2018年2月22日:ローランド ミキシングアンプ「VX-55」修理!
2018年10月22日:タクトスイッチ接触不良
2011年01月27日:電源スイッチ接触不良 
2013年06月12日:タクトスイッチ接触不良
2013年04月26日:照光式タクトスイッチ…接点が死んでました

| | コメント (0)

2020年9月14日 (月)

コテペンの柄、割れてきた・・・

大事に使ってきたコテペン40(もう作っていないんでパーツも含めて入手不可)。
今朝のこと、ハンダ付け作業をしてましたら・・・
コテを手に持った時に突然の違和感。
「くにゃっ」とした感触。
コテの柄を見たら、ひび割れがぁぁ。

もう2本同じものをストックしてあるんですが、お気に入りの
ツールです。
ひび割れに瞬着を流し込んで(百均のじゃなくちょいとエエやつで)
から、「アクリルレジン」で固めちゃいました。

A11_20200914175901

以前にも、
2013年03月05日:コテペン落下→折損→応急修理
てなことがありました。
  ↑これ、まだ生きてます。
  おもちゃ病院で使ってます。
今回は落としはしていません。
使っていたら、ある時「んんん? なに?」でした。
ほんと、手になじむハンダゴテを探しとかなあかんです。

2014年12月06日:半田ごて落下→ヒータ折損

| | コメント (0)

「チャタリング除去回路」じゃなくって「チャタリング発生回路」をどうぞ

2020年9月12日:ロータリーエンコーダーの2相パルスをピン変化割り込みで取り込む
に絡んで、接点式ロータリーエンコーダーの「チャタリング」を
ソフトでどうにかできないかと試しています。

ただ・・・
件の接点、たいへん状態が良くって、オシロで見てても頻繁に
は発生しません。
たまに出る」という状態です。
しかし、チャタリング除去回路無しでは、「出ればカウントミス
が発生します。
やはり、これではあきません。
外付けチャタリング除去回路(抵抗+コンデンサ)無しでなんとかな
らないかと、試行錯誤中です。

その試行錯誤するためには、信号源として
チャタリングが出る接点」が必要です。
「リレーをカチャカチャ」なんてこともありなんですが、
エンコーダーなんで2相パルスが欲しい所です。

そんな時のためのツールが『チャタリング発生回路』。
1chだけのを作ってあったんで2chに拡張しました。
これで、2相パルスの両方に模擬的な「チャタリング信号」
を乗せることができるようになりました。

こんな回路です。

C11_20200914081201
まず、X-ORゲートを使ったエッジ検出回路で↑↓エッジからちょいと
遅れたゲート信号を作ります。
別の発振回路で作ったチャタリング信号を、そのゲートの時間だけ
X-ORゲートで元の2相パルスと合成します。

こんなタイミング。
C12_20200914081201
X-ORゲート、2つの入力信号のH/Lが一致で出力L。
2つの入力のH/Lが異なったら出力H。
ということは、
片方がLならもう片方の信号をそのまま出力。
片方がHならもう片方を反転して出力すると
いう性質があります。
これでエッジ検出やチャタリング信号の合成を
行っています。

オシロで見たところ。

C022  

手組みした基板の様子。
C24

チャタリング時間とチャタリング信号の周波数を半固定ボリュームで
可変できるようにしてるんで、あれこれ試せます。


※2相パルス発生回路はあれこれ製作しています。
2005年09月09日:トラ技2005年10月号
2015年12月08日:んっ? トグルスイッチが
2014年07月01日:高速2相パルス発生回路



| | コメント (0)

2020年9月 9日 (水)

明るすぎた~

新造基板の動作チェックをしてるんだけど・・・
「プログラムはちゃんと走ってるよ表示」(2秒周期で点滅)の
LEDが明るすぎちゃいました。
部品表を見たら・・・「高輝度・純緑」のを選んでました。
2mAしか流してないのに、むちゃ明るい。
じっと見つめられません。
11_20200909165901

普通のに変えよう。

※シリアル通信の送受信タイミングとか、たまにピカッと
光るにはこのくらいでイイんでしょうが、1秒点灯・1秒消灯
というゆっくりした点滅ですんで・・・


| | コメント (4)

2020年9月 4日 (金)

テキサスインスツルメンツ SN6501 絶縁型電源向けトランスドライバーIC

アイソレーション・アンプ(アナログ信号を絶縁して伝達する)を調べていて、
こんなICに遭遇しました。
  ・https://www.tij.co.jp/product/jp/SN6501

絶縁電源用のトランスを300kHzで駆動します。
これ用のトランスが売られてるみたい。

A1_20200904121301

LDOレギュレータを入れて安定化。
A3_20200904121401

トランスですんで「±電源」や「倍電圧整流」も。
A4_20200904121401
市販のDC-DCコンバータ(数百円か)と比べてどうでしょか?


| | コメント (0)

2020年8月29日 (土)

Arduino-UNO 12bit×4chアナログ データロガー計画中

Arduino-UNO + SDカードでシリアルデータロガー 完成形 今度こそ
でArduino-UNOを使ったSDカードの読み書きがうまく行ったんで、
今度はアナログ値のデータロガーかと、構想中です。

◎要求仕様
・10bitでは不足だっ。
 だもんで、ATmega328Pの10bit A/Dは使わず、
 12bitのA/Dコンバータを外付けっと。
・4chは欲しいぞ。
 だもんで、A/DはMCP3204。
・リファレンス電圧は4.096Vで。
 ちょっとエエのを使おうか
・入力レンジをどうしよう・・・
 悩み中。
 とりあえず±2Vレンジと±20Vレンジで。

フロントエンドはこんな回路か・・・

50_20200829161201
±2Vレンジなら±2.048Vで最小桁が1mV。
±20Vなら10mVを読めるかと。
いわゆる 3・1/2桁 相当。

昔々、各チャンネルのGNDをアイソレートして
別電源でも測れるようにっと、こんな回路も描いたけど・・・

53_20200829161301

入力レンジ切替回路の参考図。
51_20200829161301
2015年04月22日:A/Dコンバータの入力レンジを拡大する方法

これ↓はプリンタシールド応用チャートレコーダの
52_20200829161301
2014年01月25日:プリンタシールド、付加回路


| | コメント (2)

2020年8月27日 (木)

オペアンプとMOS FETを使った定電流回路・・・電子負荷回路・・・

オペアンプとNch MOS FETを組み合わせた吸い込み型の定電流回路は
「電子負荷」などで使われます。
基本はこんな回路。

31_20200827091501

電流検出抵抗Rs両端の電圧が電流設定制御電圧Vp
と等しくなって、「Vp÷Rs」の一定電流が流れる
という仕掛けです。

基本はこれなんですが、実際の回路だとFETの
ゲート入力容量や制御の遅れで、オペアンプが
発振しちゃいます。

その対策、ざっとこんな具合。
32_20200827092001
・R1でFETのゲート容量とオペアンプ出力と分離。
・発振止めコンデンサC1が効くようにR2を追加。

R2には電流は流れませんのでVm=Vsで、Isの計算式
は一番上の図と同じ。

ところが、こんな回路↓を見かけるのです。
  ※発端は昔からの仲間でやってるメーリングリスト

33_20200827092301
R3とR4が追加されています。

まずFETのゲートとGND間に入れるR4から。
制御的には、R4があっても「Vo>Vg」となるだけで、
出力電流の値には影響しません。

これが必要かな?っと考えられること。
(1)オペアンプの電源が0~30Vなどの高電圧で動いて
  いる時、FETのゲート電圧が過大にならないように
  するための分圧回路。
(2)電源オフ時にFETのGを安定(抵抗でGNDにつながる
  ので)させて勝手にオンしないように。

(1)に関して、オペアンプの電源が0~5V、あるいは0~12Vで
動かしているような回路だとまず心配ないですよね。
たいていのパワーMOS FET、Vgsの最大定格は±20Vとか±30V。

問題は(2)。
C-MOSオペアンプだと、電源断で出力段の寄生ダイオード
を通ってGNDレベルになったVddにつながるということで、
ゲートのレベルが安定しそうです。
でも、LM324などのバイポーラオペアンプだとどうでしょか。
ちょっと調べてみる必要があるかな。


次が抵抗R3
オペアンプの出力と非反転入力に入れてあります。
なぜこれを入れるの?』っというのが今回の主題。
   ※結論は入れるな!でっす。
オペアンプを使った増幅回路、よく目にする回路だと(今回の
定電流回路じゃなく)R2とR3でアンプのゲインが決まります。
想像です。
R3が無いと、ゲイン無限大で「コンパレータになってしまうんじゃ」
っと思うのでしょうか?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※豆知識
どんなオペアンプでもちゃんと制御されている時の基本は「Vp=Vm」。
オペアンプ応用回路が生きているか死んでいるかの判断がこれ。
非反転入力と反転入力間の電圧をテスターで計れば一目瞭然。
  (ただし、飽和してない時、交流信号が入ってない時に)
しかし、実際の修理となれば・・・
Vp≠Vmの時の判断・・・
 ・オペアンプが死んでるのか。 ・周辺回路の部品がおかしいのか。
そりゃあ、悩みますぜ。
 ・フィードバック系に入った抵抗1本でアウト
 ・これはダイオード1本で  OP-AMP回路が動きません
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

このR3、むちゃ悪さをします
  ※影響度はR2との比率になるんですが・・・

※基本の考え方。 (R4は無しとしてVo=Vgで)
  VgはFETがオンしなくちゃならないのでVg>Vs。
  その差はざっと2~4Vくらい。 (FETの特性によります!)
  Idが大きくなるとVsも上昇、Vgはそれより上昇。

R3があると、オペアンプの出力から反転入力間の電圧差÷R3だけ
電流がR3とR2に流れます。  電流値は(Vo-Vm)/R3です。
この電流、R2とRsを通してGNDに流れます。
Vm=VsとしてRsに流れる電流を想定しているのに、Vm>Vsでは
Vpで設定した流れて欲しい電流より小さな電流になってしまいます。

さらにたちの悪いことがあります。
R3が無い本来の制御ループは、FETのVgs電圧に関係なく一定の電流値に
なるようになっています。
しかし、Vgsはデバイス依存。
温度が変わればこの電圧も変化します。
R3を入れたことで、Vgsの変化がR3、R2の電流値変化につながり
それがIs、Idに影響するのです。

例えば、
「ちゃんと1.000Aに設定したのにしばらくしたら
 (発熱してきたら)電流値が変わってしまった」
「VpとIdの関係が日によって変わる」
なんてことも発生します。

もう一つ。
Vpを0Vから徐々に大きくした時の0Vに近い電圧での挙動。
R3が入ったせいで、FETのゲートをオンする前のVo電圧でも
R3・R2・Rsに電流が流れます。
これでもVp=Vmが成り立つので制御はOK。
しかし実際には、FETは駆動されておらず、Idは流れない。
こんな不感帯がVpが0V付近で発生します。

結論:R3は外せ!
です。

でもおそらく・・・
34_20200827105701
こんな使い方をしてたらR3が有ろうが無かろうが、
ちょっと値が変わろうが関係ないんだろうな・・・
っと。

※参考
定電流回路の電流検出抵抗を試す
定電流回路の電流検出抵抗


こんなのを真似してるのかなぁ?
Diy キット 150 ワット 10A バッテリー容量テスター調整可能な定電流電子負荷放電試験


これもちょっとへん。
小電流電源の試験に適した定電流負荷
    R13、R14いらんやろ。
    発振止めコンデンサ無しで大丈夫か?
    TL431並列の0.1uF、これも大丈夫か?
       値によっては発振するでぇ。

| | コメント (0)

2020年8月26日 (水)

アナデバの電力計用IC

アナログデバイセズのアプリケーションノート「AN-679」を見ていて・・・
  https://www.analog.com/jp/search.html?q=an-679
ここ↑の
   Application Notes
   A Low Cost Watt-Hour Energy Meter Based on the ADE7757
「電力計」用ICの資料です。

このPDFを見ていて「おおっ」っとなったのが、ラジオペンチさん
とこのこの回路。
peacefair のAC電力測定アダプタ PZEM-004T v3 (回路調査編)
    ・PZEM-004T v3 の電源回路

似たような回路がアナデバのアプリケーションノートに出ていたんです。
C1_20200826092201

C2_20200826092201

ツェナーダイオードは15V 1W。
   倍圧整流回路の頭を15Vで押さえようという魂胆
MOVはAC275Vのバリスタ。
   可変抵抗じゃありませんので
コイルのマークはフェライトビーズ。

AN-679で紹介されているのがADE7757
    ※これの単価@350(Digi-Key)
     でも古いタイプのICみたい 在庫数少
似たような16pinの電力計用ICに、
  ADE7768 生産中止
  ADE7769 生産中止
  AD71056 @360  ←これが主力?

マイクロチップのこれらも似てる。
  MCP3905,3906 (24pin)   @210
  MCP3909(24pin) @230
    ↑dsPICらしい


このIC、電圧と電流から有効電力を計算して、
電力計の目盛を回すためのステップモータ駆動用パルスを
出すという、単純な構造なんです。

24pinのになると、I2CやSPIなんかで通信できたりするんだけど、
16pinのはパルス出力だけ。

パルスの周波数を測定すれば有効電力がわかるという仕掛け
になってます。
フォトカプラで一次側と絶縁してF/Vコンバータを通せば
アナログ値で電力変化が読めます。

安価なICだし、何かのついでに買ってみます。

AC→RMSコンバータといや、周波数特性と微少入力での
安定性から「高いけどやっぱしAD637やで」っという想いが
あって、「50~60HzやったらLTC1966でいけるで」っと
使ってきました。
しかし、電流と電圧のRMS値を得て乗じても、出てくるのは
皮相電力。単位は「VA」。
しかし瞬時電圧×瞬時電流での有効電力の計算となると
めんどうか・・・っと思っていたら、こんな安価なICが
あるんや~という次第です。


※LTC1966応用例
2014年02月12日 メモ:カレント・トランス用アンプ回路

 

| | コメント (1)

2020年8月11日 (火)

14pinのAVRマイコン、ATtiny24が動かん!

しょうもないミスをしてしまって、解決まで悩みまくった・・・

試作回路のテスト用ジグの製作。
周波数1kHzで、デューティ0%~99%のパルス波が欲しい
という要求仕様。
設定はロータリーDIP SWが2桁。
使ったのは14ピンのATtiny24で、こんな回路に。

11_20200811093001
6.4MHzの水晶をクロックを1/64して100kHzを得、
これを1/100して1kHz。
AVRマイコンのタイマー0をFAST PWMモードにして
DSWでの設定00で全区間L~99%のH/L波形を出します。

※ISPのライン、PA4、5、6に入れてある抵抗は
 DSWオン時(GNDにつながる)でもISPできるように。

こんな基板に。
とりあえず、プラケースに入るようにして行方不明に
なりにくく。
この手のテストジグ、裸の基板だと消息不明が多発・・・

12_20200811093001

ところがです。
・・・プログラムが動いてくれない。
イニシャルはしてくれるのですが、main()の
永久ループに入らない。 なぜ?

AVRマイコン、「C」で書く時はこんなスタイルです。
  ※Arduinoならsetup()とloop()に分かれますが。

// 初期化ルーチン
void ioinit(void)
{
  あれこれ
}

// main処理
int main(void)
{
 ioinit();  // 初期化処理を呼び出して
 while(1){    // 永久ループ
   あれこれ  // メインでの処理★
 }
}

初期化処理までは動くんだけど、★のメイン処理が
動かないという現象が起こったんです。

さらに・・・
テストルーチンをioinit()内に入れこんで、ioinit()
から抜け出ないようにしたら、ちゃんと動くんです。
なぜにwhile(1)で永久ループしない?

この追求に手間取りました。
でも、原因は単純な話。

通常、AVRマイコンの「C」の処理は、
・ステータスレジスタのクリアとスタックポインタの初期化
・内部データの生成
・BSSエリアのクリア
これを自動(ユーザーは意識しなくて良い)で行った後、
main()をサブルーチンコールします。

そして↑の私の書き方だと、main()の中から
ioinit()をサブルーチンコールして、その後に
while(1)の永久ループが回ります。

さて、トラブった原因・・・

この時、コンパイルはATtiny44を想定して行っていました。
ところが・・・
ターゲットの回路に入っていた実際のチップはATtiny24

同じ14ピンなもんで、チップのマークをちゃんと読まないと
判断できません。

そして、I/Oレジスタまわりの構成は同じです。
だからioinit()は動いて、それなりの動作をし始めた
のです。 (だからややこしかった)

何が問題になったのか・・・
RAMのサイズでした。

小さいプログラムですんで、ROMは小さくても大丈夫。
RAMもほとんど使っていないんで余裕のはずなんですが、
Cコンパイラが設定するスタックポインタがtiny24と
tiny44では異なります。
  (RAMの最終アドレスを設定する)

コンパイラがtiny44のつもりで設定した場所、tiny24の
ここにはRAMがありません。
だもんで、ioinit()を呼んだ戻り先が喪失してしまい、
プログラムが暴走。
いつまで経ってもwhile(1)のループにたどりつけません。

こんなスカタンな話、生半可にI/O回りが動き始めてたんで、
解決に手間取りました。


※豆知識
AVRマイコンのデータシートを見てもらえれば、ステータスレジスタと
スタックポインタへの処理が、Cコンパイラの「大きなお世話」で
あることが分かるかと。

AVRマイコン、リセット起動で
 ・ステータスレジスタはゼロに初期化。
 ・スタックポインタはRAMENDに初期化。
されます。

それをCコンパイラで書かれたプログラムがなぞるわけです。
スタックポインタはチップに乗ったRAMサイズに合わせて
自動的にセットされるので、チップのRAMサイズが変わっ
ても(小さくなるチップを使っても)今回のようなサブルーチンの
リターンアドレスが喪失するような事態は発生しません。

アセンブラでプログラムを書くなら、この初期化処理はしません。
リセットによる初期化を信じます。


※制御プログラム:ダウンロード - 1khz_duty.zip

 

| | コメント (3)

より以前の記事一覧