I have a project where I have to move a small trolley on a rail forwards until it reach a proximity switch A. I then need to move the trolley backwards until it reach proximity switch B. Once again, I have to change the direction to move the trolley forwards. Because of the weight of the trolley I have used PWM to accelerate the trolley rather than to switch it hard on or off. This has to run continuously for weeks in order to test a laser scanner.
Everything works fine but I would like to add a time out function should the next proximity switch not be reached in 20 seconds. It should then just stop motor and the application.
Code:
'****************************************************************
'* Name : 12F675_Motor_Control_SoftStart_and Brake *
'* Author : Jaco Muller *
'* Notice : Copyright (c) 2010 Jaco Muller *
'* : All Rights Reserved *
'* Date : 01/04/10 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
@ DEVICE PIC12F675,MCLR_OFF,INTRC_OSC_NOCLKOUT,WDT_OFF,BOD_OFF
Include "modedefs.bas" ' Mode definitions for Serout
'-------------------------------------------------------------------
' PIC12F675 on Transtoll Motor Control Board Part Number 4410A
'-------------------------------------------------------------------
' PIN NAME USE/CONNECTION
' 1 Vdd +5VDC
' 2 GPIO.5 Q3 +24V on Output +
' 3 GPIO.4 Input IN1
' 4 GPIO.3 Input IN2
' 5 GPIO.2 Q8 0V on Output -
' 6 GPIO.1 Q4 +24V on Output -
' 7 GPIO.0 Q7 0V on Output +
' 8 VSS GROUND
'-------------------------------------------------------------------
DEFINE OSC 4 ' Internal Clock to 4 Mhz
ANSEL.0=0 ' AN0 to digital
ANSEL.1=0 ' AN1 to digital
ANSEL.2=0 ' AN2 to digital
ANSEL.3=0 ' AN3 to digital
ANSEL.4=0 '\
ANSEL.5=0 ' clock derived from a dedicated internal oscillator
ANSEL.6=0 '/
ANSEL.7=0 ' Unimplemented
TRISIO.0 = 0 ' GPIO.0 Output
TRISIO.1 = 0 ' GPIO.1 Output
TRISIO.2 = 0 ' GPIO.2 Output
TRISIO.3 = 1 ' GPIO.3 Input
TRISIO.4 = 1 ' GPIO.4 Input
TRISIO.5 = 0 ' GPIO.5 Output
TRISIO.6 = 0 ' Unimplemented
TRISIO.7 = 0 ' Unimplemented
ADCON0.0 = 0 ' ADON: A/D Conversion STATUS bit
ADCON0.1 = 0 ' GO/DONE: A/D Conversion Status bit
ADCON0.2 = 0 ' \ AN 0
ADCON0.3 = 0 ' / AN 0
ADCON0.4 = 0 ' Unimplemented
ADCON0.5 = 0 ' Unimplemented
ADCON0.6 = 0 ' Reference to Vdd
ADCON0.7 = 1 ' Right justify result
CMCON = 7 ' Analog comparators off
Q3 Var GPIO.5 ' High side Power MOSFET Switch for Direction 1 (IPS511)
Q4 var GPIO.1 ' High side Power MOSFET Switch for Direction 2 (IPS511)
Q7 var GPIO.0 ' Low side Power MOSFET for Direction 2 (VNP5N07)
Q8 var GPIO.2 ' Low side Power MOSFET for Direction 1 (VNP5N07)
IN1 var GPIO.4 ' Input of Limit Switch 1
IN2 VAR GPIO.3 ' Input of Limit Switch 2
Direct1 var bit ' Movement away from switch 1
Direct2 VAR bit ' Movement away from switch 2
Stat var byte
DutyC var byte ' Byte size variable for Duty cycle
Cycles var byte ' Byte size variable for number of cycles per duty cycle
stat=0
' Stat=0 when no switch is pressed and there is no movement
' Stat=1 when switch 1 is pressed and there is no movement
' Stat=2 when switch 2 is pressed and there is no movement
' Stat=3 when switch 1 & switch 2 are pressed and there is no movement
' Stat=4 when no switch is pressed and there is movement in direction 1
' Stat=5 when switch 1 is pressed and there is movement in direction 1
' Stat=6 when switch 2 is pressed and there is movement in direction 1
' Stat=7 when switch 1 & switch 2 are pressed and there is movement in direction 1
' Stat=8 when no switch is pressed and there is movement in direction 2
' Stat=9 when switch 1 is pressed and there is movement in direction 2
' Stat=10 when switch 2 is pressed and there is movement in direction 2
' Stat=11 when switch 1 & switch 2 are pressed and there is movement in direction 2
low q3
low q4
low q7
low q8
pause 50
high q8
pwm q3,127,8 ' Pulse Width Modulate High side, dc% for cycles
pause 50
low q3
low q8
pause 50
high q7
pwm q4,127,8 ' Pulse Width Modulate High side, dc% for cycles
pause 50
low q4
low q7
cycles = 10 ' Set cycles per duty cycle
MAIN:
if in1=1 then
stat.0=0
else
stat.0=1
endif
if in2=1 then
stat.1=0
else
stat.1=1
endif
stat.2=Direct1
stat.3=Direct2
select case stat
case 0
'do nothing
case 1
goto left
case 2
goto right
case 3
'do nothing
case 4
'do nothing
case 5
'do nothing
case 6
goto right
case 7
goto brake
case 8
'do nothing
case 9
goto left
case 10
'do nothing
case 11
goto brake
end select
GOTO MAIN ' DO IT AGAIN
end
left:
low q4 ' Set High side Right off
low q7 ' Set Low side Right off
pause 1 ' Wait for Switch
high q8 ' Set Low side Left on
high q7 ' Set Low side Right on
pause 300 ' Wait for System to stop
low q8 ' Set Low side Left off
low q7 ' Set Low side Right off
pause 1 ' Wait for Switch
high q8 ' Set Low side Left on
for DutyC = 0 to 255 step 4 ' Step duty cycle from 0% to 100%
pwm q3,DutyC,cycles ' Pulse Width Modulate High side, dc% for cycles
if in2=0 and in1 = 0 then ' Check if both switches were pressed
DutyC = 255 ' If true, set DC = 255
goto brake ' exit sub goto brake
endif
next DutyC
Direct1=1
direct2=0
high q3 ' Set High side to 100%
goto main
end
right:
low q3 ' Set High side Left off
low q8 ' Set Low side Left off
pause 1 ' Wait for Switch
high q8 ' Set Low side Left on
high q7 ' Set Low side Right on
pause 300 ' Wait for System to stop
low q8 ' Set Low side Left off
low q7 ' Set Low side Right off
pause 1 ' Wait for Switch
high q7
for DutyC = 0 to 255 step 4 ' Step duty cycle from 0% to 100%
pwm q4,DutyC,cycles ' Pulse Width Modulate High side, dc% for cycles
if in2=0 and in1 = 0 then ' Check if both switches were pressed
DutyC = 255 ' If true, set DC = 255
goto brake ' exit sub goto brake
endif
next DutyC
Direct1=0
direct2=1
high q4
goto main
END ' END PROGRAM
Brake:
Direct1=0
direct2=0
low q3
low q8
low q7
low q4
pause 5000
goto main
END ' END PROGRAM
Bookmarks