2020年2月17日 (月)

定電流回路の電流検出抵抗

JIS C8708:2019充放電試験回路製作中、この中の定電流回路
(充電用と放電用の2つ)この電流検出抵抗をあれこれ模索。
今回使ったのは手持ちの関係で5W・0.3Ω。
その発熱が悩みどころ。

セメント抵抗に電力を食わせた時の温度上昇。
こんなグラフが出ていました。

B0
https://www.e-globaledge.com/products/ecomponents/tdo/

温度特性が「±400ppm/℃」。
ということは、10℃変化で0.4%。
触れないくらいの50℃も上がると2%の変動。

電流検出抵抗としてはちょいとなぁ~なんですが、
とりあえず手持ち部品の関係で「5W0.3Ω」というのを
用いました。

今回の回路、最大1.5Aで0.3Ωだと0.7Wほど。
5W定格の14%ほど。
十分に定格内なのですが、↑のグラフを見ると、
上昇温度が30℃ほどと読み取れます。
ということは抵抗値として1%ほどの変動を覚悟しな
くてはとなります。

仕事の装置ではこんな抵抗を使っていました。
   ※手持ちが無いので今回は使えなかった。
B1_20200217091601
「PWR4412」という金属でできたコの字のバー。
これで「±20ppm/℃」。
ただし、ラインナップされている最高の抵抗値が「0.1Ω」。

抵抗値を小さくすると、電力が減って発熱も少なくなりますが、
定電流回路の制御電圧を下げなければなりません。
今は制御電圧0.5Vで1.6A。
電流検出抵抗を0.1Ωにすると、0.16Vで1.6Aという制御に
なり、ちょっと電圧が低いかな~というところです。


※参考
ねがてぃぶろぐ セメント抵抗の温度特性 その1
ねがてぃぶろぐ セメント抵抗の温度特性 その2

※追記
手持ちの「コの字状抵抗」を引っ張り出してきました。
11_20200218090301
30mΩのと50mΩのが各2つ。
調べてると・・・
PWR4412」、廃番になってました!
えらいこっちゃ。
代替品を探さなくてはなりません。

ビシュイでSR3R、SR5Rというのが使えそう。
ちょいと温度係数が悪いか・・・。
SR3R(3Wタイプ)だと0.1Ωがある。
RiedonというメーカーでMSR5というのでも0.1Ωがある。

抵抗値を小さくすると、同じ電流なら電力がダウン。
1.5Aで0.3Ωだと0.675Wだったのが、0.1Ωにすると0.225Wに。
これで、発熱がずいぶんと減ります。
↑にあるグラフのように「負荷率に対する温度上昇曲線」あれば
発生誤差が推定できるんですけれどねぇ。

| | コメント (4)

2020年2月16日 (日)

JIS C8708:2019充放電試験回路製作中

ざっとハードが固まりました。
制御プログラムをごそごそしています。

A2_20200216162501

0.5Cで充放電させる必要があるので、設定できる最大を1.6Aに
しています。

A1_20200216162501
充電側のヒートシンクをもうちょい大きくしたいところ。




| | コメント (0)

2020年2月13日 (木)

マイコン型導通チェッカー、頒布しています。

2018年4月にマイコン型導通チェッカー、10年目に という記事を書いてます。
  ※現在も(有)アクト電子で頒布しています。
先日も、「新人の研修で使いたい」ということで、まとまった数の注文を
いただきました。 ※ありがとうございます。
ケース加工も丸穴だけだし、回路のハンダ付けや組み立ても難しくありません。
  ※面実装ICはこちらでハンダしてます。
組み立てておけば、電子回路工作で役立つ一生もののツールになること間違い
なしです。
回路図もソースファイルも(アセンブラですが)公開してますし、教材として
の価値もあるかと。
どうぞご検討ください。

※「導通チェックなんてテスターに付いてるやん」という意見もありますが、
 このチェッカーの手軽さは、実物で体験してもらわないと分かってもらえ
 ないかな。

そうそう。郵便局のクリックポスト が4月から198円に値上げです。
(現在は188円)

| | コメント (0)

2020年2月10日 (月)

ダイソーReVOLTES単3 JIS C8708:2019充放電試験 400サイクル目完了

ダイソーReVOLTES単3 JIS C8708:2019充放電試験 200サイクル目完了
の続き。 400サイクル目、完了です。

0400
400サイクル目で、放電持続時間が2時間ほどに。
寿命と判断して、今回の実験はこれで終了します。

実験回路 から取り外したReVOLTES、その内部抵抗を
計ってみると「481mΩ」。
0.5C、つまり650mA流すと「0.3V」のドロップが発生。
充電時も同じで、内部抵抗で充電電圧が上昇します。
そのため、充電時に1.8Vを越えてしまっています。
  ※そのあたりは電圧と温度変化のグラフで

A1_20200210151501
  ※350回目後に電圧レンジのゼロ点を下げた。
   フルスケールを1.8Vに。

今回は「充電0.5Cで132分 (-ΔV制御はしない)」という
充放電繰り返し条件でした。
これを-ΔV制御するとどうなるか・・・
無駄な温度上昇がマシになるんじゃないかと。
  ※制御プログラムを作り直さなくちゃなりません。

※関連
ダイソーReVOLTES単3 JIS C8708:2019充放電試験 続行中
ダイソーReVOLTES単3 JIS C8708:2019充放電試験 200サイクル目完了
パナソニックのニッケル水素電池、新JIS 8708:2019による充放電繰返し回数
「ダイソーReVOLTES」JIS C8708:2019充放電試験 50サイクル目
ダイソーReVOLTESでJIS C8708:2019サイクル試験開始
ニッ水電池のJIS規格 C8708:2019
電池イジメ、もうやめます





| | コメント (0)

ArduinoのanalogWrite 1/255なの?

ミスが広まる 1/1023 vs 1/1024 はA/Dコンバータのスケーリングの話。
Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ
はタイマーコンペアレジスタ設定の話。

そして今度は「analogWrite」、ArduinoのPWM出力の話をちょっと。

Arduino-UNOだと3つのタイマーを使った6つのPWM出力が可能です。
仕様では分解能8bit。
  void analogWrite(uint8_t pin, int val)
という関数で使います。
ピン番号で使うタイマーが決まり、例えば5,6ピンならタイマー0が
用いられます。
タイマーのクロックが250kHzで8ビットですので、1.024ms周期で
1ビットが4usの分解能になります。

valの値がPWMのデューティー比で、設定できるのは0~255。
0で出力LOW固定になり、255で出力HIGH固定。
128でデューティー50%の方形波。

analogWriteを単にPWM出力ということではなく「D/Aコンバータ」
として使った時、その出力範囲をどう考えればよいでしょうか?
  (「1/1023 vs 1/1024」に近い話になります)

8ビットの0~255のデータを、可変範囲が0~5VのD/Aコンバータで
出力する時、最大値は「(255×5V)/256」で、フルスケールの5Vより
約20mV低いおよそ4.98Vがmax値となります。

ところがanalogWriteは「0V=LOWに張り付いてパルス無し
5V=HIGHに張り付いてパルス無し」まで出力できます。

本来ならフルスケール「(255×1.024ms)/256」で、
1020usのHIGHパルスに4usのLOWパルスが残るはず。
それがなぜか255でHIGHに張り付いちゃいます。
1/256ではなく1/255で処理されているのじゃないかと考え
られるのです。

