« 2020年7月 | トップページ | 2020年9月 »

2020年8月

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月28日 (金)

ほんとに最後でしょう・・・リン青銅製文鎮4つ

---【完売御礼】---

最後やで~、って言ってましたが、「また出てきた!」っと文鎮製造元の佐藤テック君。
リン青銅の素材。 材料置き場を整理していたら発掘!だと。

Aa1_20200828085901

4つ作ってきてくれました。
Aa2

「皮」を剥いて、切断。
6面を削って、端面をキレイに、M5タップを切って。
という工程。

「削りすぎると薄くなるんでエエとこで止めてる」っと。
拡大するとこんな様子。
Aa4

頒布は、文鎮:ハンダ付け補助ツ-ル 最後のリン青銅 本人が使おうかと・・・(2019年3月27日) と同じ価格で。



◆ほんとにほんとに最後のアナウンス。

・リン青銅製ハンダ付け補助ツール。
   重さ:275~280g
   サイズ:65mm(幅) x 41.8mm x 11.5mm(厚)

お代は3400円。 クリックポスト(198円)で送付(2つまで)

・SUSのキャップボルトとワッシャ、2mm厚ゴム板が付属

ご希望の方はこの記事にコメントを。(メールアドレスを記入のこと)
早い者勝ちで。


どんなものかは、↓を参照してください。
文鎮:ハンダ付け補助ツールまとめ

| | コメント (5)

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、これも大丈夫か?
       値によっては発振するでぇ。

| | コメント (4)

三和シャッター電波リモコンRAX-110修理

今回の修理依頼、故障原因は(いつものように)電池の液漏れ。
電池電極の傷みはそんなにひどくはなかったんですが、それでも
スプリング電極はメッキがアウトだったんで新品に交換しました。
・・・メッキがはげたバネ鋼素材はうまくハンダ出来ない。
   ※「タカチの電池バネ端子」 を常備してます。

今回ので「なんじゃこれ!」っと目立ったのがこの部分。
29.99MHzの電波を出す終段部。
みごとに漏出液が結晶化
1101

なぜこんなにうまいことここだけにが集まったんだろか。
部品を抜き取って基板をゴシゴシ洗浄。
Trやトリマーコンデンサなどは新品に交換。
ダメージを受けたパターンの銅箔を補修。
けっこう手間が掛かります。

こんなこともありました。
2018年4月24日:電動シャッター用リモコンRAX-110修理できた


さまざまな電子機器、電子回路の修理依頼について:(有)アクト電子


