|
2007/08/25 13:20
http://blog.naver.com/kash99/41426631
http://oasis.halfmoon.jp/other/pic-ic/675-temp-sensor.html
12F675 (와)과LM35 (을)를 이용한 시리얼 접속 온도계
![]() |
12F675 (와)과LM35 (을)를 이용했다 시리얼 접속 온도계 |
Updated on 13. March. 2005 |
PIC 12F675 (와)과 LM35DZ (을)를 이용한, 시리얼 접속의 온도계
※주의:PIC 마이크로컴퓨터를 이용한 첫 회로 제작이므로, 실수가 있을지도 모릅니다
소요 시간 : 회로설계 1 시간, 회로 제작 30 분 , 프로그램 작성과 테스트 3 시간.
온도 센서(LM35DZ )(은)는,0 ℃그리고0mV (을)를, 이후 10mV/ ℃ 의 전압을 출력한다.유효증폭기(LM358 )(으)로10 배에 증폭해,12F675 의A/D 변환기(AN3 핀)에 입력하고 있다.
가격은 참고 가격
PIC 마이크로컴퓨터 | 12F675 | 1 개 (@200 엔) |
온도 센서IC | LM35DZ | 1 개 (@250 엔) |
범용 유효증폭기 | (LM358 동등품) ST LM358N | 1 개 (@40 엔) |
RS-232C 드라이버IC | (ADM232 동등품) Sipex SP232ACP | 1 개 (@250 엔) |
적층 세라믹·콘덴서 | 0.1uF (104) | 5 개 (@IC (와)과 세트품) |
탄소 피막 저항 | 27K, 1/4W | 1 개 (@5 엔) |
탄소 피막 저항 | 3K, 1/4W | 1 개 (@5 엔) |
탄소 피막 저항 | 470, 1/4W | 1 개 (@5 엔) |
LED( 발광 다이오드) | 2V, 20mA | 1 개 (@20 엔) |
알루미늄 전해 콘덴서 | 470uF, 16V | 1 개 (@30 엔) |
적층 세라믹·콘덴서 | 0.1uF, 50V | 1 개 (@20 엔) |
IC 소켓 | DIP 16pin 용 | 1 개 (@40 엔) |
IC 소켓 | DIP 8pin 용 | 1 개 (@25 엔) |
기판 실장 연결기 | 9pin | 1 개 (@40 엔) |
유니버설 기판 | 1 매 (@85 엔) | |
합계 금액 1015 엔 |
완성한 기판의 표면, 이면의 모습
온도센서 회로의 동작중 (USB-RS232C 컨버터의 포토에 접속중)
원시 코드 및, 컴파일 한 출력 파일을 놓아둡니다.프로그램 방법의 참고로 해 주세요.
Version 1.0 | ![]() |
Version 2.0 ( 통상은 이쪽을 이용해 주세요) | ![]() |
Version 2.0 (을)를 컴파일 한 출력 | ![]() |
이 프로그램은 동작 확인용의 테스트 프로그램이므로, 불필요한 테스트용 코드가 파묻히고 있습니다(테스트 문자의 출력, 테스트용 카운터 등).
Version 2.0 그리고, 다른 계측 기기와 정합성을 취하기 위해 데이터말 코드를LF(0x0a) (으)로 변경했습니다.
시리얼 경유로 송출하는 데이터는,16 진수입니다.
OpAmp 출력이 0V 때에 "0000" (을)를,OpAmp 출력이5V 때에 "03FF" (을)를 송출합니다.
왜,16 진출력인가?
10 진출력의 처리가 어려울 것 같은 위, 나눗셈 (A/D 변환치에 50/1024 (을)를 곱해 섭씨 온도에 변환) 하는 것이 귀찮았기 때문에입니다.x86 의 어셈블러에 익숙한 몸에는,PIC 의 너무 빈약하고 독특한 어셈블러를 갑자기 잘 다루는 것은 무리이겠지요 (웃음). 16 진문자열로 출력만 해 두면, 수신한 PC측에서 Visual C 같은 것으로 은근하게 프로그램을 짜는 것만으로, 있어 이러하게도 사용할 수 있습니다.(와 도망치고 있습니다…)
수신측의 PC는,2400bps, 패리티 없음으로 계속 수신하면OK 입니다.
Windows 옆은, 시리얼 경유로 보내져 오는 데이터를 연속 수신하면 좋은 것뿐입니다.
프로그램을 기동하면, 동작환경의 설정을 실시합니다
프로그램을 종료할 때까지, 오로지 데이터를 변환해 계속 표시할 만한 프로그램입니다
파일에 출력하는 경우도, 이 화면은 표시됩니다
샘플·프로그램의 원시 코드(Microsoft Visual C++ 용무)를 놓아두기 때문에, 어떻게 프로그램 하면 좋은 것인지 모르는 경우의 참고로 해 주세요.이러한 파일은 프리·소프트웨어입니다.무상·무제한의 조건을 채우면 재배포 가능합니다.
어플리케이션 | ![]() ![]() |
메인·다이얼로그 | ![]() ![]() |
시리얼 수신 스렛드 | ![]() ![]() |
그 외 | ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
저작권 표시, 재배포 조건 | ![]() |
컴파일 결과 (실행 파일) | ![]() |
Visual C++ (을)를 가지고 있지 않은 사람은, 맨 밑의 「실행 파일」 밖에 도움이 되지 않습니다 (웃음)
내셔널·반도체 LM35DZ 섭씨 직독 온도센서
전원 전압 +35V ~ -0.2V … 이번은 +5V 그리고 이용.
출력전압 +6V ~ -1.0V … 이번은 12F675 의 A/D 변환을 이용하기 위해(때문에) +5V ~ 0V 의 범위를 이용.
출력 전류 10mA
동작 범위 0 ℃ ~ 100 ℃ … 이번은 12F675 의 A/D 변환을 이용하기 위해(때문에) 0 ℃~ 50 ℃ 의 범위를 이용.
오차 +25 ℃그리고±0.6 ℃
데이터 쉬트 http://www.national.com/pf/LM/LM35.html
내셔널·반도체 LM358N 범용 유효증폭기
전원 전압 +3V ~ 32V … 이번은 +5V 그리고 이용.
전형적인 회로로의 증폭 계산은, 다음과 같이
이번은,R1=3k, R2=27k 그리고 Gain = 1 + 27/3 = 10 의 10 배증폭을 이용하고 있다.
LM358 의 시방서로는, 최대 증폭은 전원 전압보다 낮은 값이 되므로,5V 까지의 증폭은 할 수 없는 것이라고 생각된다.
데이터 쉬트 http://www.national.com/pf/LM/LM358.html
마이크로칩·테크놀로지 PIC 12F675
10bit A/D 변환, 클락(4MHz )(을)를 내장한 마이크로컴퓨터
전원 전압 +2.2V ~ 5.5V (상온 환경에서A/D 변환ON ) … 이번은 +5V 그리고 이용.
메모리 (프로그램용 1024Word , 데이터 64Word , 데이터EPROM 128Word ,1Word=8bit )
I/O (GPIO) 6 포토
A/D 변환 4 포토 (10bit 변환)
데이터 쉬트 http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010114
아날로그·데바이세스(MAXIM ) ADM232 RS-232 인터페이스·디바이스
전원 전압 +3.0V ~ 5.5V … 이번은 +5V 그리고 이용.
데이터 쉬트 http://www.maxim-ic.com/alternatives.cfm/part/ADM232/pk/287
온도계 (니시모토씨) (← 16bitHEX 의BCD 변환의 소스가 실리고 있습니다)
PIC (와)과 온도계 모듈을 이용한, 온도계측장치의 작성 (아사히 대학)
PIC 판 3분 타이머 부착 실온계 (나라현 경영자 협회 청년부 예회)
12f675-temp-20.asm
; LM35で計測した温度を、シリアル経由で送出するプログラム ; (テスト用) ; ; GP0 : 出力 (動作表示用LED) ; GP1 : 出力 (RS232C信号) ; GP2 : 入力 (RS232C信号) 未実装 ; GP4 : 受信 (LM35からのアナログデータ) ; ; データ形式 : "TEMP xx yyyy<LF>" xx=カウンタ、yyyy=温度、<LF>=0x0a ; ; バージョン V02 ; program by 井上 博計 / MAR.20.2005 ; 動作保証無。転載、改変自由 list p=pic12f675 ; プロセッサ名変更 PIC12F629 へ #include <p12f675.inc> ; プロセッサに合わせて、INCファイル変更 errorlevel -302 ; エラーレベル追加 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ; 変数のメモリへのマッピング CBLOCK 0x20 ; 12F629 の BANK0 メモリはアドレス 0x20~0x5f が利用可能 CNT1 CNT2 CNT3 BUF _COUNTER ; テスト用カウンター _RS232_TMPN1 NUM_CHAR10 ; 数字を文字列に変換する時に利用する NUM_CHAR1 ENDC ;*************************** ; プログラム開始 ;*************************** ORG 0x000 GOTO PROGRAM_START ORG 0x004 ; 不意の割り込みが発生した場合 RETFIE PROGRAM_START ; GPIO の IN/OUT 設定 (GP1 を OUTPUT, GP4-AN3 を INPUT) BSF STATUS, RP0 ; Select Bank 1 MOVLW B'00010000' ; bit=0:出力、bit=1:入力 MOVWF TRISIO ; GPIO GP0 ~ GP2 のコンパレータ設定 (OFFとする) BCF STATUS, RP0 ; Select Bank 0 MOVLW 0x07 ; コンパレータを使わない MOVWF CMCON BSF STATUS, RP0 ; Select Bank 1 MOVLW B'00011000' ; A/D変換のクロックとポート ; Fosc/8, IN=AN3 MOVWF ANSEL BCF STATUS, RP0 ; Select Bank 0 BCF INTCON, PEIE ; 周辺割り込みすべてOFF MOVLW B'00000010' MOVWF GPIO ; 未送信時はつねに1を送りつづける ;*************************** ; 電源投入後、3秒待つ ;*************************** CALL DELAY_1SEC ; 1秒待ち CALL DELAY_1SEC ; 1秒待ち CALL DELAY_1SEC ; 1秒待ち CLRF _COUNTER MOVLW A'V' CALL SEND232C_CHAR MOVLW A'0' CALL SEND232C_CHAR MOVLW A'2' CALL SEND232C_CHAR MOVLW H'0a' CALL SEND232C_CHAR ;*************************** ; メイン・ループ ;*************************** MAIN ;*************************** ; 文字列 "TEMP " を RS232Cへ出力 ;*************************** MOVLW A'T' CALL SEND232C_CHAR MOVLW A'E' CALL SEND232C_CHAR MOVLW A'M' CALL SEND232C_CHAR MOVLW A'P' CALL SEND232C_CHAR MOVLW A' ' CALL SEND232C_CHAR ;*************************** ; カウンター "00" をRS232Cへ出力 (2桁の16進数文字列) ;*************************** MOVF _COUNTER, W CALL SEND232C_NUM MOVLW A' ' CALL SEND232C_CHAR INCF _COUNTER, F ; _COUNTER++ ;*************************** ; 温度データをA/D変換 ;*************************** MOVLW B'10001101' ; AD変換開始 (右桁そろえ、AN3) MOVWF ADCON0 CALL DELAY_27USEC BSF ADCON0, 1 ; GOビット=1 で変換開始 AD_WAIT_LOOP BTFSC ADCON0, 1 ; GOビット=1はまだ変換中。=0は次の命令をスキップ GOTO AD_WAIT_LOOP ;*************************** ; 温度データ"0000" をRS232Cへ出力 (4桁の16進数文字列) ;*************************** MOVF ADRESH, W CALL SEND232C_NUM BSF STATUS, RP0 ; Select Bank 1 MOVF ADRESL, W BCF STATUS, RP0 ; Select Bank 0 CALL SEND232C_NUM ;*************************** ; 改行コードをRS232Cへ送出 ;*************************** MOVLW H'0a' CALL SEND232C_CHAR ;*************************** ; 動作確認用のLEDを点灯 (LED点灯・消灯で1秒かせぐ) ;*************************** MOVLW B'00000011' ; LED 点灯 MOVWF GPIO CALL DELAY_100MSEC ; 0.1秒待ち ; LED 消灯 MOVLW B'00000010' MOVWF GPIO CALL DELAY_900MSEC ; 0.9秒待ち GOTO MAIN ;*************************** ; ここからサブルーチン部 ;*************************** ;*************************** ; 1文字をRS232Cへ送出 (送出文字はWレジスタで受け取る) ;*************************** SEND232C_CHAR MOVWF BUF ; 送出すべき文字(8bit)を BUFに入力 MOVLW B'00000000' ; スタートビット 0 を送出 MOVWF GPIO CALL DELAY_417USEC ; 417マイクロ秒待つ (2400bps) MOVLW D'8' ; 送出する文字データは 8bit MOVWF CNT1 ; データを下位ビットから、1つずつ送る SEND232C_CHAR_LOOP MOVLW B'00000000' BTFSC BUF, 0 ; BUFのbit0が0なら、次の行をスキップ MOVLW B'00000010' MOVWF GPIO CALL DELAY_417USEC ; 417マイクロ秒待つ (2400bps) RRF BUF, F ; BUFを右へ1ビットずらし、結果をBUFに書き戻す DECFSZ CNT1, F ; CNT1=CNT1-1、結果が0なら次の行はスキップ GOTO SEND232C_CHAR_LOOP MOVLW B'00000010' ; ストップビット 1 を送出 MOVWF GPIO CALL DELAY_417USEC ; 417マイクロ秒待つ (2400bps) RETURN ;*************************** ; 1バイトの数字を、2桁の16進数文字列で送信(末尾改行なし) ; (送出する数字データはWレジスタで受け取る) ;*************************** SEND232C_NUM MOVWF _RS232_TMPN1 ; 送出すべき文字(8bit)を _RS232_TMPN1に入力 CLRF NUM_CHAR10 ; 各桁を入れるバッファをクリアする CLRF NUM_CHAR1 ;*************************** ; 10の位の文字化 ;*************************** MOVF _RS232_TMPN1, W ; W=_RS232_TMPN1 MOVWF CNT1 ; CNT1=W SWAPF CNT1, F ; CNT1の上4bit、下4bitを入れ替える MOVLW B'00001111' ; W=b'00001111' ANDWF CNT1, F ; CNT1=CNT1&&W 下4bitを取り出す MOVF CNT1, W ; W=CNT1 SUBLW H'09' ; W=0x09-W CNT1が0~9のときCF=1 BTFSS STATUS, 0 ; CF=1 の時、次行をスキップ GOTO SEND232C_NUM_1 ; 0~9の処理 MOVLW A'0' ; W=(char)'0' ADDWF CNT1, F ; CNT1=CNT1+W GOTO SEND232C_NUM_2 SEND232C_NUM_1 ; A~Fの処理 MOVLW D'10' ; W=10 SUBLW A'A' ; W=(char)'A'-W ADDWF CNT1, F ; CNT1=CNT1+W SEND232C_NUM_2 MOVF CNT1, W ; W=CNT1 MOVWF NUM_CHAR10 ; NUM_CHAR10=W 10の位確定 CALL SEND232C_CHAR ; 1文字送信 ;*************************** ; 1の位の文字化 ;*************************** MOVF _RS232_TMPN1, W ; W=_RS232_TMPN1 MOVWF CNT1 ; CNT1=W MOVLW B'00001111' ; W=b'00001111' ANDWF CNT1, F ; CNT1=CNT1&&W 下4bitを取り出す MOVF CNT1, W ; W=CNT1 SUBLW H'09' ; W=0x09-W CNT1が0~9のときCF=1 BTFSS STATUS, 0 ; CF=1 の時、次行をスキップ GOTO SEND232C_NUM_3 ; 0~9の処理 MOVLW A'0' ; W=(char)'0' ADDWF CNT1, F ; CNT1=CNT1+W GOTO SEND232C_NUM_4 SEND232C_NUM_3 ; A~Fの処理 MOVLW D'10' ; W=10 SUBLW A'A' ; W=(char)'A'-W ADDWF CNT1, F ; CNT1=CNT1+W SEND232C_NUM_4 MOVF CNT1, W ; W=CNT1 MOVWF NUM_CHAR1 ; NUM_CHAR10=W 1の位確定 CALL SEND232C_CHAR ; 1文字送信 RETURN ;*************************** ; 特定秒数をかせぐ、ウェイトサブルーチン ;*************************** ; 1命令サイクル = 4クロック ; 4MHzクロック時は、1命令は1MHz(=1usec) ;*************************** ; 27マイクロ秒待つ (A/D変換) DELAY_27USEC MOVLW D'8' MOVWF CNT2 DELAY_27USEC_LOOP DECFSZ CNT2,F GOTO DELAY_27USEC_LOOP RETURN ;*************************** ; 417マイクロ秒待つ (2400bps) DELAY_417USEC MOVLW D'80' MOVWF CNT2 DELAY_417USEC_LOOP GOTO $+1 DECFSZ CNT2,F GOTO DELAY_417USEC_LOOP RETURN ;*************************** ; 50ミリ秒待つ DELAY_50MSEC MOVLW D'50' MOVWF CNT1 DELAY_50MSEC_LOOP0 ; ((4*250)+5)*50サイクル = 50250サイクル MOVLW D'250' MOVWF CNT2 DELAY_50MSEC_LOOP1 ; 4*250サイクル NOP ; 1 DECFSZ CNT2, F ; 1(no skip), 2 GOTO DELAY_50MSEC_LOOP1 ; 2 DECFSZ CNT1, F ; 1(no skip), 2 GOTO DELAY_50MSEC_LOOP0 ; 2 RETURN ;*************************** ; 1秒待つ DELAY_1SEC MOVLW d'20' MOVWF CNT3 ; 50msec * 20 DELAY_1SEC_LOOP CALL DELAY_50MSEC DECFSZ CNT3, F GOTO DELAY_1SEC_LOOP RETURN ;*************************** ; 0.5秒待つ DELAY_500MSEC MOVLW d'10' MOVWF CNT3 ; 50msec * 10 DELAY_500MSEC_LOOP CALL DELAY_50MSEC DECFSZ CNT3, F GOTO DELAY_500MSEC_LOOP RETURN ;*************************** ; 0.9秒待つ DELAY_900MSEC MOVLW d'18' MOVWF CNT3 ; 50msec * 18 DELAY_900MSEC_LOOP CALL DELAY_50MSEC DECFSZ CNT3, F GOTO DELAY_900MSEC_LOOP RETURN ;*************************** ; 0.1秒待つ DELAY_100MSEC MOVLW d'2' MOVWF CNT3 ; 50msec * 2 DELAY_100MSEC_LOOP CALL DELAY_50MSEC DECFSZ CNT3, F GOTO DELAY_100MSEC_LOOP RETURN END
[출처] 12F675 (와)과LM35 (을)를 이용한 시리얼 접속 온도계|작성자 시간여행
|