More Servo Woes


Closed Thread
Results 1 to 11 of 11

Thread: More Servo Woes

Hybrid View

  1. #1
    Join Date
    Oct 2008
    Posts
    51

    Default More Servo Woes

    Hi guys, I am currently building a projct which uses the analoge input from a 3 axis accelerometer and turns this into a proportional servo output.

    I have now managed to get y chip to read ADC input from one input and to put out a servo ouput using a FOR loop.

    Now the problem I am having is the FOR loop doesnt seem to be interuptable. So the servo will only respond to a new input once it has reached its current destination. I want to find a way to have the servo change direction before it reaches its end destination.

    The second issue i have is the programe seems to freeze at times. The LCD does not update and the programe does not recognise any change in input for a while before suddenly snapping back into life.

    Attached below is my code

    Code:
    '***********************************************************************
    '*college project to control 2 servo motors from a 3 axis accelerometer*
    '***********************************************************************
    '*****27/02/09***********************************************************
    ' V 0.2
    ' For loop responding to input of ADC
    ' active ADC inputs displayed on line 2 of lcd
    ' servo position shown on line 1 of LCD
    '***********************************************************************
    '** 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
    
    
    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
    
    
    gosub servomove
    
    '**************************************************************************
    '				Servo calculations
    '				******************
    ' 
    '
    '**************************************************************************
    
    MAIN:
    
    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 > 92 then
    goto positive
    endif
    
    if xpreset < 92 then
    goto negative
    endif
    
    
    positive:
    	FOR B0 = B0 TO XPRESET
    	PULSOUT SERVOY, B0
    	PAUSE 20
    	gosub servomove
    	NEXT
    
    goto main
    
    
    
    negative:
    	FOR B0 = B0 TO xpreset STEP -1
    	PULSOUT SERVOY, B0
    	PAUSE 20
    	gosub servomove
    	NEXT
    
    goto main
    
    
    '
    '
    ''*******************************************************************************************************************
    '			SERVOMOVEMENT CONTROL
    '			*********************
    ' MOVES BOTH SERVOS FOR BOTH X AND Y MOVEMENT
    ' CREATES THE NEW X AND Y PRESETS FOR THE CALCULATIONS
    ' UPDATES THE LCD DISPLAY
    '*******************************************************************************************************************
    SERVOMOVE:
    '
    '	PULSOUT SERVOY, B1		' SENDS THE NEW VALUE FOR SERVO Y 
    '
    '
    '	PULSOUT SERVOX, B0		' SENDS THE NEW VALUE FOR SERVO X
    '			
    '
    
    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

  2. #2
    Join Date
    May 2008
    Location
    Italy
    Posts
    825


    Did you find this post helpful? Yes | No

    Default

    Tray this it should help.


    Code:
    positive:
    	While B0 <> XPRESET
    	B0=B0+1
            PULSOUT SERVOY, B0
    	PAUSE 20
    	gosub servomove
    	wend
    
    goto main
    
    
    
    negative:
    	While B0<>xpreset
    	B0=B0-1
            PULSOUT SERVOY, B0
    	PAUSE 20
    	gosub servomove
    	wend
    
    goto main
    Al.
    All progress began with an idea

  3. #3
    Join Date
    Oct 2008
    Posts
    51


    Did you find this post helpful? Yes | No

    Default

    Nope this results in the servo panning uncontrolled trying to pass its limits. I havnt ever used a while loop before but assumed the piece of code you gave me should of fitted in where my current for loops where.

    If so i shall have a play tommorow and see what i can come up with

  4. #4
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default

    Hi Chris,
    I have only a little experience with servos, and do not have my computer at hand, but the best I remember, if I sent a number to my servo it executed fully before accepting a new value, so I am thinking if you send a count to the servo something like 1500, 1510, 1520 . . . to cause movement you can snuggle an interrupt between the numbers.
    EDIT: after reading your code, looks like pretty much what you are doing. I'm empty.
    Quote Originally Posted by chrisshortys View Post

    Now the problem I am having is the FOR loop doesnt seem to be interuptable. So the servo will only respond to a new input once it has reached its current destination. I want to find a way to have the servo change direction before it reaches its end destination.
    I see no interrupt in your code, Why would you be able to stop it? I never have been able to hijack the count variable in a for next loop, you might try using an interrupt routine and clearing the variable in there, I do not know if it will work though.

    The second issue i have is the programe seems to freeze at times. The LCD does not update and the programe does not recognise any change in input for a while before suddenly snapping back into life.
    Could be latency, could be Breadboard issues where stray capacitance stops the oscillator, could be power supply causing PIC brownout reset, I see no config statement so I assume you are using default config, . . . could be GOTO MAIN at the end of servomove when you used gosub to get there, causing a stack overflow, and eventual reset. . . . On closer inspection looks like you have a return and goto main in there . . . I don't know how that would affect operation if at all since theoretically the code should never go past the return, but who knows? Computers (and PICs) are stupid, but not sloppy, they only do what you tell them to do, whether intentionally or not.
    Keep us posted, I would like to see your Final Cut, looks like it would make a cool VR control for a camera in an RC heli.
    Last edited by Archangel; - 27th February 2009 at 19:36.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  5. #5
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Lightbulb

    Hi, Chris

    A servomotor has it's own signal limitations ...

    from 800 to 2200 µs pulse ( STD ) ... so unpredictable behaviour can occur outside those limits ...

    Code:
    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
    your accelerometer is an analog one, Ok ... but ADCIN can give a result between 0 and 256 ...

    so, the servo signal range is not guaranteed to be in the " valid" range.

    Now , you read Twice the accelerometer in one cycle ... not really a problem, but it's not compulsory here.

    BTW ... Which Pic and Accelerometer do you use ???

    Alain
    Last edited by Acetronics2; - 28th February 2009 at 12:43.
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  6. #6
    Join Date
    Oct 2008
    Posts
    51


    Did you find this post helpful? Yes | No

    Default

    Thanks for all the replies i shall try and go through them now
    Quote Originally Posted by Acetronics View Post


    your accelerometer is an analog one, Ok ... but ADCIN can give a result between 0 and 256 ...

    so, the servo signal range is not guaranteed to be in the " valid" range.

    BTW ... Which Pic and Accelerometer do you use ???

    Alain
    Firstly i understand that the ACDIN can give the range from 0-256 how ever the accelerometer is not capable of giving a value of 0-5v, I can't remember the exact voltages as theyre at work but the values i receive on the ACDIN when moving from one limit to the other are 45-128. This is the reason i add a value to the number to try and keep the server centeral(yes i know its not the correct value yet :P ).

    The Pic I am using is a 16f876A
    and the accelerometer is a prototyping board which i brought from sure electronics http://cgi.ebay.co.uk/3-Axis-low-g-A...1%7C240%3A1318

    Quote Originally Posted by Joe S. View Post
    Hi Chris,
    I have only a little experience with servos, and do not have my computer at hand, but the best I remember, if I sent a number to my servo it executed fully before accepting a new value, so I am thinking if you send a count to the servo something like 1500, 1510, 1520 . . . to cause movement you can snuggle an interrupt between the numbers.
    EDIT: after reading your code, looks like pretty much what you are doing. I'm empty.

    I see no interrupt in your code, Why would you be able to stop it? I never have been able to hijack the count variable in a for next loop, you might try using an interrupt routine and clearing the variable in there, I do not know if it will work though.


    Could be latency, could be Breadboard issues where stray capacitance stops the oscillator, could be power supply causing PIC brownout reset, I see no config statement so I assume you are using default config, . . . could be GOTO MAIN at the end of servomove when you used gosub to get there, causing a stack overflow, and eventual reset. . . . On closer inspection looks like you have a return and goto main in there . . . I don't know how that would affect operation if at all since theoretically the code should never go past the return, but who knows? Computers (and PICs) are stupid, but not sloppy, they only do what you tell them to do, whether intentionally or not.
    Keep us posted, I would like to see your Final Cut, looks like it would make a cool VR control for a camera in an RC heli.
    Yer i think that is the problem the FOR loop is not very interuptable. Thats somthing im going to change once i get time to play with it again.
    Shouldnt be a problem with latency as i only ever use veroboard though i havnt placed any capacitors across the crystal so i shall do that asap to see if that helps.
    Power supply wise i have tried the circuit on several different powersupplies both at work and at home, the only issue i had there was i had the current limiter at around 100 mA and the servo seems to draw a considerable amount to trip that on its first start up! But hat has now been rectified with a 470 uF across the power rails next to the servo and upping the current limiter.

    I shall lso try removing the goto main which was left in from a older attempt but i cant see that command even being looked at but its worth a try!

    Orriginally i had planned to make a Pan-Tilt head for a camera but im now looking at making this into a robotic arm kind of setup with possibly strain gauges to detect a hand closing..... i dont know that somthing for later

Similar Threads

  1. Problem with 12F629, servo and EEPROM
    By Atom058 in forum mel PIC BASIC Pro
    Replies: 13
    Last Post: - 1st March 2008, 09:53
  2. Servo does not move
    By ruijc in forum General
    Replies: 12
    Last Post: - 12th November 2007, 19:14
  3. Beginner + Servo
    By james in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 31st July 2007, 21:31
  4. Help with Servo Control Please!
    By wireman22 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 7th June 2007, 18:15
  5. Servo control woes
    By Eriswerks in forum mel PIC BASIC Pro
    Replies: 24
    Last Post: - 28th February 2006, 00:12

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts