居酒屋ガレージ日記ZAQのBloGariで書いていた「居酒屋ガレージ日記」の移転先です。入力していただくと、バックアップした記事が出てきます。この中の定電流回路(充電用と放電用の2つ)この電流検出抵抗をあれこれ模索。今回使ったのは手持ちの関係で5W・0.3Ω。その発熱が悩みどころ。セメント抵抗に電力を食わせた時の温度上昇。こんなグラフが出ていました。https://www.e-globaledge.com/products/ecomponents/tdo/温度特性が「±400ppm/°C」。いうことは、10°C変化で0.4%。してはちょいとなぁ~なんですが、とりあえず手持ち部品の関係で「5W0.3Ω」というのを用いました。今回の回路、最大1.5Aで0.3Ωだと0.7Wほど。5W定格の14%ほど。上昇温度が30°Cほどと読み取れます。いうことは抵抗値として1%ほどの変動を覚悟しなくてはとなります。仕事の装置ではこんな抵抗を使っていました。※手持ちが無いので今回は使えなかった。「PWR4412」という金属でできたコの字のバー。これで「±20ppm/°C」。ラインナップされている最高の抵抗値が「0.1Ω」。定電流回路の制御電圧を下げなければなりません。今は制御電圧0.5Vで1.6A。電流検出抵抗を0.1Ωにすると、0.16Vで1.6Aという制御になり、ちょっと電圧が低いかな~というところです。手持ちの「コの字状抵抗」を引っ張り出してきました。30mΩのと50mΩのが各2つ。「PWR4412」、廃番になってました!えらいこっちゃ。代替品を探さなくてはなりません。ビシュイでSR3R、SR5Rというのが使えそう。温度係数が悪いか・・・。SR3R(3Wタイプ)だと0.1Ωがある。RiedonというメーカーでMSR5というのでも0.1Ωがある。抵抗値を小さくすると、同じ電流なら電力がダウン。1.5Aで0.3Ωだと0.675Wだったのが、0.1Ωにすると0.225Wに。これで、発熱がずいぶんと減ります。↑にあるグラフのように「負荷率に対する温度上昇曲線」あれば発生誤差が推定できるんですけれどねぇ。ハードが固まりました。制御プログラムをごそごそしています。0.5Cで充放電させる必要があるので、設定できる最大を1.6Aにしています。充電側のヒートシンクをもうちょい大きくしたいところ。(木)マイコン型導通チェッカー、頒布しています。いう記事を書いてます。※現在も(有)アクト電子で頒布しています。先日も、「新人の研修で使いたい」ということで、まとまった数の注文をいただきました。※ありがとうございます。ケース加工も丸穴だけだし、回路のハンダ付けや組み立ても難しくありません。※面実装ICはこちらでハンダしてます。組み立てておけば、電子回路工作で役立つ一生もののツールになること間違いなしです。回路図もソースファイルも(アセンブラですが)公開してますし、教材としての価値もあるかと。※「導通チェックなんてテスターに付いてるやん」という意見もありますが、このチェッカーの手軽さは、実物で体験してもらわないと分かってもらえないかな。4月から198円に値上げです。200サイクル目完了の続き。400サイクル目、完了です。400サイクル目で、放電持続時間が2時間ほどに。寿命と判断して、今回の実験はこれで終了します。取り外したReVOLTES、その内部抵抗を計ってみると「481mΩ」。0.5C、つまり650mA流すと「0.3V」のドロップが発生。充電時も同じで、内部抵抗で充電電圧が上昇します。そのため、充電時に1.8Vを越えてしまっています。※そのあたりは電圧と温度変化のグラフで※350回目後に電圧レンジのゼロ点を下げた。フルスケールを1.8Vに。(-ΔV制御はしない)」という充放電繰り返し条件でした。無駄な温度上昇がマシになるんじゃないかと。※制御プログラムを作り直さなくちゃなりません。A/Dコンバータのスケーリングの話。1」の値を設定せよはタイマーコンペアレジスタ設定の話。今度は「analogWrite」、ArduinoのPWM出力の話をちょっと。Arduino-UNOだと3つのタイマーを使った6つのPWM出力が可能です。仕様では分解能8bit。val)という関数で使います。番号で使うタイマーが決まり、例えば5,6ピンならタイマー0が用いられます。タイマーのクロックが250kHzで8ビットですので、1.024ms周期で1ビットが4usの分解能になります。valの値がPWMのデューティー比で、設定できるのは0~255。0で出力LOW固定になり、255で出力HIGH固定。128でデューティー50%の方形波。1/1024」に近い話になります)8ビットの0~255のデータを、可変範囲が0~5VのD/Aコンバータで出力する時、最大値は「(255×5V)/256」で、フルスケールの5Vより約20mV低いおよそ4.98Vがmax値となります。「5V=HIGHに張り付いてパルス無し」まで出力できます。本来ならフルスケール「(255×1.024ms)/256」で、1020usのHIGHパルスに4usのLOWパルスが残るはず。それがなぜか255でHIGHに張り付いちゃいます。1/256ではなく1/255で処理されているのじゃないかと考えられるのです。値が1~254の時break;:}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~★1と★2で0と255を分離処理して、★3で1~254の時だけPWMパルスが出るようにしています。▼12だと12usのHIGHパルス:253だと8usのLOWパルス254だと4usのLOWパルス255だとずっとHIGHが観察されます。タイマー0に関して、値0と1のところ▼1で、ほんとなら4usステップになって欲しいのが8usとなっていて、値1~255とは異なるピッチになっていることがわかります。※この部分の注意点これ、タイマー0だからなんです。valとコンペアレジスタに設定値を与えているから。1にすると、値1で4usのHIGHパルスが得られます。「(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変換、こんな回路を使ってます。Arduinoの5Vは不安定なので、基準電圧ICで4.096Vとか2.5Vなどを発生。PWM波をアナログマルチプレクサ(74HC4053など)を使ってGND-VREF電圧を切り替える。OP-AMPでバッファして電圧出力に。タイマー1を使うと分解能を10bitとか12bitに拡張できる。analogWriteじゃなく自前のプログラムで制御。※PWM出力の様子をオシロスコープで観察するためのテストプログラム。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%を得ようとしても、できない。L:10.24msに。L:1.016msになってしまう。1/1024は、Arduino-UNO(ATmega328pマイコン)のA/Dコンバータ・スケーリングのお話しでしたが、今回はタイマーのコンペアマッチレジスタのお話しです。Arduinoのタイマーを直接操作する時(例えばMsTimer2などのタイマーライブラリーを使わずにタイマー割り込みを使いたい時など)、CTCモードでアウトプットコンペアレジスタにタイマーの最大カウント値を設定します。「1m秒」割り込みを例にしました。(コンペアマッチでカウンタゼロクリアー)・16MHzのクロックをプリスケーラーで1/64して250kHzに。・それを1/250して1kHzに。この1/250するのがアウトプットコンペアレジスタへの設定です。250カウントで1kHzをの所。1」を設定しています。これをミスして「-1していない」プログラム例や解説を見かけるのです。1」なのかは、このタイミング図を見れば分かるかと。TOP値がOCR:コンペアレジスタへの設定値。CTCモードだとBOTTOM値はゼロになります。TOP値を検出した次のサイクルがゼロとなるわけです。0・・・」と繰り返しが「5」になってしまいます。1」でなければいけません。「-1」しないと、「1/4」が欲しいのに「1/5」になってしまうというスカタンが発生します。・とりあえず、それらしい動きをしてるから。・16ビットタイマーであるタイマー1に対して、大きな値をセットしてる。そのままの値と-1した場合とで、タイマー周期にほとんど違いが出ないから気がつかない。・8ビットタイマーでも、ミスを測定する手段を持ってない、あるいは積極的に結果を計ろうとしていない。※周波数カウンタやオシロスコープなどの測定器をつなぎテストパルスを出せばすぐに気がつくはず。・ハードウェアの非同期カウンタを思い浮かべている。※1/10カウンタなら、7→8→9→[10=0]→1→2→と、10検出で直ちにリセットされて0になるので。62500;」として「1秒」としている。//100カウントごと(50μs)毎」と。FreeStyleWikiちょっと違う。arduino始めました惜しいような。1アセンブラでもミス。多くの正しい解説もありますが、ミスしたのが目立っちゃいます。ひとつ気になるのが割り込み処理内で走らせるプログラム。「呼んですぐに戻ってくる関数」が基本。それがメインの処理とぶつからないこと。他の割り込み処理に影響(長い時間待たせる)を与えてもダメ。割り込みの中で「Serial.println(xxx)」を使ってる例を見かけるのですが、これはいかがなものかと・・・。FX-1:電動シャッター用無線リモコン・修理:電動シャッター用無線リモコン今回の依頼品は、これのセラミック発振が発振しない(時々動く)という症状。電池の液漏れや水掛りはありません。見かけは非常にきれいな状態なんですが、制御マイコンが動かないもんだから、アウト。探してみましたが見つからず。※ムラタの455kHz、RSコンポーネンツでは見つからず。して低い周波数のは終息?困ったな~っと、記憶を辿ると・・・部品箱にありました。以前の修理でマイコンを交換(プログラムを作って)した時に取り外して置いておいたものです。珍しいものは捨てずにちゃんと保存しておかなあきません。これで無事に修理完了。(火)Arduinoから「タイマー0」を取り上げる(ユーザーが使う)Arduino(UNO)でユーザーが自由に使えるタイマー(ATmega328の)は2つ。タイマー0をArduinoのシステムが使っているから。残るタイマー1とタイマー2は自由に使ってokという構成。このタイマー0が何に使われているかというと、この3つ。ms)・・・ミリ秒値で時間待ちタイマー0のオーバーフロー割り込みでもって計時しています。976.5625Hz。us)」は純粋にソフトでの時間待ちですのでこのタイマー0には依存しません。『millis()やmicros()、delay()は使わんぞ』というプログラムなら、タイマー0もユーザーが使えます。・タイマー0のオーバーフロー割り込みをやめる。