Well the speed control didnt take very long at all to implement so I have attached a fully working code below.
Now i have to wait for the servo motors i have ordered to arrive from HK before i move on to having 2 servos in control at once!
any advice on different ways of doing things are welcome.
also sorry for the untidyness of the code but i shall neatn it up in the near future with comments on code
Code:'******************************************************************************** '* college project to control 2 servo motors from a 3 axis accelerometer * '******************************************************************************** '* 04/03/09 CODE WRITTEN BY CHRIS HAMMERSLEY * ' FEEL FREE TO MAKE USE OF THIS CODE BUT PLEASE GIVE CREDIT TO WHERE IT IS DUE * ' V 0.4 ' For loop responding to input of ADC ' active ADC inputs displayed on line 2 of lcd ' servo position shown on line 1 of LCD ' removed twitch by adding a minimum movement to adjust servo ' more reliable tracking ' QUICKER RESPONCE TO CHANGES IN AXIS BY REDUCTION OF FOR LOOPS ' SERVO MOVEMENT NOW REPRESENTS DIFFERENT SPEEDS IN MOVEMENT '*********************************************************************** '** Shows the Connections on the ports of the PIC ********************** '*********************************************************************** ' 'A0 = X-AXIS 'A1 = Y-AXIS 'A2 = Z-AXIS 'A3 = 'A4 = 'A5 = ' 'BO = LCD INTERFACE 'B1 = LCD INTERFACE 'B2 = LCD INTERFACE 'B3 = LCD INTERFACE 'B4 = LCD INTERFACE 'B5 = LCD INTERFACE 'B6 = LCD INTERFACE 'B7 = LCD INTERFACE ' 'C0 = SERVO 1 'C1 = SERVO 2 'C2 = 'C3 = 'C4 = 'C5 = 'C6 = 'C7 = '*********************************************************************** '****************** DEFINE ADCIN PARAMETERS***************************** '*********************************************************************** DEFINE ADC_BITS 8 'SETS NUMBER OF BITS IN RESULTS DEFINE ADC_CLOCK 3 'SET CLOCK SOURCE DEFINE ADC_SAMPLUS 50 'SET SAMPLING TIME IN US DEFINE LCD_DREG PORTB 'Define PIC port used for LCD Data lines DEFINE LCD_DBIT 4 'Define first pin of portb connected to LCD DB4 DEFINE LCD_RSREG PORTB 'Define PIC port used for RS line of LCD DEFINE LCD_RSBIT 3 'Define Portb pin used for RS connection DEFINE LCD_EREG PORTB 'Define PIC prot used for E line of LCD DEFINE LCD_EBIT 0 'Define PortB pin used for E connection DEFINE LCD_BITS 4 'Define the 4 bit communication mode to LCD DEFINE LCD_LINES 2 'Define using a 2 line LCD DEFINE LCD_COMMANDUS 2000 'Define delay between sending LCD commands DEFINE LCD_DATAUS 50 'Define delay time between data sent. SERVOY VAR PORTC.0 SERVOX VAR PORTC.1 YAXIS VAR WORD XAXIS VAR WORD ZAXIS VAR WORD XPRESET VAR WORD YPRESET VAR WORD ZPRESET VAR WORD B0 VAR WORD B1 VAR WORD B2 VAR WORD B3 VAR WORD STEPPING VAR WORD TRISA = %00000011 'SETS INPUTS/OUTPUTS FOR BANK A TRISB = %00000000 'SETS INPUTS/OUTPUTS FOR BANK B TRISC = %00000000 'SETS INPUTS/OUTPUTS FOR BANK C ADCON1 = %00000110 'SETS THE ANALOGUE/DIGITAL INPUTS TO BANK A PORTA = %00000000 'SETS THE INITIAL VALUE OF BANK A PORTB = %00000000 'SETS THE INITIAL VALUE OF BANK B PORTC = %00000000 'SETS THE INITIAL VALUE OF BANK C '************************************************************************** ' CENTER THE SERVO ' **************** ' Pause for one second to allow initalisations ' Clear the LCD display ' Center Servo 1 and then servo 2 ' '************************************************************************** PAUSE 1000 LCDOUT "STARTING" pause 1000 LCDOUT $FE, 1 CENTER: 'NEW SUBROUTINE FOR SETTING THE SERVO FOR B0 = 1 TO 100 'MOVES THE SERVO FROM ITS 0 TO ITS 100 MARK PULSOUT SERVOY, 150 ' PAUSE 20 ' NEXT FOR B1 = 1 TO 100 'Pans the servo from 0 to a halfway point of 100 PULSOUT SERVOX, 150 ' PAUSE 20 ' NEXT '************************************************************************** ' setup ADC ' ********* ' reads the ADC ports and sets the initial values for calculations '************************************************************************** STARTUP: ADCIN 0, B2 ' reads in the ADC on PORT A.0 and sends it to memory location B2 ADCIN 1, B3 ' reads in the ADC on PORT A.1 and sends it to memory location B3 STEPPING = 1 gosub LCDUPDATE '************************************************************************** ' Servo calculations ' ****************** ' ' '************************************************************************** MAIN: gosub LCDUPDATE ADCIN 0, B2 ' Reads in the PORT A.0 ADC AND STORES THE VALUE IN B2 ADCIN 1, B3 ' READS IN THE PORT a.1 ADC AND STORES THE VALUE IN B3 XPRESET = B2 + 50 If Xpreset > B0 then goto positiveone endif if xpreset < B0 then goto negativeone endif '******************************************************************* ' SERVO MOVEMENT ' ************** ' ' CONTROLS THE OUTPUTS TO THE SERVO ' '******************************************************************** positive: FOR B0 = B0 TO XPRESET STEP STEPPING PULSOUT SERVOY, B0 PAUSE 20 gosub LCDUPDATE NEXT goto main negative: FOR B0 = B0 TO xpreset STEP - STEPPING PULSOUT SERVOY, B0 PAUSE 20 gosub LCDUPDATE NEXT goto main '****************************************************************************** ' MOVEMENT CALCULATIONS ' ********************* ' ' THIS SECTION COMPARES THE INPUT TO THE CURRENT LOCATION AND DECIDES WHETHER A ' POSITIVE OR NEGATIVE MOVEMENT IS REQUIRED ' '******************************************************************************* positiveone: xaxis= xpreset - B0 if xaxis > 3 then goto positivetwo endif STEPPING = 1 goto main negativeone: xaxis= B0 - xpreset if xaxis > 3 then goto negativetwo endif STEPPING = 1 goto main '************************************************************************************** ' SERVO SPEED CONTROL POSITIVE ' **************************** ' ' THIS SECTION LOOKS AT THE INPUT DATA AND DECIDES HOW FAST TO MOVE THE SERVO DEPENDING ' ON THE VALUE OF THE CHANGE BETWEEN THE INPUT AND THE CURRENT POSITION ' '*************************************************************************************** positivetwo: IF XAXIS > 18 THEN STEPPING = 6 ENDIF IF XAXIS > 15 THEN STEPPING = 5 ENDIF IF XAXIS > 12 THEN STEPPING = 4 ENDIF IF XAXIS > 9 THEN STEPPING = 3 ENDIF IF XAXIS > 6 THEN STEPPING = 2 ELSE STEPPING = 1 ENDIF '************************************************************************************************************** ' THE FOLLOWING CODE DIVIDES THE CHANGE VALUE BY 4 SO THAT THE FOR LOOP ONLY CHANGES A 4TH OF THE VALUE BEFORE ' RECHECKING ITS INPUTS '************************************************************************************************************** if xaxis > 20 then xaxis = xaxis / 4 XPRESET = B0 + XAXIS ENDIF goto positive '************************************************************************************** ' SERVO SPEED CONTROL NEGATIVE ' **************************** ' ' THIS SECTION LOOKS AT THE INPUT DATA AND DECIDES HOW FAST TO MOVE THE SERVO DEPENDING ' ON THE VALUE OF THE CHANGE BETWEEN THE INPUT AND THE CURRENT POSITION ' '*************************************************************************************** negativetwo: IF XAXIS > 18 THEN STEPPING = 6 ENDIF IF XAXIS > 15 THEN STEPPING = 5 ENDIF IF XAXIS > 12 THEN STEPPING = 4 ENDIF IF XAXIS > 9 THEN STEPPING = 3 ENDIF IF XAXIS > 6 THEN STEPPING = 2 ELSE STEPPING = 1 ENDIF '************************************************************************************************************** ' THE FOLLOWING CODE DIVIDES THE CHANGE VALUE BY 4 SO THAT THE FOR LOOP ONLY CHANGES A 4TH OF THE VALUE BEFORE ' RECHECKING ITS INPUTS '************************************************************************************************************** IF XAXIS > 20 THEN XAXIS = XAXIS / 4 XPRESET = B0 - XAXIS ENDIF GOTO NEGATIVE ' ' ''******************************************************************************************************************* ' LCDUPDATE CONTROL ' ********************* ' MOVES BOTH SERVOS FOR BOTH X AND Y MOVEMENT ' CREATES THE NEW X AND Y PRESETS FOR THE CALCULATIONS ' UPDATES THE LCD DISPLAY '******************************************************************************************************************* LCDUPDATE: ADCIN 0, B2 ' Reads in the PORT A.0 ADC AND STORES THE VALUE IN B2 ADCIN 1, B3 ' READS IN THE PORT a.1 ADC AND STORES THE VALUE IN B3 LCDOUT $FE, 2 ' SENDS THE COMMAND TO THE LCD TO MOVE TO THE START OF THE FIRST LINE LCDOUT "Servo Pos= ",DEC3 B0 ' SENDS THE DATA FOR THE X AXIS TO THE LCD ON THE FIRST LINE LCDOUT $FE, $C0 ' MOVES THE CURSUR OF THE LCD TO THE START OF THE SECOND LINE LCDOUT "Y = ",DEC3 B2, " X = ",DEC3 B3 ' SENDS THE DATA FOR THE Y AXIS TO THE LCD ON THE SECOND LINE RETURN ' RETURNS TO THE PREVIOUS BLAAAAAAAAAAAAAAAAAAAAAAH 'GOTO MAIN END*




Bookmarks