/***************************************** * ホールセンサを使った速度距離計 * 2011/2/26 EEPromを使い距離を継続記録表示する * タイヤサイズ変更 700×28C 外径678 周囲212(207を変更) *****************************************/ #include <16f785.h> // コンフィギュレーションの設定 #fuses INTRC_IO,NOWDT,NOPROTECT,PUT,BROWNOUT,MCLR,NOIESO,NOFCMEN #device ADC=10 // ハードウェア設定 #use delay(CLOCK = 8000000) #use FAST_IO(A) #use FAST_IO(B) #use FAST_IO(C) #BYTE OPA1CON = 0x11C // オペアンプ用レジスタ #BYTE OPA2CON = 0x11D #byte PORTC=7 #bit TMR2IF = 0x0C.1 // タイマ2割り込みフラグ #bit INPUT_SW = PORTC.4 #define HI 1 #define LOW 0 /**** 液晶表示用設定 *****/ #define DB7 PIN_A4 #define DB6 PIN_A5 #define DB5 PIN_A1 #define DB4 PIN_A0 #define RS PIN_C0 #define STB PIN_A2 #include /*** 定数、変数の宣言定義 ****/ long Differ, Cycle, data,dx; float Speed, Distance,d_TO,r_d,d_M; char StMsg[] = "Start!"; void w_rom(long dx) { char s[4]; int i; for(i=0;i<4;i++){ s[i] = dx % 10; dx /= 10; } WRITE_EEPROM(0x00,s[0]); WRITE_EEPROM(0x01,s[1]); WRITE_EEPROM(0x02,s[2]); WRITE_EEPROM(0x03,s[3]); } void r_rom() { char t[4]; t[0] = READ_EEPROM(0x00); t[1] = READ_EEPROM(0x01); t[2] = READ_EEPROM(0x02); t[3] = READ_EEPROM(0x03); r_d = t[3]*1000.0+t[2]*100.0+t[1]*10.0+t[0]; d_M = r_d/10.0; } void rom_clear() { WRITE_EEPROM(0x00,0); WRITE_EEPROM(0x01,0); WRITE_EEPROM(0x02,0); WRITE_EEPROM(0x03,0); } /*********** メイン関数 **************/ void main(void) { set_tris_A(0x08); // 入出力モード設定 set_tris_B(0x30); set_tris_C(0xFE); //0xCE output_c(0); OPA1CON = 0x80; // オペアンプ使用設定 OPA2CON = 0x80; setup_timer_2(T2_DIV_BY_16 249, 5); // タイマ2初期設定10msec周期 setup_adc(ADC_CLOCK_DIV_16); // A/Dコンバータ初期設定 setup_adc_ports(sAN5); // 変数初期化 Differ = 0; // 間隔 Cycle = 0; // 回転数 Speed = 0; // 速度 Distance = 0; // 距離 // 開始メッセージLCD表示 lcd_init(); // LCD初期化 lcd_clear(); lcd_str(StMsg); r_rom(); delay_ms(500); // 0.5秒間表示 /********* メインループ *************/ while(TRUE) { output_low(PIN_B7); // 10msecカウンタチェック if(TMR2IF) { // タイマ2待ち10msec周期 Differ++; // 間隔カウントアップ TMR2IF = 0; // 割り込みフラグクリア // ホールセンサ値チェック set_adc_channel(5); // AN5選択 delay_us(50); data = read_adc(); // 値入力 if(data > 0xC0){ // スレッショルドオーバか? if(Differ > 15){ // 一定以上の時間経過しているか output_high(PIN_B7); // 目印 Cycle++; // 回転数カウントアップ // 時速計算 26インチタイヤ周囲207cm →212に変更(700×28c) // Differは10msec単位カウント 0.212/Differ×3600km/h Speed = (0.212 * 3600) / Differ; Differ = 0; // 間隔カウンタリセット // 距離計算 2.07m×回転数 Distance = (2.12 * Cycle) / 1000; d_TO = d_M + Distance; dx = (long)((float)d_TO*10); w_rom(dx); // LCD表示制御 lcd_cmd(0x80); printf(lcd_data, "Speed= %2.1f km/h ", Speed); lcd_cmd(0xC0); printf(lcd_data, "%2.2fkm ", Distance); printf(lcd_data, "(%3.1fkm) ", d_TO); if(INPUT_SW == LOW){ rom_clear(); r_rom(); } } } } } }