softdev:tempmeter2
差分
このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
| softdev:tempmeter2 [2012/03/07 23:05] – 作成 king | softdev:tempmeter2 [2013/07/15 20:25] (現在) – 外部編集 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== 温度計を作る2 ====== | ====== 温度計を作る2 ====== | ||
| - | 前回の失敗(でもないが) | + | 前回の失敗(でもないが)を勉強し以下仕様で作り直してみた。 |
| + | |||
| + | * LM61Bを使う。 | ||
| + | * 増幅度は4倍にして、オフセットは切らない。 | ||
| + | * 時計表示機能を追加する | ||
| + | |||
| + | でで、 | ||
| + | ===== LM61B ===== | ||
| + | LM61BはNS(現TI)製の温度センサーである。秋月電子で4個で200円でした。もちろんTO92です。\\ | ||
| + | LM61には、BとCのバージョンがあり、Bの方が精度が高いが、温度範囲が少し狭い。データシートを貼付けておきましょう。\\ | ||
| + | {{: | ||
| + | |||
| + | * 温度勾配が10mV/ | ||
| + | * -25℃〜85℃ の測定が可能 | ||
| + | * ±3℃ | ||
| + | * 電源は2.7V〜 | ||
| + | |||
| + | 内蔵でオフセットが加えられており、温度は下表となる。 | ||
| + | ^ Temperature | ||
| + | | +50℃ | ||
| + | | +25℃ | ||
| + | | 0℃ | 600mV | | ||
| + | | -25℃ | ||
| + | |||
| + | よって、4倍の増幅とすればぴったり行く。 | ||
| + | |||
| + | ===== 増幅率 ===== | ||
| + | そのまま、ADCに入れると、5V/ | ||
| + | |||
| + | ===== 時計表示機能 ===== | ||
| + | カレンダ時計を付けたいと思う。DR-Z400の時計機能も壊れたまま(これは買ってすぐ壊れた、全く原因不明で10年経ってもなおってない)だし、スクータにも時計は付いてない。 | ||
| + | |||
| + | でで、回路図 | ||
| + | ===== 回路図 ===== | ||
| + | Eagleで部品登録がうまく行かなかったので。。。 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * RTC初期化時に設定する必要があるので、SWは二つ。 | ||
| + | * RTCは3Wire | ||
| + | * CN1はPICkit3接続ポート | ||
| + | * バイクバッテリ(12V)から5Vをドロッパで作り動作させる。 | ||
| + | |||
| + | PICkit3では、PGC, | ||
| + | |||
| + | ででで、ソース | ||
| + | ===== ソース ===== | ||
| + | 題して、バイクメータ、そのままやんけ。\\ | ||
| + | main初期化部 | ||
| + | <code c#> | ||
| + | / | ||
| + | // for PIC18F1320 | ||
| + | // | ||
| + | // | ||
| + | ******************************************************/ | ||
| + | #include < | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | // VCFG1, | ||
| + | // CHS2,1,0 AN0=000, | ||
| + | #define ADON_AN1 0b00000101 | ||
| + | #define ADON_AN2 0b00001001 | ||
| + | #define LED_pwr PORTAbits.RA0 | ||
| + | #define LED_paper PORTAbits.RA4 | ||
| + | #define SW_feed PORTAbits.RA7 | ||
| + | #define SW_menu PORTAbits.RA6 | ||
| + | |||
| + | void send_dec3(char, | ||
| + | void rtc_init(void); | ||
| + | void rtc_init_mode_in(void); | ||
| + | void get_minmax(int, | ||
| + | |||
| + | // | ||
| + | char rtc_today[7]; | ||
| + | int temp_max, | ||
| + | char start_time[7]; | ||
| + | // | ||
| + | |||
| + | main() | ||
| + | { | ||
| + | /* | ||
| + | // | ||
| + | __EEPROM_DATA(" | ||
| + | __EEPROM_DATA(" | ||
| + | __EEPROM_DATA(" | ||
| + | __EEPROM_DATA(" | ||
| + | __EEPROM_DATA(" | ||
| + | */ | ||
| + | char a; | ||
| + | char led1, | ||
| + | int an1data, | ||
| + | // | ||
| + | unsigned int past_time, | ||
| + | long tmp10_long; | ||
| + | // | ||
| + | char mm, | ||
| + | char mode; | ||
| + | |||
| + | OSCCON = 0b01111111; | ||
| + | |||
| + | EECON1 = 0b00010001; | ||
| + | |||
| + | ADCON0 = ADON_AN1; | ||
| + | ADCON1 = 0xFD; // AN1 only use | ||
| + | ADCON2 = 0b10100101; | ||
| + | |||
| + | PORTA = 0;// IO 初期化 | ||
| + | PORTB = 0; | ||
| + | TRISA = 0xEE; // 0=Out RA0,RA4 | ||
| + | TRISB = 0b10100000; | ||
| + | |||
| + | temp_max = -1000; | ||
| + | temp_min = 1000; | ||
| + | volt_max = 0; | ||
| + | volt_min = | ||
| + | |||
| + | mode=0; | ||
| + | |||
| + | led1 = 1; | ||
| + | LED_pwr = led1; | ||
| + | LED_paper = led1; | ||
| + | |||
| + | |||
| + | rtc_portinit(); | ||
| + | lcd_init(); | ||
| + | |||
| + | if(rtc_get_stat() > 0 ){ | ||
| + | rtc_init_mode_in(); | ||
| + | rtc_init(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | LCD関係 | ||
| + | <code c> | ||
| + | void shiftreg_lat() | ||
| + | { | ||
| + | SOLAT = 1; /* latch is rise edge */ | ||
| + | DelayUs(1); | ||
| + | SOLAT = 0; | ||
| + | } | ||
| + | |||
| + | |||
| + | void send_data(char data) | ||
| + | { | ||
| + | signed char c; | ||
| + | /* send MSB first */ | ||
| + | for(c=7; | ||
| + | SODAT = data>> | ||
| + | DelayUs(1); | ||
| + | SOCLK = 1; | ||
| + | DelayUs(1); | ||
| + | SOCLK = 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void send_to_lcd(char data,char rs) | ||
| + | { | ||
| + | char ctrl_data; | ||
| + | /* data MSB 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 LSB*/ | ||
| + | /* 0 0 0 BkON BkHi 0 RS E Data---- | ||
| + | |||
| + | ctrl_data = 0x01 | BKL_AKARUI | rs ; /* E=1, | ||
| + | send_data( ctrl_data ); | ||
| + | send_data( data ); | ||
| + | shiftreg_lat(); | ||
| + | |||
| + | ctrl_data = ctrl_data & 0b11111110 ; /* E=0 */ | ||
| + | send_data( ctrl_data ); | ||
| + | send_data( data ); | ||
| + | shiftreg_lat(); | ||
| + | } | ||
| + | |||
| + | void lcd_locate(char location) | ||
| + | { | ||
| + | /* location 00h=Row1/ | ||
| + | location |= 0x80; /* rise bit7=1 */ | ||
| + | send_to_lcd( location , RS0); /*set DDRAM addr to 40h */ | ||
| + | } | ||
| + | |||
| + | /* write a string of chars to the LCD */ | ||
| + | void lcd_puts(const char * s) | ||
| + | { | ||
| + | while(*s) | ||
| + | send_to_lcd( *s++ , RS1 ); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ADCのところ | ||
| + | <code c> | ||
| + | while(1){ | ||
| + | ADCON0 = ADON_AN1; | ||
| + | GO_DONE=1; | ||
| + | while(GO_DONE); | ||
| + | an1data = (ADRESH<< | ||
| + | |||
| + | DelayMs(10); | ||
| + | |||
| + | ADCON0 = ADON_AN2; | ||
| + | GO_DONE=1; | ||
| + | while(GO_DONE); | ||
| + | an2data = (ADRESH<< | ||
| + | an2data = an2data * 5 * 10 / 256; | ||
| + | |||
| + | tmp10_long = (long)an1data * 500 - 245760; | ||
| + | tmp10_long = tmp10_long / 410; | ||
| + | tmp10 = (int)tmp10_long; | ||
| + | |||
| + | </ | ||
| + | メモリが足りてるので、温度はlongで計算。 | ||
| + | |||
| + | |||
softdev/tempmeter2.1331129132.txt.gz · 最終更新: (外部編集)
