;****************************************************************************************** ; DC 12Vモーター制御サンプル(PWM方式) ; Program Name : ; Programer : ; Create date : Version 1.0 H17.11.03 ; History : ;****************************************************************************************** ; Define I/O ; GP0:TR(F2) ; GP1:TR(F1) ; GP2:A/D-Converter(AN2) ; GP3:None ; GP4:TR(R1) ; GP5:TR(R2) ; ;****************************************************************************************** ;====================== 以下はPIC12F683用の記述 ====================== LIST P=PIC12F683,ST=OFF,R=DEC INCLUDE "P12F683.inc" ;標準ヘッダ定義ファイル __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF ; ADANSH EQU 20H ADANSL EQU 21H LP1 EQU 22H INDAT EQU 23H LPDAT EQU 24H CNT EQU 25H CNT1 EQU 26H CNT2 EQU 27H ; ORG 0 GOTO START ORG 4 GOTO START START BSF STATUS,RP0 ; BANK1を選択 BSF OSCCON,6 ; 8MHzを設定 BSF OSCCON,5 ; 8MHzを設定 BSF OSCCON,4 ; 8MHzを設定 MOVLW B'00010100' ; Bit7:0, Bit6-4:ADC Clock, Bit3-0:Select Degital or Analog MOVWF ANSEL ; Bit3-0:全てアナログ,Bit6-4:1/8(中ぐらいの速さ)を指定 MOVLW B'001100' ; GP2,GP3は入力に設定 MOVWF TRISIO ; BANK1でPORT設定 BCF STATUS,RP0 ; BANK0を指定 MOVLW B'000111' ; BANK0でComparaterとして使わないでGP0-3はデジタルIO設定 MOVWF CMCON0 ; BANK0でデジタルIO設定 ※See 8.0 Comparater Control Register MOVLW B'010010' ; BANK0でポート初期化 MOVWF GPIO ; BANK0でポート初期化 MOVLW B'10001001' ; GP7:Fmt, GP6:VRef, GP5,4:None, GP3,2:Sel Bit, GP1:Start, GP0:ADC On MOVWF ADCON0 ; 結果を右詰,基準は電源電圧,AN2指定,測定準備,ADC ONを指定 ;===================================================================== MAIN CALL PROG1 ; GOTO MAIN ;****************************************************************************************** ; Function Name : PROG1 ; Title : プログラム(1) ; PWM方式によるDCモーター制御サンプル ; Input : ; Output : ; Disctiption : ;****************************************************************************************** PROG1 ; 1.A/D Conveter より電圧を得る(0->1024) CALL GETADC ; ; 2.変数補正 ; (1)10ビットADC変数を、(符号)+8ビット変数に加工(末尾1ビットは切り捨てる) =>INDAT MOVFW ADANSL MOVWF INDAT RRF INDAT,F BTFSS ADANSH,0 ; ビットデータが0の時, 0を立てる BCF INDAT,7 BTFSC ADANSH,0 ; ビットデータが1の時, 1を立てる BSF INDAT,7 ; (2) (1)変数をセンターゼロに補正する INDAT=>LPDAT ; 1)前進の場合 BTFSS ADANSH,1 ; A/D Converterの10ビットめが1の時(512->1023) GOTO PROG1A ; 補正なし) MOVFW INDAT MOVWF LPDAT GOTO PROG1B ; 2)後進の場合 PROG1A ; A/D Converterの10ビットめが0の時(0->511) ; 補正2)INDAT;0=>FF,,,,FF=>0;(FF-INDAT) MOVLW H'FF' MOVWF LPDAT MOVFW INDAT SUBWF LPDAT,F ; PROG1B ; 3.モータを回転させる ; a)FE回ループ MOVLW H'FE' MOVWF LP1 PROG1C ; (1)モータを初期化(停止状態) CALL MOFF ; (2)スピード変数(LPDAT > LP1)ならモーターを動かす MOVFW LP1 SUBWF LPDAT,W BTFSC STATUS,C CALL MMOVE ; (3)Wait(パルス幅を成型) CALL TIMER ; (4)ループの判定 DECFSZ LP1,F GOTO PROG1C RETURN ;****************************************************************************************** ; Function Name : MMOVE ; Title : モーターを動かす ; Input : ; Output : ; Disctiption : ;****************************************************************************************** MMOVE ; (1)前進 BTFSC ADANSH,1 ; A/D Converterの10ビットめが1の時(512->1023) CALL MFON ; (2)後進 BTFSS ADANSH,1 ; A/D Converterの10ビットめが1の時(0->511) CALL MBON RETURN ;****************************************************************************************** ; Function Name : MFON ; Title : モーターを前進させる ; Input : ; Output : ; Disctiption : ;****************************************************************************************** MFON ; 1.TRを止める BCF GPIO,0 BCF GPIO,5 BSF GPIO,1 BSF GPIO,4 ; 2.前進TRを進める BSF GPIO,5 BCF GPIO,4 ; RETURN ;****************************************************************************************** ; Function Name : MBON ; Title : モーターを後進させる ; Input : ; Output : ; Disctiption : ;****************************************************************************************** MBON ; 1.TRを止める BCF GPIO,0 BCF GPIO,5 BSF GPIO,1 BSF GPIO,4 ; 2.後進TRを進める BSF GPIO,0 BCF GPIO,1 ; RETURN ;****************************************************************************************** ; Function Name : MOFF ; Title : モーターを停止させる ; Input : ; Output : ; Disctiption : ;****************************************************************************************** MOFF ; 1.TRのBを止める BCF GPIO,0 BCF GPIO,5 ; 2.TRへの供給Rを切る BSF GPIO,1 BSF GPIO,4 ; RETURN ;****************************************************************************************** ; Function Name : GETADC ; Title : A/D Converter からのデータ収集関数 ; Input : ; Output : ADANSH : 上位2ビット ; ADANSL : 下位8ビット ;****************************************************************************************** GETADC BCF STATUS,RP0 ; BANK0を指定 BSF ADCON0,GO ; ADCの開始フラグを立てる BTFSC ADCON0,GO ; ADCの開始フラグが完了するまで待つ GOTO $-1 ; ADCの開始フラグが完了するまで待つ MOVFW ADRESH ; 上位2ビットデータ収集 MOVWF ADANSH ; 上位2ビットデータ代入 BSF STATUS,RP0 ; BANK1を指定 MOVFW ADRESL ; 下位8ビットデータ収集 BCF STATUS,RP0 ; BANK0を指定 MOVWF ADANSL ; 下位8ビットデータ代入 RETURN ;****************************************************************************************** ; Function Name : TIMER ; Disctiption : タイマー ; Input : ; Output : ;****************************************************************************************** TIMER MOVLW H'0A' MOVWF CNT1 TIMER1 MOVLW H'0A' MOVWF CNT TIMER2 DECFSZ CNT,F GOTO TIMER2 DECFSZ CNT1,F GOTO TIMER1 RETURN END