analogWriteは「wiring_analog.c」内で処理されていますので、
ソースをちょいと覗いてみると・・・
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void analogWrite(uint8_t pin, int val)
{
  pinMode(pin, OUTPUT);   // 指定ピンを出力に
  if (val == 0){        // ★1
    digitalWrite(pin, LOW);  // 値が0ならLOWに張り付き
  }
  else if (val == 255){     // ★2
    digitalWrite(pin, HIGH); // 値が255ならHIGHに張り付き
  }
  else {      // ArduinoCPUによる区別
    switch(digitalPinToTimer(pin)) {  // その代表で
      case TIMER0A:         // タイマー0
        sbi(TCCR0A, COM0A1);    // OC0Aピン非反転PWM出力モード
        OCR0A = val;  // set pwm duty ★3 値が1~254の時
        break;
       :
    }
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
★1と★2で0と255を分離処理して、★3で1~254の時だけ
PWMパルスが出るようにしています。

そこで、タイマー0のanalogWriteに対して、0~255の数値を順に
与えてみると・・・周期1.024msのパルスに対して、
  0ならずっとLOW
  1だと8usのHIGHパルス  ▼1
  2だと12usのHIGHパルス
   :
  253だと8usのLOWパルス
  254だと4usのLOWパルス
  255だとずっとHIGH
が観察されます。
タイマー0に関して、値0と1のところ▼1で、ほんとなら4usステップ
になって欲しいのが8usとなっていて、値1~255とは異なるピッチ
なっていることがわかります。

※この部分の注意点
 これ、タイマー0だからなんです。
   OCR0A = val
 とコンペアレジスタに設定値を与えているから。
   OCR0A = val - 1
 にすると、値1で4usのHIGHパルスが得られます。
 そして★2の処理を無くせば255で4usのLOWパルスとなり、
 「(255×1.024ms)/256」、「(255×5V)/256」の値が得られます。

なお、タイマー0が「8bit高速PWMモード」で初期化されている
ことに注意してください。
タイマー1とタイマー2は「8bit位相基準PWMモード」に設定されて
いて、動作が異なるのです。
このあたりの差が、数値に対するPWM波形出力に影響を与えます。

analogWriteにD/A変換機として純粋な精度を求める場合はちょいと
ご注意を。
ハードウェアマニュアルをよく読み、テストプログラムを書いて
動きを確かめてということで。

※追記
デューティー50%の方形波を得ようとして
  analogWrite(6,128);
しても、HIGH=512us、LOW=512usの波形にはなりません。
HIGHが516us、LOWが508usになり、デューティ50.4%くらいの
方形波が出てきます。
きっちり50%にしたいのなら、
  analogWrite(6,127);
です。 (タイマー0で)

※PWMでのD/A変換、こんな回路を使ってます。
B1_20200210161601
Arduinoの5Vは不安定なので、基準電圧ICで4.096Vとか
2.5Vなどを発生。
PWM波をアナログマルチプレクサ(74HC4053など)を使って
GND-VREF電圧を切り替える。
それをLPFで平滑。
OP-AMPでバッファして電圧出力に。
タイマー1を使うと分解能を10bitとか12bitに拡張できる。
analogWriteじゃなく自前のプログラムで制御。

※PWM出力の様子をオシロスコープで観察する
 ためのテストプログラム。 (注:スペースを全角で)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include "wiring_private.h"
// I/O MACRO
#define PB0_H  (PORTB |= (1 << PB0))   // (!!!)PB0 H/L D8
#define PB0_L  (PORTB &= ~(1 << PB0))
#define PB4_H  (PORTB |= (1 << PB4))   // (!!!)PB4 H/L D12
#define PB4_L  (PORTB &= ~(1 << PB4))
#define PB5_H  (PORTB |= (1 << PB5))   // (!!!)PB5 H/L D13
#define PB5_L  (PORTB &= ~(1 << PB5))

/***** タイマー0 オーバーフロー回数読み出し *****/
extern volatile unsigned long timer0_overflow_count;
unsigned long readovf0(void)
{
unsigned long t;
  cli();         // 割込禁止
  t = timer0_overflow_count;
  sei();         // 割込許可
  return t;
}
/***** PWM出力    *****/
// val : PWM設定値 0~255
// OC0A,OC1A,OC2Aに出力
void pwm3ch(int val)
{
  analogWrite(6,val);    // タイマー0 OC0A
  analogWrite(9,val);    // タイマー1 OC1A
  analogWrite(11,val);   // タイマー2 OC2A
}
/*****  セットアップ    *****/
//  ATmega328Pのレジスタを直接制御
void setup()
{
  cli();         // 割込禁止
// I/Oイニシャル
  PORTB = 0b00000000;   // data/pull up
  DDRB = 0b00111111;   // port指定
  //     |||||+---- PB0 IO8  out    test pulse
  //     ||||+----- PB1 IO9  out OC1A
  //     |||+------ PB2 IO10  out OC1B
  //     ||+------- PB3 IO11  out OC2A
  //     |+-------- PB4 IO12  out    test pulse
  //     +--------- PB5 IO13  out (LED) test pulse
  PORTD = 0b00000000;   // data/pull up
  DDRD = 0b11111100;   // port指定
  //    |||||||+---- PD0 IO0  RXD
  //    ||||||+----- PD1 IO1  TXD
  //    |||||+------ PD2 IO2  out
  //    ||||+------- PD3 IO3  out OC2B
  //    |||+-------- PD4 IO4  out
  //    ||+--------- PD5 IO5  out OC0B
  //    |+---------- PD6 IO6  out OC0A
  //    +----------- PD7 IO7  out
  sei();         // 割込許可
}
/***** LOOP    *****/
void loop()
{
unsigned long ovf0;
unsigned long ovfck;
byte cnt  = 0;   // オーバーフローカウンタ
byte kubun = 0;   // PWM出力区分
static int val[]={ // PWM設定値
  0, 1, 2, 127, 128, 253, 254, 255, // 8つのPWM値
};                   // 0:LOW~255:HIGH
  ovf0 = readovf0();       // オーバーフロー回数
  while(1){
    ovfck = readovf0();
    if(ovf0 != ovfck){     // 変化あり
      ovf0 = ovfck;      // 1.024msタイマー0オーバーフロー
      PB0_H;         // 1.024msごとにパルス出力
      if(cnt == 0){
        PB4_H;             // 先頭カウントの時
        if(kubun == 0)   PB5_H;   // 区分0の時パルス
        else        PB5_L;
        pwm3ch(val[kubun]);  // 区分によりPWM出力  
      }
      else{
        PB4_L;
      }
      cnt++;
      if(cnt >= 6){      // 6回オーバーフロー
        cnt = 0;
        kubun++;      // PWM区分
        if(kubun > 7)  kubun = 0; // 0~7
      }  
      PB0_L;
    }
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

・timer0_overflow_countがタイマー0割り込みでインクリメントされるので、
 これを見て1.024ms経過を検出。
・PB0は1.024msごとにパルス出力。
 PB4はPWM値設定ごとに、PB5は区分一周でパルス出力。
 オシロのトリガー源に。
・タイマー0のPWMはこのパルス周期に同期しているが、
 タイマー1、2のPWMは同期しない。
 タイマー0は1/256処理。タイマー1,2は1/255で処理されている
 ので、周期が異なるから。
・タイマー1,2でデューティー、ジャスト50%を得ようとしても、できない。
  127だと、H:1.016ms + L:10.24msに。
  128だと、H:1.024ms + L:1.016msになってしまう。
   (タイマー0は周期1.024msだけど、タイマー1,2は2.040ms周期)


| | コメント (1)

2020年2月 4日 (火)

Arduinoのタイマー OCRレジスタは「n」じゃなく「n - 1」の値を設定せよ

ミスが広まる 1/1023 vs 1/1024は、Arduino-UNO(ATmega328pマイコン)
のA/Dコンバータ・スケーリングのお話しでしたが、今回はタイマーのコンペアマッチ
レジスタのお話しです。

Arduinoのタイマーを直接操作する時(例えばMsTimer2などのタイマー
ライブラリーを使わずにタイマー割り込みを使いたい時など)、CTCモードで
アウトプットコンペアレジスタにタイマーの最大カウント値を設定します。
Arduinoから「タイマー0」を取り上げる(ユーザーが使う) では
「1m秒」割り込みを例にしました。
1msつまり1kHzの割り込み周期を得るには、
 ・CTCモードに。 (コンペアマッチでカウンタゼロクリアー)
 ・16MHzのクロックをプリスケーラーで1/64して250kHzに。
 ・それを1/250して1kHzに。
この1/250するのがアウトプットコンペアレジスタへの設定です。
↑の例では
   OCR0A = 250 - 1;    // 250カウントで1kHzを
の所。
1/250なんで「250 - 1」を設定しています。
これをミスして「-1していない」プログラム例や解説を見かけるのです。

なぜ「n - 1」なのかは、このタイミング図を見れば分かるかと。
A1_20200204115801
TOP値がOCR:コンペアレジスタへの設定値。
そして、CTCモードだとBOTTOM値はゼロになります。
TOP値を検出した次のサイクルがゼロとなるわけです。

例えば「1/4」したい時、TOP値つまりコンペアレジスタの値を
「4」にしてしまうと・・・
0 1 2 3 4  0 1 2 3 4  0・・・」と繰り返しが「5」になってしまいます。
TOP値としてOCRに設定するのは「カウント周期 - 1」でなければいけません。
「-1」しないと、「1/4」が欲しいのに「1/5」になってしまうという
スカタンが発生します。

これに気付かない原因の推測ですが、
・とりあえず、それらしい動きをしてるから。
・16ビットタイマーであるタイマー1に対して、大きな値をセットしてる。
 そのままの値と-1した場合とで、タイマー周期にほとんど違いが出ない
 から気がつかない。
・8ビットタイマーでも、ミスを測定する手段を持ってない、あるいは
  積極的に結果を計ろうとしていない。
   ※周波数カウンタやオシロスコープなどの測定器をつなぎ
    テストパルスを出せばすぐに気がつくはず。
・ハードウェアの非同期カウンタを思い浮かべている。
   ※1/10カウンタなら、7→8→9→[10=0]→1→2→
    と、10検出で直ちにリセットされて0になるので。

こんなところかと。

※見かけたミスの例
ArduinoのTimerを初心者が1からなんとなくわかるためのメモ - Qiita
  16MHzクロックを1/256し、「OCR1A = 62500;」として「1秒」としている。
Arduinoでtimerを使った割込み処理の方法 ? 自作のいろいろ
  「OCR2A=100; //100カウントごと(50μs)毎」と。。。
Timer1 - FreeStyleWiki
  ちょっと違う。
タイマー割り込みを使う - arduino始めました
  惜しいような。。。
Timer0 & 1
  アセンブラでもミス。

多くの正しい解説もありますが、ミスしたのが目立っちゃいます。

そして、もうひとつ気になるのが割り込み処理内で走らせるプログラム。
「呼んですぐに戻ってくる関数」が基本。
そして、それがメインの処理とぶつからないこと。
他の割り込み処理に影響(長い時間待たせる)を与えてもダメ。
割り込みの中で「Serial.println(xxx)」を使ってる例を見かけるのですが、
これはいかがなものかと・・・。


| | コメント (1)

2020年1月31日 (金)

300kHzのセラミック発振子:Tele Auto FX-1 修理

以前にも修理していますが、
Tele Auto FX-1:電動シャッター用無線リモコン
修理:電動シャッター用無線リモコン

今回の依頼品は、これのセラミック発振が発振しない(時々動く)
という症状。  青いの。 「CSB300D」

11_20200131133601

電池の液漏れや水掛りはありません。
見かけは非常にきれいな状態なんですが、制御マイコンが動かない
もんだから、アウト。

「300kHz」のセラミック発振子、電子部品通販店で探してみました
が見つからず。
455kHzのは赤外線リモコンで使われてるんで、まだまだ現役のはず・・・
   ※ムラタの455kHz、RSコンポーネンツでは見つからず。
    ひょっとして低い周波数のは終息?

困ったな~っと、記憶を辿ると・・・部品箱にありました。
以前の修理でマイコンを交換(プログラムを作って)した時に
取り外して置いておいたものです。
珍しいものは捨てずにちゃんと保存しておかなあきません。
これで無事に修理完了。


| | コメント (0)

2020年1月28日 (火)

Arduinoから「タイマー0」を取り上げる(ユーザーが使う)

Arduino(UNO)でユーザーが自由に使えるタイマー(ATmega328の)は2つ。
タイマー0をArduinoのシステムが使っているから。
残るタイマー1とタイマー2は自由に使ってokという構成。

で、このタイマー0が何に使われているかというと、この3つ。
 unsigned long millis()・・・経過時間をミリ秒値で得る
 unsigned long micros()・・・経過時間をマイクロ秒値で得る
 void delay(unsigned long ms)・・・ミリ秒値で時間待ち

タイマー0のオーバーフロー割り込みでもって計時しています。
割り込み周期は、16MHzを1/64して256カウントですので、
1.024ms = 976.5625Hz。
  ※なお、「void delayMicroseconds(unsigned int us)」
   は純粋にソフトでの時間待ちですのでこのタイマー0
   には依存しません。

『millis()やmicros()、delay()は使わんぞ』というプログラムなら、
タイマー0もユーザーが使えます。
その検証をちょいと。

・タイマー0のオーバーフロー割り込みをやめる。
   「TIMER0_OVF_vect」の処理ルーチンは残ってしまうけど、
    無視します。

・タイマー0のコンペアマッチA割り込み使って、自由なタイマー
 割り込みを得る。
 例えばジャスト「1ミリ秒=1kHz」と使いやすく。

・そのために、タイマー0のレジスタを直接操作。
・TIMER0_COMPA_vectの処理を書く。

簡単なテストプログラムを紹介しておきます。
  (表示の関係で全角スペースにしてます)

//////////////////////////////////////////////////////////////
// I/O MACRO
#define PB0_H  (PORTB |= (1 << PB0))   // (!!!)PB0 H/L
#define PB0_L  (PORTB &= ~(1 << PB0))
#define PB1_H  (PORTB |= (1 << PB1))   // (!!!)PB1 H/L
#define PB1_L  (PORTB &= ~(1 << PB1))

/***** タイマー0コンペアマッチA割込み    *****/
// 割り込みでパルス出力(1kHz周期)
ISR(TIMER0_COMPA_vect)
{
  PB0_H;             // (!!!)PB0 H
  PB0_L;             // (!!!)PB0 L
}
/*****  セットアップ    *****/
//  ATmega328Pのレジスタを直接制御
void setup()
{
  cli();         // 割込禁止
// I/Oイニシャル
  PORTB = 0b00000000;   // data/pull up
  DDRB = 0b00111111;   // port指定
  //     |||||+---- PB0 IO8  out TEST 割り込みでパルス
  //     ||||+----- PB1 IO9  out TEST メインでパルス
  //     |||+------ PB2 IO10  out
  //     ||+------- PB3 IO11  out
  //     |+-------- PB4 IO12  out
  //     +--------- PB5 IO13  out (LED)
  PORTD = 0b00000000;   // data/pull up
  DDRD = 0b11111100;   // port指定
  //    |||||||+---- PD0 IO0  RXD
  //    ||||||+----- PD1 IO1  TXD
  //    |||||+------ PD2 IO2  out
  //    ||||+------- PD3 IO3  out
  //    |||+-------- PD4 IO4  out
  //    ||+--------- PD5 IO5  out
  //    |+---------- PD6 IO6  out OC0Aトグル出力
  //    +----------- PD7 IO7  out
// タイマー0
  TCCR0B = 0x00;     // タイマー0いったん停止
  TCCR0A = 0b01000010;  // あらためてモード設定
  //     |||| ++--- WGM: CTCモード
  //     ||++------- COM0B
  //     ++--------- COM0A PD6トグル出力
  TCCR0B = 0b00000011;
  //       |+++--- CS:1/64 : 250kHz
  //       +------ WGM02
  OCR0A = 250 - 1;    // 250カウントで1kHzを
  TIMSK0 = 0b00000010;
  //        +----- OCIE0A コンペアマッチA割り込み有効
  //               オーバーフロー割込は無しに
  sei();         // 割込許可
}

/***** LOOP    *****/
// PB1にパルス出力
void loop()
{
  PB1_H;             // (!!!)PB1 H
  PB1_L;             // (!!!)PB1 L
}
//////////////////////////////////////////////////////////////

PB0、PB1そしてPD6をオシロで見たのがこの波形。

Tm01

タイマー割り込み処理を行っている間、メインで出している
PB1のパルスが止まります。
PD6がトグル(ここで割り込み要求が発生している)してPB0が
オン(割り込み内の処理)するまでの間、時間がかかっている
のは割り込みのスタック処理です。
レジスタを待避するなどあれこれ見えない処理が走ります。

Arduinoでの初期設定は「wiring.c」に記されています。
この中で設定されている「TIMER0_OVF_vect」の処理は取り除けません。
しかし、タイマー0オーバーフロー割り込み許可ビット:TOIE0を0に
することでこの処理は走りません。
そして、オーバーフローは無視してコンペアA割り込みを走らせる
のです。

タイマー0のクロック分周設定や割込時間も自由。
   「OCR0A= 25 - 1;」としたら10kHzで割り込み。
   まぁ、1msあたりが使いやすいかと。
計時だけでなく、いろんな処理を入れ込めますので、3つしかない
タイマーが生かせます。

ただ・・・millis()やmicros()、delay()をシステムで(ユーザー
から見えない何かの処理)使っていたら、その処理は止まってしま
います。
シリアルや液晶表示は大丈夫そうでしたが、「ダメ」なのを探し切れて
いません。

※関連
割り込みで処理させるwordデータの扱い
Arduinoのタイマー処理 タイマー0のオーバーフロー割り込みの実行時間
ラジオペンチ Arduinoのmillis()関数が返す値は不連続な場合がある
魔法の言葉「volatile」
AVRマイコンのCコンパイラ 具体的に


※追記
なぜタイマー0を使いたいのか・・・
JIS C8708による充放電サイクル試験回路 これの「2019」対応プログラムを
Arduinoに移植したいから。
現在はアセンブラで書いてます。
「C」に直すならArduinoでと考えました。
現状、
  タイマー0:1mS割り込み
  タイマー1:充放電電流設定用PWM出力
  タイマー2:ブザー報知(4kHz)出力
となっていて、これを踏襲したいからなんです。



| | コメント (0)

2020年1月27日 (月)

ROWAの互換バッテリー購入

2008年にやってきたオリンパスのE-520。
本体は満身創痍ですが、まだ元気。
撮影枚数を調べたら13万枚ほど。
ところがバッテリーがアウトに。
2つ体制で使ってきましたが、ライブビューするとすぐにバッテリー消耗警報がでるようになっちゃいました。
そこで・・・初めての互換バッテリー。
「ROWA」のを買ってみました。

A1_20200127111401

左がROWAで、右のがオリンパス純正。
この高さを測ってみると・・・・ROWAのが0.2mmほど低い。
だもんで、E-520電池室の出し入れがスムーズに。
(a)点のぽっちりだけがちょいと高く(0.1mmほど)なっていて、うまく電池室に収まります。
オリンパス純正の電池、カメラからの取り出しが窮屈だったんです。
「寿命でバッテリーが膨れてきたから?」じゃありません。
最初からちょっと窮屈めでした。

さてさて。
所持しているデジタルカメラ、現用品は3台。
リコーのGX100とオリンパスのOM-D E-M1mk2、そしてE-520。
それぞれのカメラで使っている電池の内部抵抗変化、こんな具合です。

Batr202001

内部抵抗の測定方法と関連記事


| | コメント (0)

2020年1月24日 (金)

メモ:4-20mA電流ループ用ICとデジタルアイソレータ

回路設計で調べ物をしていたら、「TI」のであれこれ新しいデバイスを発見。

※4-20mAの電流ループ回路 (出力側)
OP-AMPで定電流回路を組んでというのがこれまでだったけど・・・
便利なデバイスがありました。
XTR115 外付けTR 1個で4-20mAのカレントループ。
      センサー回路の電流が4mA内でOKならむちゃ簡単。
      OP-AMPで組んでも同じ構成になるだろっと。
XTR111 センサー回路が大食いの時、3線式あるいは4線式ならこれ。
      電流流し出しで出力。 (GND側を共通にできる)

※デジタルアイソレータ
CANバス絡みに広がっているんだろか。
安価で使いやすいのがあれこれと。
フォトカプラでの絶縁とは異なる手軽さ。
ISO7310 (1ch)   ISO1320 (2ch)

そして、入力インターフェス用。
ISO1211 24Vを受けるのに便利そう。
http://www.tij.co.jp/product/jp/ISO1211
 ↑のhttp://www.ti.com/jp/lit/pdf/SLLA382
が面白いかと。
高電圧回路を絶縁受けする場合、フォトカプラだと電流制限抵抗が
「熱くなる」わけですが、これだと小ワットの抵抗でOK。

※関連→抵抗の熱で基板が変色



| | コメント (0)

«ダイソーReVOLTES単3 JIS C8708:2019充放電試験 続行中