シリアル通信で信号を受信してモーターを回してみる

前回の続き。今度はPICでモーターを回してみます。


一番右上のICがRS232CのレベルとTTLレベルを変換してくれています。その下にあるのがPIC16F88です。


波形


お粗末な作りのモーター駆動回路


仕様
・シリアル通信で1〜126の数値を受信
・受信したデータでモーターの回転数(トルク?)を調整
PWM制御でモーターを回す


PIC側の処理は案外すんなり作れた気がしています。

      LIST      p=16F88              ; list directive to define processor
      #INCLUDE <P16F88.INC>          ; processor specific variable definitions

      __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
      __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

     CBLOCK 0x20 ; Sample GPR variable registers allocated contiguously
         MYVAR1  ; User variable
         MYVAR2  ; User variable
         MYVAR3  ; User variable
     ENDC

 W_TEMP         EQU        0x7D  ; w register for context saving (ACCESS)
 STATUS_TEMP    EQU        0x7E  ; status used for context saving (ACCESS)
 PCLATH_TEMP    EQU        0x7F  ; variable used for context saving
 tmp equ 0x20
 onreg equ 0x21
 offreg equ 0x25
 nigoro equ 0x24
 down_onreg equ 0x22
 down_offreg equ 0x23

 DATAEE    ORG  0x2100
     DE    "MCHP"  ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3

 RESET     ORG     0x0000            ; processor reset vector
           PAGESEL START
           GOTO    START             ; go to beginning of program

 ISR       ORG     0x0004            ; interrupt vector location

 ;         Context saving for ISR
           MOVWF   W_TEMP            ; save off current W register contents
           MOVF    STATUS,W          ; move status register into W register
           MOVWF   STATUS_TEMP       ; save off contents of STATUS register
           MOVF    PCLATH,W          ; move pclath register into W register
           MOVWF   PCLATH_TEMP       ; save off contents of PCLATH register

 ;         Restore context before returning from interrupt
           MOVF    PCLATH_TEMP,W     ; retrieve copy of PCLATH register
           MOVWF   PCLATH            ; restore pre-isr PCLATH register contents
           MOVF    STATUS_TEMP,W     ; retrieve copy of STATUS register
           MOVWF   STATUS            ; restore pre-isr STATUS register contents
           SWAPF   W_TEMP,F
           SWAPF   W_TEMP,W          ; restore pre-isr W register contents
           RETFIE                    ; return from interrupt

 ;以下初期化処理
 START
 	;bank0
 	bcf	STATUS,RP0
 	bcf	STATUS,RP1

 	clrf INTCON
 	movlw b'10010000'
 	movwf RCSTA

 	;bank1
 	bsf	STATUS,RP0
 	bcf	STATUS,RP1

 	movlw b'00100100'
 	movwf TXSTA
 	movlw d'129'
 	movwf SPBRG
 	clrf TRISA
 	bsf TRISA , 4
 	clrf TRISB
 	bsf TRISB,2
 	clrf ANSEL
 
 	;bank0
 	bcf	STATUS,RP0
 	bcf	STATUS,RP1
 
 	clrf PORTA
 	clrf PORTB
 	clrf tmp
 	clrf onreg
 	clrf offreg
 	clrf down_onreg
 	clrf down_offreg
 	movlw d'255'
 	movwf nigoro
 
 	bsf PORTA,1
 
 pre
 	btfss PIR1,RCIF
 	goto $-1
 
 main_loop
 	btfss PIR1, RCIF
 	goto pwm_pre
 	goto come
 
 come
 	movfw RCREG
 	movwf onreg
 	sublw d'127'
 	movwf offreg
 
 pwm_pre
 	movfw onreg
 	movwf down_onreg
 	movfw offreg
 	movwf down_offreg
 
 pwm
 	decfsz down_onreg,f
 	goto on
 	goto off
 
 on
 	bsf PORTB,3
 	goto pwm
 
 off
 	decfsz down_offreg,f
 	goto still_off
 	goto main_loop
 
 still_off
 	bcf PORTB,3
 	goto off	
 
    END