春节期间闲来没事,用废控制器(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