Re: Hydraulic Pump Motor Control Options
hi all
here is the asm code for a pump switch as used in my excavator for a couple of years. Works on a 12f675 pic. I'll try and post a link to video of it working soon.
;=============================================
; written by Iain Dunn
; 2 August 2010 revision release
; version 1.2 PCB EXPRESSPCB main revised3
; file saved as pumpswitch675.asm
; for 12f675
; int clock 4MHz
;==============================================
; Description,3 or 4 channel inputs for pump control
; via 1 fet 19N10.
; Input 4 not programmed yet
;
; |----||----|
; | 100n |
; 5v--|-------|----0V
; NC----|12f675 |----in2 GP0
;GP4pumpout----| |----in1 GP1
; GP3 in4----|-------|----in3 GP2
;
List P=12f675 ; define processor
#INCLUDE <p12f675.inc> ; processor specific definitions
;================================================= =================
;configuration
;no data protect
;no code protect
;no brown out reset
;no MCLR pin function
;power up timer disabled
;Watchdog timer enabled
;oscillator INTOSC with no CLKOUT
__config _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
errorlevel -302 ;suppress error 302
radix dec ;everything in decimal
;unless indicated
;========== constants========================================= ============
;GPIO,1 chan1 GPIO,3 chan 2 all rest outputs
#define INPUT_1 1
#define INPUT_2 0
#define INPUT_3 2
#define PUMPOUT GPIO,4
#define minpulse 80
#define lowon 140
#define highon 160
#define maxpulse 220
#define OFFDLAY 20 ; delays switching off pump
#define TisBits (1<<INPUT_1)|(1<<INPUT_2)|(1<<INPUT_3)
;========Notes==================================== ========================
;pulses must be larger than 0.8ms to be valid and less than 2.2ms
;The switching limits are
;1.55 ms upper off 1550us
;1.45 ms lower off 1450us
;==========Variables============================== =======================
cblock 0x20
CHAN_1 ; channel 1 width
CHAN_2 ; channel 2 width
CHAN_3 ; channel 3 width
ARM_PULSES ; stores arm pulse count
ARM_1 ; channel 1 arm pulse count
ARM_2 ; channel 2 arm pulse count
ARM_3 ; channel 3 arm pulse count
Dlay
Dlay_outer
Dlay_inner
OffCount ; delays pump switch off for 1/2 second
endc
;=========Declarations============================ =======================
org 0 ;first instruction to be executed
goto START
;========Initilizations=========================== =======================
INIT clrf GPIO ;clear all outputs for now
bsf STATUS, RP0 ; bank 1
call 3FFh ;call osc calibration
movwf OSCCAL
movlw b'1001010' ;WDT scale 1:4 gives around 72ms
movwf OPTION_REG ;before reset
movlw TisBits ;GPIO 2,3,5 input GPIO,0,1,4 output
movwf TRISIO
clrf ANSEL
bcf STATUS, RP0 ;bank 0
movlw b'00000111' ;turn off comparator
movwf CMCON ;digital i/o
clrf T1CON ;turn off timer 1
clrf ADCON0
return
;========== Start of main outer loop of program ===============================
START call INIT
clrf GPIO
clrf CHAN_1 ;
clrf CHAN_2
clrf CHAN_3
movlw OFFDLAY
movwf OffCount
movlw 50
movwf ARM_PULSES
clrwdt
;========== wait for 25 valid pulses to arm =====================
ARMING
clrf ARM_1
clrf ARM_2
clrf ARM_3
btfss GPIO,INPUT_1
goto $-1
ARMLOOP_1 incf ARM_1,f
btfss GPIO,INPUT_1
b ARM2
nop
b $+1
b $+1
b ARMLOOP_1
ARM2 btfss GPIO,INPUT_2
goto $-1
ARMLOOP_2 incf ARM_2,f
btfss GPIO,INPUT_2
b ARM3
nop
b $+1
b $+1
b ARMLOOP_2
ARM3 btfss GPIO,INPUT_3
goto $-1
ARMLOOP_3 incf ARM_3,f
btfss GPIO,INPUT_3
b PULSE_1
nop
b $+1
b $+1
b ARMLOOP_3
PULSE_1 movlw lowon
subwf ARM_1,w ; ARM_1-lowon(148)
bnc ARMING
movlw highon
subwf ARM_1,w ; ARM_1-highon(152)
bc ARMING
PULSE_2 movlw lowon
subwf ARM_2,w ; ARM_2-lowon(148)
bnc ARMING
movlw highon
subwf ARM_2,w ; ARM_2-highon(152)
bc ARMING
PULSE_3 movlw lowon
subwf ARM_3,w ; ARM_3-lowon(148)
bnc ARMING
movlw highon
subwf ARM_3,w ; ARM_3-highon(152)
bc ARMING
VALID_NEUTRAL
clrwdt
decfsz ARM_PULSES,f
goto ARMING
;========= now armed beep from both motors ==========================================
movlw 10
movwf Dlay_outer
clrf Dlay_inner
PWM_LOOP clrwdt
bsf PUMPOUT
movlw 10
movwf Dlay
decfsz Dlay,f
goto $-1
clrf GPIO
movlw 100
movwf Dlay
decfsz Dlay,f
goto $-1
decfsz Dlay_inner,f
goto PWM_LOOP
decfsz Dlay_outer,f
goto PWM_LOOP
clrf GPIO ;turn motors off
;========= Wait for channel pulses to start =========================================
RCIN1 clrf CHAN_1
btfss GPIO,INPUT_1
b $-1
LOOP_1 incf CHAN_1,f
btfss GPIO,INPUT_1
b RCIN2
nop
b $+1
b $+1
b LOOP_1
RCIN2 clrf CHAN_2
btfss GPIO,INPUT_2
b $-1
LOOP_2 incf CHAN_2,f
btfss GPIO,INPUT_2
b RCIN3
nop
b $+1
b $+1
b LOOP_2
RCIN3 clrf CHAN_3
btfss GPIO,INPUT_3
b $-1
LOOP_3 incf CHAN_3,f
btfss GPIO,INPUT_3
b PROCESS_IN_1
nop
b $+1
b $+1
b LOOP_3
;==========process the channel timings ====================================
PROCESS_IN_1
clrwdt
movlw minpulse
subwf CHAN_1,w ; CHAN_1-minpulse(80)
bnc PROCESS_IN_2
movlw maxpulse
subwf CHAN_1,w ; CHAN_1-maxpulse(220)
bc PROCESS_IN_2
movlw lowon
subwf CHAN_1,w ; CHAN_1-lowon(145)
bnc PUMP_ON
movlw highon
subwf CHAN_1,w ; CHAN_1-highon(155)
bc PUMP_ON
PROCESS_IN_2
movlw minpulse
subwf CHAN_2,w ; CHAN_2-minpulse(80)
bnc PROCESS_IN_3
movlw maxpulse
subwf CHAN_2,w ; CHAN_2-maxpulse(220)
bc PROCESS_IN_3
movlw lowon
subwf CHAN_2,w ; CHAN_2-lowon(145)
bnc PUMP_ON
movlw highon
subwf CHAN_2,w ; CHAN_2-highon(155)
bc PUMP_ON
PROCESS_IN_3
movlw minpulse
subwf CHAN_3,w ; CHAN_3-minpulse(80)
bnc RCIN1
movlw maxpulse
subwf CHAN_3,w ; CHAN_3-maxpulse(220)
bc RCIN1
movlw lowon
subwf CHAN_3,w ; CHAN_3-lowon(145)
bnc PUMP_ON
movlw highon
subwf CHAN_3,w ; CHAN_3-highon(155)
bc PUMP_ON
PUMP_OFF
decfsz OffCount,f
b RCIN1
bcf PUMPOUT
movlw OFFDLAY
movwf OffCount
b RCIN1
PUMP_ON bsf PUMPOUT
movlw OFFDLAY
movwf OffCount
b RCIN1
;============End programme ================================================== ========
return
END
|