前回に引き続き、今回は波形整形MCUのソフトウェア編です。
今回は多様な車両にもハード変更せずソフトウェア変更で現場で対応する必要があるので
このように波形を整形するMCUと、実際に回転数を算出してcsv出力するMCUに分ける必要が
ありました。
とりあえずいきなりですが、コード(素人全開のコーディングではずかしい)公開します。
以下コードです
# include <Wire.h>
int signalin = A0; //A0pin読み取り設定
int signalout = 10; //D10pin出力設置
int signalVal = 0; //アナログ値格納用
float sigV = 0; //信号電圧
int delaytime = 3; //検出無効時間設定ms(オシロスコープで測定したノイズの発生時間を入力
float sigline = 0.65; //信号として扱う電圧の閾値設定用
void setup() {
//Serial.begin(9600);
pinMode(signalout,OUTPUT);
}
void loop() {
signalVal = analogRead(signalin);
sigV = signalVal*5.0/1023;
if(sigV > sigline){
digitalWrite(signalout, HIGH );
delay(delaytime);
digitalWrite(signalout, LOW );
}
}
はい
以上をコピペしてコンパイルして転送すればもう出来上がりですが、一応それぞれの役割を記述しておきます
void setup() {
//Serial.begin(9600);
pinMode(signalout,OUTPUT);
}
ここではデータみたかったのでシリアル通信のコードが入っていますが無視してもらって結構です。
pimodeでD10pinを出力設定しています。
signalVal = analogRead(signalin);
sigV = signalVal*5.0/1023;
ここでは点火信号電圧を読み取るためのコードです。
5vを1024分割して約4.9mVの分解能で検出できます。
if(sigV > sigline){
digitalWrite(signalout, HIGH );
delay(delaytime);
digitalWrite(signalout, LOW );
ここではアナログの信号電圧が設定電圧以上になった場合に入るルーチンです。
ここのコードで信号波形を整形しています。
信号電圧が一定でない→ある程度低めにトリガーする必要があるがそれだとノイズで誤作動する
ノイズが多い→低めにトリガー設定することができない
このふたつの課題があったのですが、信号発生後指定時間だけdelayすることで、信号発生後のノイズが十分減衰するまで無視することで解決しました。
では実際の信号波形を見てみましょう。
プローブは×1でMCU1のA0pinとGNDで計測したデータです。
はい。
ここまでバラバラなデータが出ます。
このように信号電圧が一定ではないので、取りこぼしを防ぐためにも最小値でトリガーする必要があります。
しかしこれだと大きい信号が出たあとのノイズで誤検知します。
そこで信号発生から次の信号までの間でノイズが十分減衰するまでdelayさせて無視しています。
なので仕組み上3msディレイで動作させると検出可能な回転数の上限は
1000(ms)/3(ms)×60(s)=20000min-1
になります。
ディレイが長くなれば長くなるほど上限回転数は低くなります。
今回は汎用性が求められていて常用回転域での使用なので問題にはなりませんが、この方式でやるならノイズの発生をよく観察して適切にdelayさせる時間を決める必要があります。
すこし長くなりましたがとりあえず「波形整形ソフトウェア編」は終わりです!
次は「回転数算出ソフトウェア編」でお会いしましょう!