春節期間閑來沒事,用廢控制器(PIC16F72版)做了一個測電機轉速的東東.
原理是:檢測單位時間內的霍耳換相數,再換算成每分鐘轉速.因目前市面上有32\40\46\56\70片磁鋼的電機,只能用外部切換選擇了.
、硬件約定:
RB口對應7段輝光管,BIT0-A……BIT6-G,不用小數點.
RC口對應位,動態顯示,BIT7-千位……BIT4-個位.
RA口對應電機選擇:
000-32片磁鋼
001-40片磁鋼
010-46片磁鋼
011-56片磁鋼
100-70片磁鋼
RA口之3用來輸入霍耳信號,RA口之4用來輸出采樣周期信號,以調試程序。
;用中斷時間來控制采樣周期,0.5--1秒刷新一次,預計精度為千分之一。
#INCLUDE
; RAM_VARIABLE
LS_1 EQU 0X25 ;臨時寄存器
LS_2 EQU 0X26
LS_3 EQU 0X27
LS_4 EQU 0X28
LS_5 EQU 0X29
LS_6 EQU 0X2A
LS_7 EQU 0X2B
LS_8 EQU 0X2C
LS_9 EQU 0X2D
LJIA_1 EQU 0X2E
LJIA_2 EQU 0X2F
LJIA_3 EQU 0X30
LJIA_4 EQU 0X31 ;數據累加寄存器
XIANS_1 EQU 0X32
XIANS_2 EQU 0X33
XIANS_3 EQU 0X34
XIANS_4 EQU 0X35 ;顯示寄存器
DFEN_1 EQU 0X36 ;動態分配寄存器
FLAG EQU 0X37 ;標旗寄存器
LS_INT1 EQU 0X39 ;中斷保護寄存器1
LS_INT2 EQU 0X3A ;中斷保護寄存器2
JS_INT1 EQU 0X3B ;中斷計數器1
JS_INT2 EQU 0X3C ;中斷計數器2
JS_INT3 EQU 0X3D ;中斷計數器3
; =========================================================
ORG 0X000
NOP
GOTO PROGRAM
ORG 0X4
GOTO ZHONGDUAN
PROGRAM ;程序開始
CALL CSH
CLRWDT
LOOP5 CALL SHONGX
CALL DINPOT_0
BTFSC FLAG,0
GOTO LOOP5
CALL ALLADD
BTFSC FLAG,3 ;單\雙計數選擇
CALL ALLADD
LOOP6 CALL SHONGX
CALL DINPOT_1
BTFSS FLAG,1
GOTO LOOP6
CALL ALLADD
BTFSC FLAG,3 ;單\雙計數選擇
CALL ALLADD
GOTO LOOP5
ORG 0X20
;===============================================================
CHABIAO ;查表
MOVWF PCL
RETLW 0X3F ;00111111
RETLW 0X6 ;00000110
RETLW 0X5B ;01011011
RETLW 0X4F ;01001111
RETLW 0X66 ;01100110
RETLW 0X6D ;01101101
RETLW 0X7D ;01111101
RETLW 0X7 ;00000111
RETLW 0X7F ;01111111
RETLW 0X6F ;01101111
RETLW 0X79 ;01111001 ,E,表示超出量程
RETLW 0X79
;==================================================================
CSH ;初始化
BCF STATUS,RP0 ;體0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF CCP1CON ;CCP模塊設置(禁用)
BSF STATUS,RP0 ;體1
CLRF PIE1 ;外設中斷禁止
MOVLW 0XDF
MOVWF TRISA
CLRF TRISB
CLRF TRISC ;I/O口設置
MOVLW 0X88
MOVWF OPTION_REG ;分頻器設定
MOVLW 0X7
MOVWF ADCON1 ;A口全設為數字口
BCF STATUS,RP0 ;體0
CLRF T1CON
CLRF SSPCON ;串口禁止
CLRF CCPR1L
MOVLW 0X5C
MOVWF 0X22
MOVLW 0X23
MOVWF FSR
LOOP1 CLRF INDF ;通用寄存器清零
INCF FSR,F
DECFSZ 0X22,F
GOTO LOOP8
BCF STATUS,RP0
MOVLW 0X80
MOVWF ADCON0 ;AD設置
CLRF TMR0
MOVLW 0XA0
MOVWF INTCON ;中斷設置
RETURN
;================================================================
SHONGX ;送顯
INCF DFEN_1,F ;動態分配寄存器
MOVLW 0X1
SUBWF DFEN_1,W
BTFSC STATUS,Z
GOTO ZT_1
MOVLW 0X2
SUBWF DFEN_1,W
BTFSC STATUS,Z
GOTO ZT_2
MOVLW 0X3
SUBWF DFEN_1,W
BTFSC STATUS,Z
GOTO ZT_3
GOTO ZT_4
ZT_1 ;狀態1,個位送顯
MOVF XIANS_1,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X10
MOVWF PORTC
RETURN
ZT_2 ;狀態2,十位送顯
MOVF XIANS_2,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X20
MOVWF PORTC
RETURN
ZT_3 ;狀態3,百位送顯
MOVF XIANS_3,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X40
MOVWF PORTC
RETURN
ZT_4 ;狀態4,千位送顯
MOVF XIANS_4,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X80
MOVWF PORTC
CLRF DFEN_1
RETURN
;======================================================
DINPOT_0 ;讀輸入信號,0有效
MOVLW 0x8 ;連續判斷8次
MOVWF LS_1
CLRF LS_2
LOOP_1
BTFSS PORTA, 3
INCF LS_2, F
DECFSZ LS_1, F
GOTO LOOP_1
MOVLW 0x8
SUBWF LS_2, W
BTFSS STATUS, Z
GOTO LOOP_2
BCF FLAG,0 ;表示讀入0
RETURN
LOOP_2
BSF FLAG,0 ;表示讀入1
RETURN
;========================================================
DINPOT_1 ;讀輸入信號,1有效
MOVLW 0x8 ;連續判斷8次
MOVWF LS_3
CLRF LS_4
LOOP_3
BTFSC PORTA, 3
INCF LS_4, F
DECFSZ LS_3, F
GOTO LOOP_3
MOVLW 0x8
SUBWF LS_4, W
BTFSS STATUS, Z
GOTO LOOP_4
BSF FLAG,1 ;表示讀入1
RETURN
LOOP_4
BCF FLAG,1 ;表示讀入0
RETURN
;==========================================================
ALLADD ;信號累集
INCF LJIA_1,F
MOVLW 0XA
SUBWF LJIA_1,W
BTFSS STATUS,C
RETURN
INCF LJIA_2,F ;滿十進一
CLRF LJIA_1
MOVLW 0XA
SUBWF LJIA_2,W
BTFSS STATUS,C
RETURN
INCF LJIA_3,F ;滿百進一
CLRF LJIA_2
MOVLW 0XA
SUBWF LJIA_3,W
BTFSS STATUS,C
RETURN
INCF LJIA_4,F ;滿千進一
CLRF LJIA_3
MOVLW 0XA
SUBWF LJIA_4,W
BTFSS STATUS,C ;上萬則顯示故障
RETURN
MOVLW 0XB
MOVWF LJIA_4
RETURN
;========================================================
ZHONGDUAN ;中斷
MOVWF LS_INT1
SWAPF STATUS,W
BCF STATUS,RP0
MOVWF LS_INT2 ;現場保護
CLRWDT
MOVF PORTA,W
ANDLW 0X7
MOVWF LS_5
BTFSC STATUS,Z
GOTO XUANZ_32
MOVLW 0X1
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_40
MOVLW 0X2
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_46
MOVLW 0X3
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_56
MOVLW 0X4
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_70
GOTO XUANZ_46 ;電機選擇
;-------------------------------------------------------------
XUANZ_32 ;32片磁鋼電機
MOVLW 0X39
MOVWF LS_6
MOVLW 0X38
MOVWF LS_7
BSF FLAG,3 ;單\雙計數選擇
GOTO JISHU ;開始計數
XUANZ_40 ;40片磁鋼電機
MOVLW 0X2D
MOVWF LS_6
MOVLW 0XC7
MOVWF LS_7
BSF FLAG,3 ;單\雙計數選擇
GOTO JISHU ;開始計數
XUANZ_46 ;46片磁鋼電機
MOVLW 0X27
MOVWF LS_6
MOVLW 0XCE
MOVWF LS_7
BSF FLAG,3 ;單\雙計數選擇
GOTO JISHU ;開始計數
XUANZ_56 ;56片磁鋼電機
MOVLW 0X20
MOVWF LS_6
MOVLW 0XB3
MOVWF LS_7
BSF FLAG,3 ;單\雙計數選擇
GOTO JISHU ;開始計數
XUANZ_70 ;70片磁鋼電機
MOVLW 0X34
MOVWF LS_6
MOVLW 0X51
MOVWF LS_7
BCF FLAG,3 ;單\雙計數選擇
GOTO JISHU ;開始計數
;------------------------------------------------------------
JISHU ;開始計數
BTFSC FLAG,2 ;計數器滿期標記
GOTO CAIJIXH ;采集信號
INCF JS_INT1,F
BTFSS STATUS,Z
GOTO HFXC ;1號計數未滿,返回
INCF JS_INT2,F ;2號計數
MOVF LS_6,W
SUBWF JS_INT2,W
BTFSS STATUS,C
GOTO HFXC ;2號計數未滿,返回
BSF FLAG,2 ;2號計數已滿,打上標記
GOTO HFXC
;-----------------------------------------------------------
CAIJIXH ;采集信號
INCF JS_INT1,F
MOVF LS_7,W
SUBWF JS_INT1,W
BTFSS STATUS,C
GOTO HFXC ;1號計數余數未滿,返回
MOVF LJIA_1,W
MOVWF XIANS_1
MOVF LJIA_2,W
MOVWF XIANS_2
MOVF LJIA_3,W
MOVWF XIANS_3
MOVF LJIA_4,W
MOVWF XIANS_4
CLRF LJIA_1
CLRF LJIA_2
CLRF LJIA_3
CLRF LJIA_3
CLRF JS_INT1
CLRF JS_INT2
BCF FLAG,2 ;所用的計數器,標記位復位
BTFSC PORTA,5 ;用于驗證采樣周期
GOTO LOOP_9
BSF PORTA,5
GOTO HFXC
LOOP_9 BCF PORTA,5
HFXC BCF INTCON,2 ;恢復現場,出棧
SWAPF LS_INT2,W
MOVWF STATUS
SWAPF LS_INT1,F
SWAPF LS_INT1,W
RETFIE
END