2012年8月11日土曜日

みら太のエアコンスイッチの自動ON/OFF その8

その7の信号計測でようやく自分が相手にする信号を確認(笑)したので、それに合わせて回路を変更。


 タイヤ回転パルスの電圧が 2.6V くらいしかなかったのでトランジスタを入れて5Vでプルアップしたピンを信号でGNDにおとすようにしました。当然ロジックは反転します。

んで、最終的な基板はこんな感じ。実態配線図とはかけ離れたものになりました。LCDケーブルもノイズがのり気味だったので思い切り短くしました。これで動作は非常に安定しました。


で、次は割り込みのプログラムです。
今回使ったPIC16F648はRBポートの全ピンでピン状態変化割り込みをかけることができるのですが、どのピンに変化が生じたかはわかりません。個々に調べる必要があります。

とりあえず、次に進むためにはタイヤの回転パルスとエンジンの回転パルスの比を調べてギアが何速に入っているかを調べる必要がありますので、そこまでのプログラムを書きました。
こんな感じ。(LCDのモジュールは変更がないので省略) コンパイラはCCS-Cです。

//ファイル名 AirConCtrl-16F648A_LCD.c
//作成日 2012.08.11
//作成者 Ryuichi
//バージョン 1.0
//コンパイラ CCSC
//PIC PIC16F648A
//クロック 4MHz internal oscillator
//概要
// みら太のエアコンを自動ON/OFFするために、タイヤの回転パルス、エンジン回転数パルス等を
// LCDに表示させて何速に入っているかを推測するためのデータを取る
//使用ポート
// RA0-3: LCD data 用 data04-data07
// RA4: RS
// RA6: R/W
// RA7: E
// RB1-2: Jumper Switch 2bit
// RB3: リレー出力 B3_High で接点OFF
// RB4: Engine Pulse 0V->12V
// RB5: Wheel Pulse 5V->0V
// RB6: Brake ON-High

#include <16F648A.h>
#fuses NOWDT,PUT,NOMCLR,NOBROWNOUT,NOLVP,NOCPD,NOPROTECT,INTRC_IO

#use delay(clock=4000000) //クロック周波数設定
#use fast_io(B)
#use fast_io(A)

#define mode 0x00 //PortA all out put
#define input_x input_A //Use portA for controling LCD
#define output_x output_A
#define set_tris_x set_tris_A
#define stb PIN_A7 //define stb
#define rs PIN_A4 //define rs

#include <LCD002.C>

float engine_pulse=0; //エンジン回転パルス用のカウンタ
float wheel_pulse=0; //タイヤ回転パルス用のカウンタ

int TMR0_countup=0; //counting interrupt of TMR0

short engine_pulse_ready=1; //RBの割り込みを見分けるためのフラグ
short wheel_pulse_ready=1; //同様

/* 割り込みを使うには以下の書式を使う必要がある。 #int_**** で割り込みソースを指定し
  その直後に割り込み処理を記述する。 リセット処理等は必要ない模様。*/

#int_timer0 //タイマ0用の割り込み処理
timer0_interval()
{

TMR0_countup++; //number of 64msec

if(TMR0_countup>60){ //だいたい1秒

lcd_cmd(0x02); //カーソル原点
//パルス数書き込み
printf(lcd_data,"%3.0fEn %3.0fWl",engine_pulse, wheel_pulse);

lcd_cmd(0xC0); //改行して
//タイヤ回転パルスとエンジン回転パルスの比を表示
printf(lcd_data,"%3.3fWl/En",wheel_pulse/engine_pulse);

engine_pulse=0; //カウンタリセット
wheel_pulse=0;

OUTPUT_TOGGLE(PIN_B3); //relay on/off ダミー
TMR0_countup=0; //reset counter 1秒計測用のカウンタリセット
}
}

#int_RB //ピン変化割り込み(ここでエンジンとタイヤのパルスカウントとブレーキの状態を調べる)
RB_interruption()
{
//16F648のRBはピンごとの割り込みではなく、どのピンの変化でもこのルーチンに落ちるので、
//ここの割り込みを区別するためにこのようなややこしいことをする
if(wheel_pulse_ready && INPUT(PIN_B5)==0)
{
wheel_pulse=wheel_pulse+1;
wheel_pulse_ready=0;
break;
}

else if(wheel_pulse_ready==0 && INPUT(PIN_B5))
{
wheel_pulse_ready=1;
break;
}

else if(engine_pulse_ready && INPUT(PIN_B4))
{
engine_pulse=engine_pulse+1;
engine_pulse_ready=0;
break;
}

else if(engine_pulse_ready==0 && INPUT(PIN_B4)==0)
{
engine_pulse_ready=1;
}
}


main(void)
{

SETUP_OSCILLATOR(OSC_4MHZ);

delay_ms(1000); //保険のため待ち

SET_TRIS_b(0x76);
OUTPUT_B(0);

SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_64); //timer0 set up ~64msec
SET_TIMER0(0x0);

ENABLE_INTERRUPTS(INT_TIMER0); //各割り込みの許可
ENABLE_INTERRUPTS(INT_RB);

lcd_init(); //LCD初期化
lcd_clear();
printf(lcd_data,"Start");

ENABLE_INTERRUPTS(GLOBAL); //割り込み受付開始

while(1){ //割り込み待ち

}

}

ソースが汚いのはいつものことなので気にしません ^^)

さて、いよいよ基板をみら太につないで実験です。

まずはアイドリング状態でエンジン回転パルスを見ます。 En がだいたい1秒くらいの間に検出したエンジン回転パルス数、Wl は同じ時間のタイヤの回転パルス(この写真では停車してますので 0です)。
そしてWl/En がタイヤの回転パルスとエンジン回転数の比です。目論見では、これがギアごとに一定の値になるはず。


では走ってみましょう。下は2速。


3速


4速


ということで、思惑通りに比が変化していきます。そして、これらの値は若干のばらつきはあるものの以下のようになることが分かりました。

後退: 0.08
1速: 0.18
2速: 0.29
3速: 0.45
4速: 0.60
5速: 0.79

これで狙い通りギアの位置を計算で知ることが出来ました。
値から見ると、比の値が0.5あたりがエアコンコンプレッサの始動を許可するかどうかの切り替えポイントになりそうです。

次はいよいよフットブレーキ検出を含めて、エアコンコンプレッサON/OFFの部分のプログラミング、そして実際に走りながらの調整です。
あともう一息。

0 件のコメント:

コメントを投稿