2012年8月5日日曜日

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


遅々とした歩みで進めております本プロジェクトですが、ようやくハードウェアのめどが立ちました。
基板もいろいろ修正やら追加やらして、こんな感じです。
液晶のコントラスト調整用の半固定抵抗(回路図にはありません)、動作確認用のLEDと電流制限抵抗(回路図にはありません)、LEDを消すためのジャンパ(かいr ....略)。


回路も恥ずかしい間違い(プルアップ抵抗の位置が違うとか)がありましたので修正しておきます。

みら太のエンジン回転パルスをオシロで拾ってみたところ、回転パルスが12V→0Vに落ちた後、0V-12Vに戻るときに盛大なオーバーシュートがあるのを発見しました。おおよそ8Vくらい。なんちゅう大きさやねん。
ということで、数μsecの短時間とはいえPICの絶対定格を軽く超えますので対策しました。入力のところにダイオードを入れてオーバーシュートを電源にお返ししています。ツェナーダイオードが入っているのは、それしか手元になかったためで意味はありません。Vfは0.6V位だったのでこれでPICのダメージを防ぐことができるのではないかと思います。

さてと、ようやくプログラムです。
前にも書いたとおり、エアコンスイッチをコントロールするために「みら太が何速で走っているのか」を計算します。そのためにタイヤの回転数と、エンジンの回転数を調べます。みら太はマニュアルなので、この二つの値の比はシフト位置によって一定のはずです。
タイヤの回転数と、エンジンの回転数はいずれも車載コンピュータから信号が出ていて、みら太はすでに燃費計とタコメータ(いずれもDIY後付)にその信号を使っています。これをPICの割り込みで計数します。で。計数した結果を表示させるためにLCDがついているというわけです。ということで、このLCDは実験の際には必要ですが、シフト位置を決める定数が分かり、プログラムに組み込まれた後は不要ということになります。

さて、まずはLCDをテスト的に動かします。回路図のPICは628ですが、628が見当たらなかったのでは648Aを使いました。メモリ量が違うくらいでほとんど同じマイコンです。

でソース


//ファイル名 AirConCtrl-16F648A_LCD.c
//作成日 2012.08.05
//作成者 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: リレー出力 High で接点OFF
// RB4: Engine Pulse-0V
// RB5: Wheel Pulse-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>

main(void)
{

int count=0;

SETUP_OSCILLATOR(OSC_4MHZ);
SET_TRIS_b(0x76);
OUTPUT_B(0);

lcd_init();
lcd_clear();


ここから下は何か表示させればよいので適当

while(1){
DELAY_MS(500);
lcd_cmd(0x80);
printf(lcd_data,"%5urpm",count*1);
count=count+1;
printf(lcd_data,"%5urpm",count*1);
count=count+1;
lcd_cmd(0xC0);
printf(lcd_data,"%5urpm",count*1);
count=count+1;
printf(lcd_data,"%5urpm",count*1);
count=count+1;

//OUTPUT_TOGGLE(PIN_B3);

}

}



LCDの表示ライブラリは、dataピンの接続が違っているので、後閑さんのを一部手直し。
ビットシフトが二度手間っぽい動きをしていますが、そこはご愛嬌。


/**********************************************
*  液晶表示器制御ライブラリ
*  内蔵関数は以下
*    lcd_init()    ----- 初期化
*    lcd_cmd(cmd)  ----- コマンド出力
*    lcd_data(chr) ----- 1文字表示出力
*    lcd_clear()   ----- 全消去
************************************************/
// RA0-3: LCD data 用 data04-data07
// RA4: RS
// RA6: R/W
// RA7: E

/********* データ出力サブ関数 **************/
void lcd_out(int code, int flag)
{
output_x(code >> 4);
if (flag == 0)
output_high(rs); //表示データの場合
else
output_low(rs); //コマンドデータの場合
delay_cycles(1); //NOP
output_high(stb); //strobe out
delay_cycles(2); //NOP
output_low(stb); //reset strobe
}
/******** 1文字表示関数 **********/
void lcd_data(int asci)
{
lcd_out(asci, 0); //上位4ビット出力
lcd_out(asci<<4, 0); //下位4ビット出力
delay_us(50); //50μsec待ち
}
/******** コマンド出力関数 ********/
void lcd_cmd(int cmd)
{
lcd_out(cmd, 1); //上位4ビット出力
lcd_out(cmd<<4, 1); //下位4ビット出力
delay_ms(2); //2msec待ち
}
/********** 全消去関数 *********/
void lcd_clear()
{
lcd_cmd(0x01); //初期化コマンド出力
delay_ms(15); //15msec待ち
}
/******** 初期化関数 *********/
void lcd_init()
{
set_tris_x(mode); //モードセット
delay_ms(15);
lcd_out(0x30, 1); //8bit mode set
delay_ms(5);
lcd_out(0x30, 1); //8bit mode set
delay_ms(1);
lcd_out(0x30, 1); //8bit mode set
delay_ms(1);
lcd_out(0x20, 1); //4bit mode set
delay_ms(1);
lcd_cmd(0x2E); //DL=0 4bit mode
lcd_cmd(0x08); //display off C=D=B=0
lcd_cmd(0x0D); //display on C=D=1 B=0
lcd_cmd(0x06); //entry I/D=1 S=0
lcd_cmd(0x02); //cursor home
}



で、とりあえず表示はしました。
リレー出力の確認のためにLEDをつけたりして。

あれ、rpm がrwm になってる。....まあいいや。

次はPIN割り込み周りのプログラムです。

0 件のコメント:

コメントを投稿