HI all,
I moved this to a 16F627 and made the code as straight as I could.
The problem is much like it has been for a while: The direction signal is erratic and can be tricked by interaction with the other encoder.
Any thoughts would be appreciated.
Code:
'****************************************************************
'* Notes : 16F627@20mhz, HS_OSC *
'* : PBP 2.50c, MPASM: 5.11,
' 1) Quadrature encoder reading direction and speed of mechanical slide.
' 2) Motor (servo) driven in ONE direction of slide movement,
' not driven for other direction. Pulse & Direction drive LOW.
' 3) Manual Encoder to drive servo either direction manually.
' 16F627
' ----------------u-----------------
' -1|RA2/AN2/Vref RA1/AN1 |18- direction LEVEL output
' -2|RA3/AN3/CMP1 RA0/AN0 |17- Step PULSE o/p, Active LOW
' -3|RA4/TOCKI/CMP2 RA7/OSC1/CLKIN |16-
' -4|RA5/MCLR/vpp RA6/OSC2/CLKOUT |15-
' -5|-- VSS VDD++ |14-
' -6|RB0/INT RB7/T1OSI/PGD |13- Manual Encoder B input
' -7|RB1/RX/DT RB6/T1OSCO/T1CKI/PGC |12- Manual Encoder A input
' -8|RB2/TX/CK RB5 |11- Travel encoder B input
' -9|RB3/CCP1 RB4/PGM |10- Travel encoder A input
' ----------------------------------
DEFINE OSC 20
INCLUDE "AllDigital.pbp"
clear
P_out var PORTA.0 ' Step PULSE output to motor, Active LOW
D_out var PORTA.1 ' LEVEL output for direction
syncM var PORTA.2 ' output for testing timing
syncI var PORTA.3
Dir VAR byte ' Direction
EncOld var byte
EncNew var byte
OPTION_REG = %00000000 ' Pull-up Enabled
TRISA = %00000000
TRISB = %11110000
TravEnc con %00110000
ManEnc con %11000000
P_out = 1 ' start out HI. Moves on LOW pulse
goto Main
'********** Subs ***************************
ManDrive:
Dir = EncNew.7 ^ EncOld.6 ' XOR new L bit > Old Rt bit=Direction
D_out = Dir ' set direction pin
pauseus 2 ' minimum 3.5uS for Gecko drive
P_out = 0 ' send drive pulse either dir
pauseus 2
P_out = 1 ' reset drive pulse
return
TravDrive:
D_out = 1 ' set direction pin
Dir = EncNew.5 ^ EncOld.4 ' XOR new L bit > Old Rt bit=Direction
If DIR = 0 then ' end if travel DOWN
P_out = 0 ' send drive pulse retract only
pauseus 2
P_out = 1 ' reset drive pulse
endif
return
'******* MAIN ***********************************************
Main:
'TOGGLE syncM ' pulse to time Main loop
EncNew = PORTB ' get the new state of both encoders
if (EncNew & ManEnc) != (EncOld & ManEnc) then ' man not same? Drive Man
gosub ManDrive
endif
if (EncNew & travEnc) != (EncOld & TravEnc) then ' Trav not same? Drive Trav
GOSUB TravDrive
endif
EncOld = EncNew ' save the previous state of both encoders
goto main
end
Thanks
Mark
Bookmarks