ネットや書籍で、MPLABのIDEを開いている画面がたまに出てるけど、皆さん必ず開いているウィンドウがある。
Memory Usage Gauge というものなんやけどね。

自分は最近までこれ開いてなかったんやけど、やっぱり必要やなぁと感じて来た次第です。
というのも、ソロソロメモリがギリギリになってきたんやね。

 無題

これぞ組み込みの醍醐味?
正直メモリをこんなに意識しながらコード書くってのは、Windows3.1時代(何時だよ)以来か。
いや、初期のケータイJava以来か。 

本題。
ちょっと気になっていたポテンションメータからのフィードバック電圧ですが、テストボード上ではたまにノイズが入っており、これをなんとかしたいなと思ってました。
実機上では12Vのバッテリ供給なので様子が違うかも知れませんが、ローパスフィルタ位は回路で入れていても良いかと考えていた時代がありました。
実測で7805はIN側の電圧の振れがダイレクトにOUT側へ出てたので、どこに入れるべきか悩んでたんやけど、、、
今のところCPU時間も余ってる事ですし、ソフトウェアで解決する事にしたんやね。
部品点数減らしたいからね。

今回は10個程度のバッファを持って、平均値から大きく乖離した場合、平均値側を採用するって作りにした。
別に周波数成分ってな訳でもないんで、そんなんでええのです。
今のところノーチェック状態のコードは以下。
/** -----------------------------------------------------------------
  unsigned int PotNoiseReduction(unsigned int pot)
  ポテンションメータのノイズ除去
  @param pot ポテンションメータ(1〜1,024)
  @return ノイズ除去後のポテンションデータ
------------------------------------------------------------------ */
unsigned int PotNoiseReduction(unsigned int pot)
{
	static unsigned int pots[NR_DATAS] = {0};
	unsigned int ave;
	int ii;
	
	ave = pots[NR_DATA_NUM-1];
	for(ii = (NR_DATA_NUM-1); ii > 0; ii--) {
		pots[ii] = pots[ii-1];
		ave += pots[ii];
	}
	ave /= NR_DATA_NUM;
	pots[0] = pot;
	// ノイズ判定
	if((pot > ave+NR_TRIGGER) || (ave-NR_TRIGGER > pot)) {
		return ave;
	}
	return pot;
}
NR_DATA_NUMは現在10個とか大きめにとって、大きな変動を抑えてます。
ポテンションデータを入れる配列は、メインルーチンの頭のところで初期化してます。
正確にはNRされて無いとも言えるけど、アナログ回路でやったところで同じこと。
コンデンサの時定数計算するよりはバッファの数調整する方が楽チンやしね。
まぁもう少しプログラムと設定値は見直しますけれども、大体こんな感じでエエのかなと。
本格的にやるならdsPICとかでローパスフィルタ回路を組むとか、、、いやオーバースペックも甚だしいな、それ。

しかし、エクストリームプログラミングとかしてたら、ペアプログラマーにハリセンでシバかれそうなコードです。
マイクロチップ社の最新のコンパイラはC++で書けるみたいですが、さてどれほど普及しますかね。