連日、ソースを書きためている。
足回りとなる、デバイスを動かす部分の実装が全て終わったので
それを基礎に、組み合わせで機能を作っている状況。
文章に書いてしまうと非常にシンプルに終わってしまうのだけど
いくつかの不可解な現象に悩まされていたり、RAMが足りなくなってしまって
どうにも前に進めないちょっと苦しい時期もありました。
●不可解な現象
1.プログラム中でPCに出力する文字列の一部が歯抜けになる。
Hello が、 Hllo とかになっちゃう。
2.ある特定の文字列表示命令を外すと、プログラム自体が暴走する。
結局、入力されたコマンドを解析して数値を得る関数のバッファをクリアする
処理の所で、バッファの容量を超えてクリアしてしまっている所があって
それ以外の変数(もしかしたらプログラムかも)を壊していたのが原因だったよう。
全く予想しない所での問題で、不具合現象の特定に時間が掛かってしまった。
ある日、数値を渡さないコマンドでは不具合が出ず
数値を渡すコマンドを実行した後から動きがおかしくなる事に気がつき
特定に至った。 これは分からんわー (汗
●RAMが足りない
1. UARTバッファの容量
電流値からDACコードを作ったり、ADCコードから電圧値・電流値を作ったり
計算をし始めたところで、浮動小数点を使った直後からRAMの使用率が107%と
上限を超えてしまった。 これはいかん。
ある所から拝借してきたuartのルーチンが原因なのは気がついていたのだけど
1kByteしか無い貴重なRAM領域のうち、60%近い領域がUARTのバッファとして
喰われるのを是正しようと、リングバッファの容量を少しでも減じると
暴走してしまう。 減じないと非常に安定に動作するのに。
この問題は、ChaNさんが公開されているUARTモジュールをもとに
若干の修正を掛けたものを使う事で回避する事が出来た。
バッファも64byteと小さく抑えられて満足。
2. シリアル表示の書き方
今まで、UARTに文字列を送る場合は以下のようにして送っていた。
sendString("Continuous Current Mode\r\n"); |
固定の文字列はROMを参照しているものだと思い込んでいたのだけど
実際はROM→RAMにコピーして、RAMの方を参照する作りとなってしまい
無駄にRAMを食いつぶしてしまう事を知った。
そこで、以下のように記述を改めた。
sendString(PSTR("Continuous Current Mode\r\n")); |
使っている関数がソースと違うが、それはまぁ無視してほしい。
こう書くことでRAMを消費しないようになってくれた。
これらの対策を行う事で、現在はRAM使用率37%前後となった。
これならまだ機能を作り込めるぞ。
という事で、現時点で実装した機能は以下の通り。
・PCから指定した電流を流す機能(CCモード)
これは単純で、1A流してください。 と指定されたのを受けて
指示通りの1Aを流し続けるモード。
その他にも、定電圧(CV), 定抵抗(CR), 定電力(CP)モードを実装する予定。
・バッテリの放電特性測定機能(写真中央, 測定結果は右)
定電流負荷を応用したもので、バッテリの両端電圧が
指定の値になるまで、バッテリ電圧・負荷電流を定時記録するもの。
今回は、Li-ionバッテリ(18650)のジャンクをCVCCで充電して
それの放電特性を調べてみた。
測定間隔は10秒としたけど、1秒~18.2時間くらいまで
1秒ステップで指定出来る。
電流値は0~5Aまで1mAステップ、電圧は0~30Vまで1mVステップだ。
テストに使ったセルは2並列2直列のものだったので
放電終止電圧は3.0Vに設定した。
設計しながら書いた原稿を貼っておきます。
回路図。
ソースコード。 (AVR Studio5.0 project,120401時点)
…晒すのは恥ずかしいのだけど。
こんなコードでも見て頂ける方が居るのかしらw
Comments