| | コメント (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月25日 (火)

パナソニックeneloopスタンダード単3、JIS C8708:2019充放電テスト720サイクル目

パナソニックeneloopスタンダード単3、JIS C8708:2019充放電テスト450サイクル目
これが7月7日。
そこから1ヶ月半ほど経過して、現在720サイクル目です。
先ほど「充電」が完了。

11_20200825092901

その充電時間を見ますと「91分」。
元気な時は120分を越えていたのですから7割近くに衰えている
感じです。
充電停止電圧も1.64Vと徐々に上昇しています。

※この直後の放電、1.00V到達まで「82分」でした。
12_20200825103101
  ※450サイクル目では111分だった。

450サイクル目までの様子 (ここから+270サイクル)
E450     
まだ、充電開始直後の「偽の-ΔV」は出ていません。
もう一月もかからずに今回の400サイクル(計850サイクル)が終わるかと。
  ※850サイクル目にいったんデータをまとめます。
   電池を取り外せますんで、内部抵抗も計ります。

高容量電池群、突然死の傾向があるようですが、これらとはとは違い、
元祖エネループは、ゆっくりと寿命に近づいている感じがします。

エネループプロ(BK-3HCD)も突然死か?!168サイクル
富士通HR-3UTHC 2450mAh 250サイクル目で突然死か?!


それと・・・
ダイソーのReVOLTES単3では、典型的な偽の-ΔVが発生しました。
高容量電池群では、これを見ずに突然死しています。
エネループ・スタンダードがどうなるの・・・
偽の-ΔVを見せてくれるのか・・・

ダイソーReVOLTES単3 JIS C8708:2019充放電試験(-ΔV検出有) 偽の-ΔV発生
これが2020年4月14日の記事。



| | コメント (0)

2020年8月24日 (月)

Arduino PWM波形のデューティー比測定 これで完成形か?

とりあえず「シリアル出力」するデューティーサイクル
測定回路、これで完成形にしておきます。

・プログラム  ダウンロード - duty_checker4.c
  ※ファイルタイプを「.c」にしています。
   「.ino」だとArduinoのIDEが立ち上がっちゃうんで。

※改善点

・タイマー1のインプットキャプチャーでのカウント
 を16bitに。
 オーバーフロー割り込みとの衝突が無くなったので
 短パルスのミスが改善。 2μsのパルスも安定。

・しかし、16bitカウントにすると、低い周波数だとオーバー
 フローしてしまい、測定できなくなる。
   ※これを避けるために32bitカウントにしてた。
 そこでタイマー1のクロック(↑↓エッジでこれを数える)
 を16MHzだけでなく、外部からクロックを供給するように
 した。
 このクロックを下げると、低い周波数でもデューティーの
 測定ができる。
 
・Arduino UNOのD5とD11をつなぐ
      D5 PD5 T1    クロック入力
      D11 PB3 OC2A   8MHz~100kHzクロック出力

  タイマー1:インプットキャプチャー ICP1入力
   16MHz内部クロックあるいはT1外部クロック入力を切替

  タイマー2 :1/1でCTCモード OC2Aで方形波発生
   これをT1に接続 この出力クロック周波数を切替

Pp1

・周波数の選択はシリアル入力で。
 「0~7」の数字を入力すると切り替え。
   0 : 16MHz
   1 :  8MHz
   2 :  4MHz
   3 :  2MHz
   4 :  1MHz
   5 : 500kHz
   6 : 200kHz
   7 : 100kHz
 この8種類。 1Hz程度でもカウント可能。

・測定例 9600bpsでシリアル出力
  Duty cyc checker (2020-08-24) ←起動メッセージ
  CLK=16MHz            ←初期値
   12.50%  0.250kHz  8000 56004
   12.50%  0.250kHz  8000 56004 ←1秒ごとに表示
   12.50%  0.250kHz  8000 56003
  CLK=8MHz            ←1 数字入力
   12.50%  0.250kHz  4000 28002
  CLK=4MHz            ←2
   12.50%  0.250kHz  2000 14001
  CLK=2MHz            ←3
   12.50%  0.250kHz  1000 7001
  CLK=1MHz            ←4
   12.50%  0.250kHz  500 3500
  CLK=500kHz           ←5
   12.50%  0.250kHz  250 1750
  CLK=200kHz           ←6
   12.50%  0.250kHz  100  700
  CLK=100kHz           ←7
   12.50%  0.250kHz   50  350
  CLK=16MHz           ←0
   12.50%  0.250kHz  8001 56003
    |    |   |  +-- L区間パルス数
    |    |   H区間パルス数
  デューティ比 周波数

  Overflow pulse  ↑↓エッジ間に2回以上の
           タイマー1のオーバーフロー
           が起こった。
  No pulse     1秒内に入力パルスが無い。

※その他
 ・ICP1以外の割り込みは禁止。
 ・システムタイマーのタイマー0の割り込みも止めてるんで、
  一部のタイマー関数は使えない。
 ・シリアル送受信も独自のもので。
    serial.printは割り込みを使うんで。


※関連
Arduino PWM波形のデューティー比測定 妥協点
Arduino UNOのPWM出力を(ちょっと精密に)確かめる
Arduinoから「タイマー0」を取り上げる(ユーザーが使う)


| | コメント (3)

2020年8月21日 (金)

Arduino PWM波形のデューティー比測定 妥協点

あれこれ試してきましたが・・・
仕様的な妥協点を。

・最低測定周波数を下げる。
  現在は16MHzクロックを32bitのカウンタで
  数えています。
  本来、ATmega328Pのタイマー1は16bit。
  これを拡幅するために、オーバーフロー割り
  込みで32bitの上位桁をカウントアップしてる
  わけです。
  この処理がインプットキャプチャー割り込み
  の応答を遅らせています。
  ということは、16bitカウンタだけにして
  オーバーフロー割り込みを無くせば、
  短パルス測定時のじゃまが無くなります。
  その場合、16MHz/65536で約244Hzが1周期。
  タイマー1,2のanalogWriteのPWM周期、約490Hz
  もカウントできるかっと。

・低い周波数を計りたい時は
  インプットキャプチャーしているタイマー1の
  クロック周波数を下げれば対応できます。
  16bit分解能は同じ。
  TCCR1Bのプリスケーラ選択で、
   1/1 1/8 1/64 1/256 1/1024
  が選べますが、ちょいと飛びすぎ
  T1入力を外部クロックにできますんで、ここに
  タイマー2のアウトプットコンペア出力をつないで
  おけば、
   内部で1/1=16MHz 1/8=2MHz
   外から8MHz 1MHz 100kHz
  などとして、カウントクロックを選べます。

まぁ。こんなところでしょうか。

ArduinoのanalogWriteが出すデューティを計るということで、
あれこれ試しました。

しかしこの実験、もう一つ別の目的があるのです。
旭化成のAK7401 という磁気センサー。
  (360度グルグル回ります)
このIC、周波数1kHzのPWM出力で回転角を出力するのです。
その検証用ジグの試作に絡むのです。

2019年9月29日:360度グルグル回したろ
   ↑は3線デジタルでしたが、PWMでも出ているのです。
・PWMの良い所・・・フォトカプラで絶縁できる。

※関連
インプットキャプチャー割り込みを「ISR_NAKED」で (デューティー比測定)
Arduino デューティー計測のためのインプットキャプチャータイミング
Arduino UNOのPWM出力を(ちょっと精密に)確かめる
14pinのAVRマイコン、ATtiny24が動かん!
   ↑ これはPWM出力

※豆知識
Arduino、「analogWrite」のPWM周波数、
 タイマー0が約980Hz
 タイマー1と2が約490Hz
と、記されています。

なぜこの周波数か・・・もうちょい桁を増やして・・・
  タイマー0は   16MHz÷64÷256で976.5625Hz
  タイマー1と2は 16MHz÷64÷255÷2で490.1960784Hz
これそのままだと中途半端な周波数と感じますでしょう。

でも、逆数をとって「周期」にしてみると・・・
  タイマー0は1.024mS。タイマー1と2が2.04ms
むちゃすっきりした数字になるのです。
  ※このこと、皆さんあまり言ってないような・・・

| | コメント (0)

2020年8月19日 (水)

Arduino インプットキャプチャー割り込みを「ISR_NAKED」で (デューティー比測定)

2020年8月18日:Arduino デューティー計測のためのインプットキャプチャータイミング
これの「ISR_NAKED」による高速化、こんなコードでやってみました。

SBI、CBI命令を先頭と尻尾に持ってこれたので、
割り込みタイミングが鮮明になりました。 ★1
  ※これまではpush、popに隠れていた。
  
で、結果ですが↑↓エッジ間が42クロックくらいまでは
ミスなく取り込めるようになりました。 ★2、★3
これまで、64クロックがギリギリだったのを思えば、
ちょいと進歩です。
  ※タイミングなどはまた今度に


/***** タイマー1インプットキャプチャー割込 *****/
// ICP1の↓↑エッジでキャプチャー
// "ISR_NAKED"指定でpush,pop,reti,sreg処理を無しに
ISR(TIMER1_CAPT_vect, ISR_NAKED)
{
//  PB2_H;         // (!!!)
//  cnt_r = ICR1;      // キャプチャー値
//  XCG_EDGE1;       // 次にそなえて↑↓エッジをトグル
  asm volatile(
    "  sbi 0x05, 2      \n" // PB2 H ★1
    "  push r18        \n"
    "  push r19        \n"
    "  lds r18, 0x0086    \n" // ICR1 ★2
    "  lds r19, 0x0087    \n"
    "  sts cnt_r   , r18  \n"
    "  sts cnt_r + 1 , r19  \n"
    "  in r18, __SREG__    \n"
    "  push r18        \n"
    "  lds r19, 0x0081    \n" // TCCR1B ★3
    "  ldi r18, 0x40     \n"
    "  eor r18, r19      \n"
    "  sts 0x0081, r18    \n"
    "  push  r0       \n"
    "  push  r1       \n"
    "  eor  r1, r1     \n"
    "  push  r20       \n"
    "  push  r21       \n"
    "  push  r22       \n"
    "  push  r23       \n"
    "  push  r24       \n"
    "  push  r25       \n"
    "  push  r26       \n"
    "  push  r27       \n"
  );
// オーバーフロー有無
  if(CK_OVF1){      // 割込処理中にOVF発生したか?
    if(cnt_r < 160){  // 10uS(160ck)未満なら未処理のOVFがある
      cnt1_ovf += 1; // オーバーフローカウンタ+1
      CLR_OVF1;    // オーバーフローフラグをクリア
    }
  }
// カウント差を計算
  cnt1_n = (uint32_t)cnt_r +   // 32bitでカウント値
      ((uint32_t)cnt1_ovf << 16);
  cnt_d = cnt1_n - cnt1_x;   // 前回値との差分
  cnt1_x = cnt1_n;        // 次回用に残す
// ↑↓エッジをチェック
  if(CK_EDGE1){      // ↑になった H区間
    cnt1_caph = cnt_d;
  }
  else{          // ↓になった L区間
    cnt1_capl = cnt_d;
  }
  f_plsin = 1;      // パルス有フラグをon
// PB2_L;         // (!!!)
// "ISR_NAKED"復元
  asm volatile(
    "  pop  r27       \n"
    "  pop  r26       \n"
    "  pop  r25       \n"
    "  pop  r24       \n"
    "  pop  r23       \n"
    "  pop  r22       \n"
    "  pop  r21       \n"
    "  pop  r20       \n"
    "  pop  r1       \n"
    "  pop  r0       \n"
    "  pop  r18       \n"
    "  out  __SREG__, r18  \n"
    "  pop  r19       \n"
    "  pop  r18       \n"
    "  cbi 0x05, 2      \n" // PB2 L ★1
    "  reti          \n"
  );
}

※豆知識
・I/Oポートをビット操作するSBI、CBI命令ではフラグは変化しない。
 だもんでsregは変化しない。
・AVRマイコンには8bitレジスターが32個あるんだけれど、
 レジスターr0~r15はイミディエート命令が使えないのだ。
 LDIやANDI、ORIのような即値が扱えるのはr16~r31の
 16個だけ。


※追実験
ICR1レジスタ(インプットキャプチャー)を先に読むより、
↑↓クロックエッジを切り替える処理を先に持ってくる方が
良さそうです。★4

こんな具合。
  ※「asm volatile(」も「__asm__ volatile(」にしました。

ISR(TIMER1_CAPT_vect, ISR_NAKED)
{
//  PB2_H;         // (!!!)
//  XCG_EDGE1;    //★4 次にそなえて↑↓エッジをトグル
//  cnt_r = ICR1;      // キャプチャー値
 __asm__ volatile(
  "  sbi 0x05, 2     \n" // PB2 H
  "  push r18       \n"
  "  push r19       \n"
  "  in r18, __SREG__   \n"
  "  push r18       \n"
  "  lds r19, 0x0081   \n" // TCCR1B ★4
  "  ldi r18, 0x40    \n"
  "  eor r18, r19     \n"
  "  sts 0x0081, r18   \n"
  "  lds r18, 0x0086   \n" // ICR1
  "  lds r19, 0x0087   \n"
  "  sts cnt_r   , r18 \n"
  "  sts cnt_r + 1 , r19 \n"
  "  push  r0      \n"
  "  push  r1      \n"
  "  eor  r1, r1    \n"
  "  push  r20      \n"
  "  push  r21      \n"

これで「32クロック = 2us」のパルスを読めています。
読みが遅れても、直前の↑↓でキャプチャされた値が出て
くるので、うまく行ってる感じかなぁ。
   ※オーバーフロー割り込みと重なると・・・
    やっぱ、カウントミスが出ます。

クロックが短くなり、ミスカウントし出すとデューティが
ほぼ50%の値になり周波数が半分になってしまいます。
短クロックは検出しているんですが、
 「倍の周期でH/Lする方形波」
としてとらえているのでしょう。


※ICP1割り込みをOVF1割り込みがじゃまする様子

OVF1が重なってもちゃんと計測できた時。
A21

もうちょいOVF1が遅れると失敗。
A22

↓エッジへの切替が間に合わなくって、H区間の測定
ができなかった例です。

入力パルス周期とCNT1周期(4.096ms=約244Hz)との
重なり具合でOVF1がじゃまをするのです。

頻繁に発生するもんじゃないんで、この波形は
オシロスコープの組み合わせトリガー機能を使って
記録しました。
  ※ch1信号のHとch3信号のHをANDゲートして
   トリガー源に。


「ISR_NAKED」で見えるようになった割り込みへの応答。
これまでは、push命令に隠れてしまって本当の応答が見
えなかったわけで。
A23 
ジッターの周波数がざっと8MHz。
中心±16MHzということなんでしょうね。

| | コメント (0)

2020年8月18日 (火)

Arduino デューティー計測のためのインプットキャプチャータイミング

2020年8月16日:Arduino UNOのPWM出力を(ちょっと精密に)確かめる

2020年8月16日:Arduino UNOのPWM出力を(ちょっと精密に)確かめる
の中の、デューティー計測回路。
これはタイマー1のインプットキャプチャー機能(日本語訳だと捕獲入力)
を使って実現しています。
ICP1入力のパルスエッジ↑↓を捉えて、↑パルスを検出した時は
「L区間のタイマー1カウント値」、↓パルスを検出した時は「H区間の
カウント値」として、内部クロック16MHzを数えます。

16bitカウンタですので65535が最大。
周波数約244Hz以下のパルスになるとこれがオーバーフロ-します。
そこで、タイマー1のオーバーフロー割り込みを使って、32bit値の
上位桁をカウントアップ。
これで、10Hzや1Hzなどの低周波パルスでもそのデューティが測定でき
ます。

問題は、デューティーが「0%」や「100%」に近づいた時。
0%や100%ならLかHに固定しちゃうんで、「パルス無し」なんですが、
例えば「analogWrite」のval値を1や254にしたような時に、
「16MHz/64 = 4us」のHあるいはLのパルスが出てきます。
これの検出がギリギリなんです。

その様子。
上が入力パルス。(このくらいだと十分間に合う)
真ん中がPB2に出力したICP1割り込みの実行時間。
下がPB3に出しているオーバーフロー割り込みの処理時間。

Dt001

ポートを観察して見えるICP1割り込みの実行時間は6usほど。
しかし・・・パルスの↑↓エッジからPB2が現れるまで、2~3us
の時間がかかっています。
また、オーバーフロー割り込みが↑↓エッジの直前に入ると、
ICP割り込みの起動が遅れている様子が見えます。


この短パルス、もっと短くするとこうなってしまいます。
Dt004

↑↓エッジの切替処理が間に合わなくなり、デューティーの
測定ができなくなってしまいます。

この遅れの原因が「C言語」特有の「レジスタの待避処理」。
割り込み処理が始まると、割り込みで使うレジスタを全部
プッシュします。
この手順が遅れの原因。

「C」で書いている割り込み処理はこんなの。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/***** タイマー1インプットキャプチャー割込 *****/
// ICP1の↓↑エッジでキャプチャー
ISR(TIMER1_CAPT_vect)
{
uint32_t cnt_d;     // 差の計算用
word cnt_r;       // ICR1読み出し
  PB2_H;         // (!!!)
  cnt_r = ICR1;      // キャプチャー値 ★1
  XCG_EDGE1;       // 次にそなえて↑↓エッジをトグル ★1
// オーバーフロー有無
  if(CK_OVF1){      // 割込処理中にOVF発生したか? ★2
    if(cnt_r < 160){  // 10uS(160ck)未満なら未処理のOVFがある
      cnt1_ovf += 1; // オーバーフローカウンタ+1
      CLR_OVF1;    // オーバーフローフラグをクリア
    }
  }
// カウント差を計算
  cnt1_n = (uint32_t)cnt_r +
      ((uint32_t)cnt1_ovf << 16); // 32bitでカウント値
  cnt_d = cnt1_n - cnt1_x;   // 前回値との差分
  cnt1_x = cnt1_n;        // 次回用に残す
// ↑↓エッジをチェック
  if(CK_EDGE1){      // ↑になった H区間
    cnt1_caph = cnt_d;
  }
  else{          // ↓になった L区間
    cnt1_capl = cnt_d;
  }
  f_plsin = 1;      // パルス有フラグをon
  f_plsin2 = 1;      // min,maxチェック用
// 次の↑↓パルスが来てるかどうかのチェック
  if(CK_ICF1)   f_plsovl = 1;    // パルスがオーバーラップ
  PB2_L;         // (!!!)
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

★1の処理をできるだけ前に持ってきたいのですが、展開された
機械語はこうなってしまいます。

=============================
356 <__vector_10>:
356: 1f 92    push  r1
358: 0f 92    push  r0  
35a: 0f b6    in r0, 0x3f ;sreg
35c: 0f 92    push  r0
35e: 11 24    eor r1, r1   ;△
360: 2f 93    push  r18  ;△
362: 3f 93    push  r19  ;△
364: 4f 93    push  r20  ;△
366: 5f 93    push  r21  ;△
368: 6f 93    push  r22  ;△
36a: 7f 93    push  r23  ;△
36c: 8f 93    push  r24  ;△
36e: 9f 93    push  r25  ;△
370: af 93    push  r26  ;△
372: bf 93    push  r27  ;△
374: 2a 9a    sbi 0x05, 2   ;PB2
376: 20 91 86 00 lds r18, 0x0086 ;cnt_r = ICR1 ★1
37a: 30 91 87 00 lds r19, 0x0087
37e: 90 91 81 00 lds r25, 0x0081
382: 80 e4    ldi r24, 0x40  ;XCG_EDGE1 ★1
384: 89 27    eor r24, r25
386: 80 93 81 00 sts 0x0081, r24
38a: b0 9b    sbis  0x16, 0 ;if(CK_OVF1) ★2
38c: 0e c0    rjmp  .+28    ; 0x3aa
38e: 20 3a    cpi r18, 0xA0  ;if(cnt_r < 160)
 ※長いので以下省略
=============================

★1の処理をできるだけ前に持ってきたいのです。
そうすれば、短いパルスもちゃんと処理できるようになります。

10個ある△の「push命令」。
命令実行の手順としては、これを★1より後に下げても同じ。
先にpushしてるr0とr1でもって処理できます。

アセンブラで書けば自由になるんですが、「Arduino」の環境だと
如何とも・・・
   ↑
 ここらがhelp!でっす。

※豆知識
AVRマイコンの割り込み優先順序(同時に割り込み要因が起動し
た時、どっちが先に処理されるか)、割り込みベクトルの若い方
(先頭に近い方)が優先されます。
タイマーではオーバーフローより、コンペアマッチと
インプットキャプチャ-が優先されます。

リストの★、もう一つが★2。
これがオーバーフローの処理。
ICP割り込み処理の前にオーバーフローが発生し、その割り込み
処理が遅れても32bitのカウント値は正しく読めます。

※参考図
D21
しかし、ICP割り込みとOVF割り込みが同時、あるいは微妙な
タイミングならどうかというのを考えたのがこの図です。
D22

ICP割り込みで、
・OVF割り込みフラグが無ければクリチカルな問題は無し。

・処理されてないOVF割り込みフラグが残っていても、
 その時のキャプチャーカウント値が十分に大きければ
 クリチカルな問題じゃ無い。

・OVF割り込みフラグがあって、キャプチャーカウント値
 が小さい時は、微妙なタイミングが発生してる。
 その時は、ICP割り込み内でもオーバーフローの処理が
 必要。

こんな処理がICP割り込み内に必要です。
でもこれは↑↓エッジ検出から遅れても問題なし。

短パルスを捉えるため、ICP割り込みでまず優先しなくちゃ
ならないのはキャプチャーカウンタの読み出しと↑↓エッジ
検出の逆転処理です。


※Arduino環境で機械語命令をどう書く、というのが課題・・・

※調べてたらこんなのが・・・
 これで、解決できそうな。
    ISR(TIMER1_CAPT_vect, ISR_NAKED)

ISR_NAKEDを入れると、割り込みルーチンのpush、pop、reti、
それにsregのセーブとリストアのルーチンが全部無くなります。

ISR_NAKEDを入れる前と入れた後を比較して、抜けてる
処理を手で(インラインアセンブラで)入れ込めば
解決(★1処理をちょっとでも速く)できるかっと。

こりゃ面白い!

| | コメント (1)

2020年8月16日 (日)

Arduino UNOのPWM出力を(ちょっと精密に)確かめる

Arduino UNOが装備する、6つのPWM出力を確かめる
プログラムを書いてみました。
シリアルモニターでval値を入力するとその値(0~255)で
6つのPWMを出力します。

P11
※プログラム:ダウンロード - test_analog_wr1.c
(ファイルタイプを.cとしています)

現状、このようにATmega328Pが内蔵する3つのタイマーで
6つのPWM出力が得られます。

・タイマー0 OC0AとOC0B出力

8bit高速PWM動作でイニシャルされている。
val=0でL固定、255でH固定。
1でデューティ 2/256。 2でデューティ 3/256。
127でデューティ128/256。128でデューティ129/256。
254でデューティ255/256。
 ▼問題点
   val=1~254で欲しいデューティ値から1ずれる。

・タイマー1 OC1AとOC1B出力
・タイマー2 OC2AとOC2B出力

8bit位相基準PWM動作でイニシャルされている。
val=0でL固定、255でH固定。
1でデューティ 1/255。 2でデューティ 2/255。
127でデューティ127/255。128でデューティ128/255。
254でデューティ254/255。
 ▼問題点
   ベースが1/255なので、127あるいは128とセット
   してもデューティ50%が得られない。

■確認
タイマー1のインプットキャプチャー機能を使って、
ICP1に入力されたパルスのデューティー比と周波数を
計ってみました。

P12
プログラム:ダウンロード - duty_checker1.c
  (ファイルタイプを.cとしています)

1秒ごとにデューティ、周波数、H区間とL区間のパルス数
(Arduino unoの16MHzクロック数)をシリアル出力します。
   パルスが無ければ「No pulse」。
   ↑↓パルスが接近して割り込み処理が間に合わないと
   「Overlap pulse」と警告メッセージを出します。

Arduino基板を2枚用意して、PWM出力とICP1入力をつなぎ替えながら
↑の問題点を実際に見てみます。
  (ICPクロック同期の関係で1~2発のズレが出ます)

・タイマー0
 val=1
   0.78%  0.977kHz    128  16255
 val=2
   1.17%  0.977kHz    192  16191
 val=127
   50.00%  0.977kHz   8191   8192
 val=128
   50.39%  0.977kHz   8255   8128
 val=254
   99.61%  0.977kHz   16319    64

   このように、val値と実値が1/256ずれています。
   1/2デューティのつもりで128をセットすると129/256
   になってしまいます。
     ※もう一度言います。
        0.4%の誤差が勝手に発生するのです。

・タイマー1と2
 val=1
   0.39%  0.490kHz    128  32510
 val=2
   0.78%  0.490kHz    256  32382
 val=127
   49.80%  0.490kHz   16255  16383
 val=128
   50.20%  0.490kHz   16384  16255
 val=254
   99.61%  0.490kHz   32510   128

  1/255が設定単位で、1周期のベースが
  64*2*255=32640クロックです。
  そのため1/2デューティが設定できません。
  127でも128でも0.5/255ずれてしまいます。


●改善方法

・タイマー0
  前記事に書きましたように「反転動作」「255-val」と
  することで、val=0~255で正しいデューティー比
  得られます。
  また、val=0の時も0判定無しで0/256=L固定が得られます

  その確認
 val=1
   0.39%  0.977kHz    64  16319
 val=128
   50.00%  0.977kHz   8192   8192
 val=255
   99.61%  0.977kHz   16319    64

   ※プログラム例
    analogWrite( 5, val);    // PD5 OC0B
  のかわりに
    b = TCCR0A & 0b11001111;   // COM0B
    TCCR0A = b | 0b00110000;   // 反転出力
    OCR0B = 255 - val;       // top値255からの差で

・タイマー1、タイマー2
  残念ながら「8bit位相基準PWM動作」を使う限り
  改善できません
  タイマー0と同じように「8bit高速PWM動作」にイニシャルし
  直しでしょう。
  あるいは、タイマー1は「TOP値=ICR1による高速PWM動作」
  使えます。
  高分解能なPWMを得ることができますので、この利用をおすす
  めします。


※関連
2020年8月13日:Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMを使おう
2020年2月10日:ArduinoのanalogWrite 1/255なの?
2020年2月 4日:Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ





| | コメント (1)

2020年8月13日 (木)

Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMを使おう

※検索「arduino analogWrite」。

ArduinoのanalogWrite、「ちょっとおかしい」のではと書いたことがあります。
2020年2月10日:ArduinoのanalogWrite 1/255なの?

内容は、
・設定値に対し、デューティーサイクルの変化がおかしい
 場所がある。
 (これではアナログ値を出力する関数とは名乗れないぞ)

今回は、このあたりを掘り下げて自前の処理を目指します。
  ※とりあえずタイマー0を触りますが、このタイマー、
   システムが使っているんであれこれ利用できない
   関数が出てきます。
   そのあたりは、
   2020年1月28日:Arduinoから「タイマー0」を取り上げる(ユーザーが使う)
   を参考に。

現状のanalogWriteのおかしい所・・・
  0~255の8bit値でデューティ0%(全区間L)~100%(全区間H)を
  制御している。
  8bitのD/A値なら、1/256が分解能。
  5V電源で0Vからスタートして0~255まで値を変化させた時、
  「5V * (255 / 256)」が最大値。
  5Vより5/256V低い電圧(約20mV)が値255の時に出てくるはず
  でそこで打ち止めなんだけれど、これ(255の時)を無理やり
  5Vとしている。
  どこかで1/256狂ってる
  これをanalogWriteというのはちょっと。

※どんな処理がされてるかは前記事をご覧ください。

その根本なのが「TOP値255の高速PWM動作」(モード3)にイニシャル
されたタイマー0と「非反転動作での出力制御」かと。

8bit D/Aコンバータの代わりになるようなPWMだと、どんな信号に
なるかというと。
  0 → デューティ0%で 全区間L
  1 → デューティ 1/256%
  2 → デューティ 2/256%
  :
 128 → デューティ 128/256% = 50% 方形波
  :
 254 → デューティ 254/256%
 255 → デューティ 255/256%
  ここでおしまい。 全区間Hはなし

ところが現状のanalogWriteは「1が2/256」「2が3/256」になっ
ていて、そのまま続いて「255で全区間H」となっています。
  ※わずか「1/256」の違いと言うなかれ。
   「0.4%」の「誤差」ですぞ!

この「1が2/256」になってしまう原因、これが「高速PWMモード」
の「非反転動作での出力制御」なんです。

このモードで「0」をタイマーのOCR(output compare register)に
書いても「全区間L」の出力は得られず、「0でも1/256」、
「1で2/256」になってしまうのです。

そして「255」なら強制的な全区間Hの処理は必要なく、タイマー
のOCRを255にするだけで、出力は256/256になって全区間Hの信号
が出てくるのです。

その対策。(本来、AVRマイコンの定石のはずなんだけど)
「非反転動作」ではなく「反転動作」の出力制御を使います。
すると・・・
  0 → 255/256
  1 → 254/256
  :
 254 → 1/256
 255 → 0/256 全区間L

反転動作をさせて、8bitの入力値val(0~255)をTOP値(255)から
減算した値をOCRに書くのです。

val=0は255となって全区間Lに。
1は254で1/256に、254は254/256、255は255/256となり
欲していた8bit D/Aの動作が得られます。

残るのは「全区間H」。
これは簡単です。
analogWriteの入力valの型は「int」。
だもんで、8bit内の0~255は0/256~255/256のデューティーで出力。
8bitを越える値は全区間H出力(ポート操作で)。
入力valの値、「0~255だけじゃなく、256も許容しちゃえ」という
全区間Hを得るための処理。
不正確さに目をつむるより、これもありでしょう。

「反転動作の出力制御」とこの数値判断だけで、正確なPWMによる
アナログ出力と出力H固定の処理ができます。

・・・言葉で言ってもよく分からないんで、データシートのこの図
を見てもらいながら、実際に動かしてみます。

A2_20200813132901

※テストプログラム : ダウンロード - test_pwm0_2.c
  (ファイルタイプ、.inoじゃなく.cにしています)

Arduino UNOはこんな回路に。

A1_20200813132901

・0~9を設定できるロータリーDIP SWをつなぐ
・8bitのタイマー0とタイマー2を使い、タイマー0を
 非反転出力動作で、タイマー2を反転出力動作で。
・TOP値が255だとわかりにくいので、波形生成モードを
 「7」のTOP値をOCR0Aで設定する高速PWM動作に。
トップ値は0~9をカウントする「9」に
・PWM出力はOCR0BとOCR2Bに出てくるのでこれを観察。
・OCR0AとOCR2Aはオシロのトリガー源に。トップ値でトグル。

ロータリーDIP SWを回すとこんな波形が得られます。

A3_20200813133001
上側の非反転動作が現状の処理。
下側の反転動作が今回の信号処理。
TOP-valの値(右側の(9-n)の値)で、正しいD/Aの動きが得ら
れるのがわかるかと。
半値5で、ちゃんと50%デューティになっています。

実際の信号をオシロで見るとこんな具合。
信号は上からOCR0B、OCR0A、OCR2B、OCR2A。
  (OCR0AとOCR2Aはトリガー源で方形波)

非反転と反転動作の違いは一番上と3番目に注目。

まずスイッチ=0。 デューティ10%と90%に。
B000

スイッチ1になると、デューティ20%と80%。
B001

スイッチ4で両方ともデューティ50%。
B004

スイッチ8で90%と10%。
B008

スイッチ9で全Hと全Lに。
B009

いかがでしょうか。
反転動作を使ってTOP値からの減算データをOCRに与えれば
まっとうなD/Aになるということが。

analogWriteの処理のように非反転動作のままでということなら、
 ・0の時は強制的L出力。
 ・1~255は「-1」して処理。これで1/256~255/256に。
 ・全H出力したいのなら、提示したval=256を許容する
  処理で。
というふうになるでしょうか。

0~255でまっとうな8bit D/A出力をということなら、
反転動作で「255-val」をOCRにというのがシンプルな
考え方で正解かと。
  ※分解能の高い↓のタイマー1の処理にも絡みます。

さて、示したのは8bitのタイマー0とタイマー2でしたが、
タイマー1は16bitです。
レジスタを直接操作すれば、ちょいと高性能な12bitや14bitの
D/Aコンバータが簡単に構成できます。
ここではなおさら「反転動作」でのD/A処理が正解かと。

2020年5月21日:JIS C8708:2019充放電実験回路
の制御プログラムを見てもらえれば、タイマー2のPWMで
12bit D/Aコンバータを作り、充電電流と放電電流を制御している
様子が分かるかと。
精度が上がると基準電圧も大事で、どうやってPWMから得ているか
回路図も参考にどうぞ。

これも参考に

2020年8月11日:14pinのAVRマイコン、ATtiny24が動かん!
 タイマー0をTOP値99のPWMで使ってます。

2020年8月10日:オリンパス OM-D E-M1mk2の充電器の充電表示ランプを判別その2
 R/2RのD/AをやめてPWMに変更。

| | コメント (12)

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)

2020年8月10日 (月)

オリンパス OM-D E-M1mk2の充電器の充電表示ランプを判別その2

2020年8月6日:オリンパス OM-D E-M1mk2の充電器の充電表示ランプを判別
コメントに記してましたように、これをさらに手直し。
R-2RのD/Aではなく、PWMで電圧出力を得ることにしました。
こんな回路。
L32
OC0B出力を使ってデューティー可変のPWMを出します。

内部クロック4.8MHz÷64÷75で1KHzを作っています。
この0~74/75でPWMのデューティサイクルを得て、LPFで直流化。
0.1Hz単位で計った周波数をそのままPWMの設定に使いました。
周波数で出力電圧を区分する必要がなくなっちゃった。

新プログラム:ダウンロード - em1_chg_pwm1.zip

前のR-2R D/A出力方式でのプログラム
D/A出力周波数を判断するルーチンが入っている

// フォトセンサー入力onエッジをチェックして周波数を算出
 if(f0.pson){       // onエッジあり?
  f0.pson = 0;
  cnt = cnt_1ms;     // エッジ間の周期
  cnt_1ms = 0;      // 1msクリア
  if((cnt != 0) && (ps_cnt >= 4)){ // 4発目以降のパルスで有効
   frq = 10000 / cnt;       // 0.1Hz単位の周波数
   if(frq < 8)     da = 0;   // 0.7Hz down
   else if(frq < 15)  da = 1;   // 0.8~1.4Hz 0.6V
   else if(frq < 25)  da = 2;   // 1.5~2.4Hz 1.3V
   else if(frq < 35)  da = 3;   // 2.5~3.4Hz 1.9V
   else if(frq < 60)  da = 4;   // 3.5~5.9Hz 2.5V
   else        da = 0;   // 6.0Hz up
   if(dax == da)    daout(da); // 前回値と同じならD/A出力
   else{              // 変化した
     dax = da;          // 前回値セット
     ps_cnt = 0;         // onエッジカウンタクリア
   }
  }
  if(ps_cnt < 255)  ps_cnt++;    // onエッジ回数+1 (max 255)
 }
 else{              // フォトセンサーonエッジなし
   if(cnt_1ms >= 2000){    // 2秒経過
     cnt_1ms = 0;      // 1msクリア
     ps_cnt = 0;       // onエッジカウンタクリア
     if(f0.psinp)  da = 5;   // LED on 継続 D/A = 3.1V
     else      da = 0;   // LED off 継続 D/A = 0V
     daout(da);         // D/A出力
     dax = da;          // 前回値も
   }
 }


今回のPWM方式。
1KHzを出すのに1/75してるんで、ちょうどうまいこと得られた周波数を
そのままセットすれば可変電圧が得られます。

// フォトセンサー入力onエッジをチェックして周波数を算出
// 2秒間エッジがないとスタンバイあるいは充電完了
 if(f0.pson){       // onエッジあり?
  f0.pson = 0;
  if(ps_cnt < 255)  ps_cnt++;   // onエッジ回数+1 (max 255)
  cnt = cnt_1ms;     // エッジ間の周期
  cnt_1ms = 0;      // 1msクリア
  if((cnt != 0) && (ps_cnt >= 4)){ // 4発目以降のパルスで有効
   frq = 10000 / cnt;       // 0.1Hz単位の周波数
   pwmout(frq);          // 周波数でPWM出力
  }
 }
 else{            // フォトセンサーonエッジなし
  if(cnt_1ms >= 2000){   // 2秒経過
   cnt_1ms = 0;      // 1msクリア
   ps_cnt = 0;       // onエッジカウンタクリア
   if(f0.psinp)  frq = 60;  // LED on 継続 6.0Hz相当(4V)で[充電完了]
   else      frq = 0;  // LED off継続 0Hz=0V出力[スタンバイ]
   pwmout(frq);        // 周波数でPWM出力
  }
 }

| | コメント (0)

富士通HR-3UTC(1900mAh) JIS C8708:2019充放電実験400サイクル目

2020年5月20日に開始した)富士通HR-3UTC(1900mAh)
JIS C8708:2019充放電実験開始、400サイクルが終了しました。

11_20200810093501

グラフを見る限りまだまだ大丈夫。
電池の内部抵抗、初期が15mΩ
それが400サイクルの充放電で42mΩまで上昇していました。

50サイクルごとの「0.2C放電」はこんなグラフ。

V0400

そして、1~49サイクルごとの、充放電時間と充電完了電圧の変化は
こんな具合。
Tv0400

まだまだ行けます。
引き続き、800サイクル目に向かっての充放電を始めました。


比較対象は同じ1900mAhの
2020年7月 7日:パナソニックeneloopスタンダード単3、JIS C8708:2019充放電テスト450サイクル目
でしょう。
こちらは、現在632サイクル目。



| | コメント (0)

2020年8月 8日 (土)

東成図書館の蔵書「博士の愛した数式」

ついさっき、リクエストしてあった本を取りに行った東成図書館。
帰りの下りエレベータで・・・
   ニタニタしちゃいました。
私が怪しいおっさんじゃなかったら・・・
   絶対に声をかけていたことでしょう。

私が先に乗り込んだエレベータ、扉が閉まる直前、
中学高学年か高校生くらいの歳の女の子が飛び入ってきたのです。
きっと乗るんだろなっと思ったんでエレベータの「開」ボタンを
押しました。

ぺこりと頭を下げてくれたその少女。
手に持っていた本が 小川洋子さんの『博士の愛した数式』
東成図書館の蔵書シールが貼ってありましたんで、書架で見つけ
られたのか・・・

「この本、なんで知ったんですか?」とか、
「選んだ理由は?」とか「面白いですよ」とか
「数学、好きなんですか?」などと、聞いてみたかった・・・

 

| | コメント (4)

2020年8月 6日 (木)

オリンパス OM-D E-M1mk2の充電器の充電表示ランプを判別

オリンパスのミラーレス一眼、OM-D E-M1mk2付属の
充電器が「BCH-1」。
この充電の進み具合を記録するため(電池温度、電源電流)
その充電表示ランプの状態を記録に残したい!というテーマが
出てきました。

充電器も電池も真っ黒け。
B11
状態表示LEDが一つ付いています。
このLEDで充電の進み具合を表示します。

Bch1

消灯、点滅、点灯。
この点滅周波数で充電の進み具合を示します。
こんなイメージ。
L11_20200806155901
これをアナログ値にすれば、レコーダーで記録できます。
充電器のLEDをフォトトラで受けて、点滅パルスをモノマルチで
「F/V変換」。
消灯と点灯を区分すれば、なんとかなるかとハードで考えたのが
この回路。
L12_20200806160101

F/V用のモノマルチと、点滅検出用のモノマルチ
二つで構成します。
タイミングは、こんなイメージ。
L13_20200806160201

どうしたものかと思案してたんですが、マイコンを使う方が
簡単か!っということで、描いたのがこの回路。
L14
「R-2R」のD/Aコンバータでもって、点滅状態を
アナログ出力します。
プログラムはしなくちゃならないけれど、このほうが
簡単か!

※こんな回路に落ち着きました。

L31
内蔵クロックの周波数が15%ほど低かったので、
OSCCALをちょいと触りました。
  いくら簡易型とはいえ、周波数(周期)を計
  るんで。
そのためのチェックモードを入れてます。

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


★続き:PWM方式でLEDの点滅周期を電圧出力
  こっちのほうがハードもソフトもシンプル。

| | コメント (2)

エネループ・プロ(BK-3HCD:2500mAh) 60%放電で実験開始

2020年7月3日:パナソニックeneloop pro(BK-3HCD) JIS C8708:2019充放電実験スタート の、2020年7月7日11時07分に記したコメント、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
この記事の↓
「放電深度を60%から100%にしたら寿命が10~15%に減る」
を確かめてみたいのです。
10~15%の逆数は10倍~6倍。
ほんとにそうなる?
さて、10倍~6倍に寿命が延びるのか?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

放電時間が6割に減るんで、単純にその逆数の1.67倍は伸びるはずです。
パナの仕様だとエネループ・プロは150回。
それが250回になってあたりまえ。

「放電深度を60%から100%にしたら寿命が10~15%に減る」だと、
150回が900回~1500回に。

はたしてどうなるのか?
今から1~2ヶ月、様子を見守ってください。
  ※実験開始前の内部抵抗:17mΩでした。


ここに出てくるグラフ↓が正しいのか?
http://igarage.cocolog-nifty.com/photos/uncategorized/2019/03/05/11.png
そんなうまいこといかんのか?
東芝インパルス TNH-3Aでは
1.0Vまで放電と90分あるいは1.1Vまでの2種を試しました。
しかし、この時は抵抗で放電を行っていたので、放電電流は
管理できていません。
今回の回路は定電流回路ですので、時間で規制すれば電池から
引き出す電流値を固定できます。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※参考  JIS C8708:2019充放電実験回路
★印のパラメータを2時間定格の6割、72分に設定します。

  ※1は電池により設定
# 1 1Cg  0.5CmA  1250 :1cyc   0.5C 充電電流設定値(mA) ※1
# 2 2-49Cg0.5CmA  1250 :2~49cyc 0.5C 充電電流設定値(mA) ※1
# 3 50Cg 0.1CmA  250 :50cyc  0.1C 充電電流設定値(mA) ※1
# 4 1-48Dc0.5CmA  1250 :1~48cyc 0.5C 放電電流設定値(mA) ※1
# 5 49Dcg 0.5CmA  1250 :49cyc  0.5C 放電電流設定値(mA) ※1
# 6 50Dcg 0.2CmA  500 :50cy   0.2C 放電電流設定値(mA) ※1
# 7 1Chg  Time  132 :1cyc   0.5C 充電時間 (分) 132分:2時間12分
# 8 2-49Chg Time  132 :2~48cyc 0.5C 充電時間 (分) 132分:2時間12分
# 9 50Chg  Time  960 :50cy   0.1C 充電時間 (分) 960分:16時間
#10 1-48Dcg Time   72 :1~48cyc 放電時間 (分) 3時間くらい ★
#11 49Dcg  Time   72 :49cy   放電時間 (分) 3時間くらい ★
#12 1-49Chg Wait   20 :1~49cyc 充電後待ち時間 (分) 20~30分
#13 1-49Dcg Wait   10 :1~49cyc 放電後待ち時間 (分) 10~90分
#14 50Chg  Wait   60 :50cyc  充電後待ち時間 (分) 60~240分
#15 50Dcg  Wait   60 :50cyc  放電後待ち時間 (分) 十分な
#16 V-Stop 1-48   100 :1~48cyc  放電停止電圧 1.00V
#17 V-Stop 49    100 :49cyc   放電停止電圧 1.00V
#18 V-Stop 0,50   100 :0cyc,50cyc 放電停止電圧 1.00V
#19 -dV mV      10 :-ΔV (mV) 5,10mV
#20 -dV DelayTim   10 :-ΔV 検出開始時間 (分)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

※5サイクル目までの様子
Cd005
1サイクル目の充電は、直前に「0.2Cで1.0Vまで放電」が
実行されたので(空っけつになった)、定格容量まで充電が
行われている様子が出ています。
1サイクル目の放電から72分で停止。
その次の充電が80分くらいして「-ΔV検出」で止まっています。

電池あれこれ

| | コメント (1)

2020年8月 5日 (水)

エネループプロ(BK-3HCD)も突然死か?!

パナソニックeneloop pro(BK-3HCD) JIS C8708:2019充放電実験スタート
したのが7月3日。
ざっと1ヶ月経過しました。  が・・・・
ついさっきチャートを見たら、異常事態が発生してます。

C21
現在、169サイクル目の充電を行っています。
その直前の放電で、十分に放電されなかったような感じです。

充放電テストを始めた直後はこんなチャートが出ています。
C22
1サイクルが4~5時間くらいで1日あたり5~6サイクルが
進みます。
それが150サイクルを越えたあたりから、徐々にサイクル時間が
短くなってきて(充放電時間が短く)、「そろそろ寿命か?」を
感じていました。

富士通の高容量電池では、
富士通HR-3UTHC 2450mAh 250サイクル目で突然死か?!
なんてことがありました。
エネループプロでもこれと同じような「異常」でしょうか・・・

※パナのスペックでは、旧JISで500回、新JISで150回が示されています。

もうちょいサイクルを進めてから、電圧変化記録を取り出します。

※内部抵抗・・・479mΩまで上がっていました。

※最後の0.5C放電、こんな様子です。

#166cyc  定格が2500mAhですんで1.25Aで放電します。
  1 1.110
  2 1.122
  :
  :
  :
 77 1.027  0.5Cですんで、定格だと120分。
 78 1.019
 79 1.010  166cyc目は1.00Vまで79分間で放電。
 79 1.000  まだ大丈夫そうですが・・・

#167cyc    ところが、167cyc以降は放電開始後
  0 0.994   すぐに(1分たたずに)1.00Vまで電圧が低下。

#168cyc   突然死の様相です。
  0 0.965

#169cyc
  0 0.974
 ↑  ↑
 |  +- 放電電圧(V)
 +---- 放電時間(分)

※充放電時間と充電停止電圧のグラフ
Tv0170

緑線に注目すると・・・
150cyc目の0.2C放電のあと、なんとなく劣化が
進む様子が見えて・・・167cyc目で突然死(内部抵抗
の上昇で放電開始直後に1.00Vまで電圧が低下)して
しまったのが記録に残りました。

新しいJIS C8708:2019での寿命試験、大容量
ニッ水電池での突然死はこれで2つ目。
JIS本来は50サイクルごとの0.2C放電での結果を見て
寿命と判断するわけなんですが、どうも様相が異なります。
徐々に劣化するんじゃなく、ほんとに突然死。
繰り返し充放電で急激に劣化するメカニズムがあるので
しょうか?

※0.5C放電での放電維持電圧の変化
D170
100サイクルはまっとうに使える感じ。
しかし、そこからちょい怪しく・・・
150サイクルを越えたあたりからヘロヘロに。



| | コメント (1)

YS-11も

2020年7月28日:この機体は? A320? B767?と同じ日の写真。
YS-11 を写してました。

11_20200805035701

拡大↓
12_20200805035801

もう飛んでないんですよね。


| | コメント (2)

2020年8月 1日 (土)

敬老祝賀会中止

毎年、敬老の日に地元で行っている「敬老祝賀会」、COVID-19で中止です。

でも、敬老記念品は配布します。 (70歳以上の方に対し)
我が町会を調べますと・・・  (約110世帯の町会です)

・記念品をお配りする70歳以上の方 : 61名
・そのうち90歳以上の方      : 4名

※注目点

・年齢上位の方をピックアップすると・・・
 1番目から10番目の10名が女性。
 そして、11番目の男性が85歳。
・70歳以上の61名の中で男性は23名。
 つまり、70歳以上の62パーセントが女性。


| | コメント (0)

導通チェッカー 使用レポート

仕事場で頒布しているマイコン型導通チェッカー、
  ・マイコン型導通チェッカー、10年目に(2018年4月6日)

新潟のIさんから非常に詳しい使用レポートを頂戴しました。
  ※過去、2台買ってもらっていまして、今回が3台目。

かいつまんで・・・   ※【 】は私からの返信
  ※他社製チェッカーのお話しが面白いです。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
私、これまでにBZ1とBZ2(アンプ付き)のキットを一台ずつ売ってい
ただきました。
毎日制御盤、配電盤、計装盤、基板、ワイヤーハーネスの検査をして
います。
大きなものや両面の盤などの場合はチェッカーを2,3台同時に使った
りしますので、2台とも毎日大活躍です。
ありがとうございます。

BZ2を組み立てるとき、よく落としたりするので(マグネットなんか
で盤面に固定したり、フック見たいのでぶら下げたりすれば良いのか
もしれませんが)、ケースをタカチのLCTシリーズ(シリコンカバー
付き)に入れ代えて製作しました。

新しいアンプ付きのBZ2ですが、冬の間、テストリードが少し動いたり
すると(床なんかとこすれたり?)、頻繁に"BZ2"のモールス信号が発
生することが続きました。BZ1の方はそのようなことはありません。
不思議です。
きっと自分のはんだ付けに甘い所があるのかもしれません。
ノイズ?、
春先から今まで調子よくピタッと出なくなったので、恐らく静電気の
悪戯ではと思っています。
今後もしばらくこのまま様子を見ます。 ・・・【1】

今まで各社さんの製品を買ったり、ネットに公開されている回路を
参考に、簡単なものから高級なものまで10台ぐらい作りました。
どれも一長一短あり、これぞ!というのはなかなかありません。

盤屋さんや工事屋さんが良く使うもので、
「ネグロス電工のピーポーマン(BT1)」 があります。
これは抵抗値で音が変わるタイプです。
これに使われているスター精密のSMBシリーズの1.5Vのをパーツ屋
さんで買ってきて使ってましたが、1.5Vのためか、次第に鳴り始め
の動きが悪くなってきたり、メカニカルブザーなので落としたいす
ると壊れやすいので、違うものをと模索しだしたのが病気の始まり
です(笑)。
スター精密さん、撤退しちゃったし、、、。

同じくサンデンのサンチェッカー SP-1NとSP-1NA  (カナデン
さんやユーボンさんで売っている)のSP-1NとSP-1NAをもってま
すが、どちらも3V出てるのが気になります(電子回路には)。

SP-1NAは音が変わるタイプで、小さいトランスなら判別できますが、
2kVAとか(200-100Vの制御電源用のダウンのトランス)にな
ると、DCRは零に近くなるので、さすがにお手上げです。
ですが何かと役に立ちます。
回路を現物から起こして、同じものを作りました。
上手くいきました。
超低電圧な回路でもなければ大丈夫かと。

ねじ締めトルクの管理がうるさかったり、ねじのマーキングがズレた
りするので、できるだけ線が繋がった状態でチェックしたいんです。
そのような場合はマルチメータの出番です。
但し抵抗測定で。
マルチメータの導通ブザーは、9V電源のものなど、高い電圧が出てて
気持ちが悪いって人が多いようですね。
短絡電流は不思議と1mAのが多いみたいですけど。

アイデンさんのエレスターET2010これは少々お高かったです。
机上で基板の検査なんかにはよいかもしれませんが、何せ音が小さ
いので、うるさい工場で盤の検査には少々きついものがあります。
 【記】これの電源の入り切りはパネル面にある小さな
    トグルスイッチで、オートパワーオフにはなっ
    ていないとのことです。
    オフにしなくて良いくらい、スタンバイ時の消費
    電流が小さいのかもしれませんが、Power LED表示
    は点灯していてそうです。
    メーカーの仕様の電池寿命は、
      短絡状態(ブザーON)で連続600時間以上
      (アルカリ乾電池使用時)
    となっていて、スタンバイ時の状態が記されて
    いません。

先日、Martindaleという英国のメーカーのTEK404というのを買いま
した。
開放電圧が9Vとなっていて、(電源9V電池)、測ってみると不思議
なことに、測るマルチメータによって違い、9V弱だったり、5Vぐ
らいだったりします。ただ短絡電流が小さいのが救いですが。
音が大きいのが売りで、中を見るとバカでかい圧電ブザーが付いて
ますが、そのせいか、鳴り始めの音が小さく反応が遅いので、イラっ
としてしまいます。

自作のはトランジスタを2,3個使った定番のもの、555で組んだ
これも定番のもの、オペアンプを使ったものを作りました。
555のものは、テストリードを手で持つと、ぽつぽつぽつと雨だ
れのような発振音が出て不快です。
裸のケーブルのチェックなど、両手でそれぞれテストリードとワー
クを指先でつまんでチェックするような場合はこの音が嫌になります。
(こうするといちいちクリップで挟んだりするより早くチェックで
 きるので)
オペアンプを使ったものは最初は良いのですが、不思議なことに何
故かすぐ壊れてしまいます。

そこいくと、アクトさんのは本当に素晴らしいです。
高性能なのにこのお値段で買えるなんてありがたい限りです。
マグネチックサウンダは音が大きくて、我々盤屋さんにはピッタリです。
音もきれいで反応が早いのもいいですね。

既製品、自作品とも、鳴り始めや、テストリードが軽く触れた(押し
つけが足りない)時なんかにガサガサ言わない(ボリウムにガリのあ
るラジオみたいなあれです)のが特に素晴らしいですね。
ちゃんと鳴る、鳴らないがはっきりしてるのがいいです。
この様なのは他になかなか見当たりません。  ・・・【2】

~~~~~~~~~~~~~~~~~~~~~~~~
【1】
 「頻繁に"BZ2"のモールス信号が発生する」との
 ことですが、電池と電池電極との接触状態ではあ
 りませんか?
 電池の±と電極のアタリ具合やスプリング電極
 根元のカシメ状態とか。
 "BZ2"は、電源投入の時にしか出ないので、電源
 ラインが再オンしたという証です。
 ノイズでのリセットは考えにくいです。
 電池でないとすると、ICソケットあたり(挿入
 具合やハンダ付)でしょうか。
 電池カバーと電池間にスポンジを入れて動きに
 くくしてみるというのも方法かと。

【2】
 内部写真、ありがとうございました。
 うまく収まりましたね。
 やはりバナナジャックのほうが使い勝手がよろし
 いでしょうか。
 BZMの特徴、こんなところ↓かと考えています。
・電源スイッチをオンしなくても勝手にオン。
 放っておいたら勝手にオートパワーオフ。
   (導通チェックをしていたら時間を延長)
・通電しているラインに触っても壊れない。
 この2点が他の回路にはない特徴かと思っています。
 実際に使われて、いかがでしょうか?
~~~~~~~~~~~~~~~~~~~~~~~~

オートパワーオンオフは、面倒がなくてすばらしいですね。
回路によっては低消費電流で、待機電力が少なく、バッテリーの
消費を気にしなくても良いのもあるみたいですね。
(電源スイッチを付けない人もいる。)

通電時は抵抗値測定や導通チェック禁止が身に付いているので、
保護回路の恩恵に預かったことはまだないです。

穴あきの端子だと、適当なリードを皮剥いてつなげるのでいいです。
数メートル引っ張るので。
机上では既製品のテストリードに付け替えたり出来るし。
とにかく音が大きくキレイで、レスポンス素早く、ガサガサ言わな
いのが最高です
??ありがとうございます??

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※タカチのプラケースLCTに組み込まれた様子
11_20200801164701
12_20200801164701
  ※基板のサイズ、ネジ止め固定位置が異なりますんで、
   工夫が必要です。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【感想】
他社製導通チェッカーのお話しが興味深かったです。
私とこでも手放せないのが松下のホロホロブザー。
単3電池2本で電子ブザーを直接鳴らすという単純な構造です。
   (電源スイッチなんか不要、という見本)
音も大きい。つなぐ抵抗値で音色が変化。
そして、LEDの極性チェックに便利なんです。
VF電圧の高い青色LED、白色LEDでも反応してくれます。
ただし、電子回路のつなぎをチェックするには電圧が高いし電流
も大きいしということで×なんです。
制御盤の配線チェックにはこれで良いかと思うんですが、もう
売ってません。

※ホロホロブザー関連 (旧ブログのは動画が消えてます)
修理:2.5Φステレオ・プラグGND部断裂
13年使ったマンガン電池

| | コメント (0)

« 2020年7月 | トップページ | 2020年9月 »