Sida 1 av 2

Servo styrning

Postat: 4 september 2006, 19:43:22
av Korken
Hej alla glada!

Jag har gjort en testkod för att styra ett servo.
Men den fungerar inte som jag har tänkt mig.

Den gör så att den börja på sitt 0-ställe (1ms) till max (2ms) och en liten paus mellan men den bara hackar på samma ställe hela tiden.

Det är första gången jag skriver en sånhära kod så säg till om jag gör något fel.

Kod på en Butterfly @ 8Mhz:

Kod: Markera allt

#define F_CPU 8000000

#include <util/delay.h>
#include <avr/io.h>

int main (void) {
    // set PORTD for output
    DDRD = 0xFF;
	PORTD = 0x00;
	
    while(1)
	{
		for (int i = 1000; i < 2000; i = i + 100)
		{
			PORTD = 0xFF;
			_delay_us(i);
			PORTD = 0x00;
			_delay_ms(20);
		}
		
		for (int i = 0; i < 10; i++)
		{
			_delay_ms(100);
		}
		
		for (int i = 2000; i > 1000; i = i - 100)
		{
			PORTD = 0xFF;
			_delay_us(i);
			PORTD = 0x00;
			_delay_ms(20);
		}
    }
	
	return 0;
}
//Emil

Postat: 4 september 2006, 19:54:07
av Croaton
Lite citat från delay.h:

_delay_us(double __us): The maximal possible delay is 768 us / F_CPU in MHz.
_delay_ms(double __ms): The maximal possible delay is 262.14 ms / F_CPU in MHz.

Alltså i ditt fall border _delay_us max kunna vara 96 µS och _delay_ms 32 ms.

Hoppas detta hjälper dig!

/Croaton

Postat: 4 september 2006, 20:04:38
av Korken
Ahh, ok!
Man tackar!

Ska testa det. Jag har förmig att _delay_ms(); tar decimal tal va? Då det är en double.
Typ _delay_ms(1.5);

//Emil

Postat: 4 september 2006, 20:39:41
av Korken
Japp, det fungerar nu!

Men der vrider sig bara ca 60*. Är det oftast standars för ett servo?

//Emil

Postat: 4 september 2006, 21:04:24
av Croaton
Perfekt!

60 grader låter dock i minsta laget. Jag tycker nog att det borde vara 90-180 grader.

Ett tips kan ju vara att använda Stop Watch i AVR studio och på så vis verifiera att du får rätt pwm ut.

Ett annat fel kan ju kanske vara någon fuse som ställer till så att du inte har en 8MHz clocka.

/Croaton

Postat: 5 september 2006, 16:53:59
av Korken
När jag drar med tång så ska den gå 180 grader men den gör bara 1/3.
Jag har kollat klockan och de tycks vara rätt.

Vad kan vara fel?

//Emil

Postat: 5 september 2006, 18:25:54
av sodjan
Har du kollar signalen till servot ? Är den 1.5 +/- 0.5 ms ?

Postat: 5 september 2006, 18:41:38
av Korken
Ja, den är ok.
Har testat på flera servon med samma resultat.

//Emil

Postat: 5 september 2006, 18:59:50
av sodjan
Vad exakt betyder att signalen "är OK" ??

Postat: 5 september 2006, 19:07:53
av Korken
Jag tog skopet och kopplade upp så jag körde en puls med 2ms först och sedan en med 1ms och den var perfäkt i längd.

//Emil

Postat: 5 september 2006, 19:12:04
av sodjan
Du menar pulser (alltså inte bara *en* puls), eller hur ?
Servot vill ha en kontinuerligt pulståg.

Postat: 5 september 2006, 19:15:03
av Korken
De va något jag inte visste.
Då har jag lärt mig något nytt! :D



//Emil

Postat: 5 september 2006, 19:18:13
av Korken
Ok, nu tycks det fungera bättre men den frider sig bara ca 110 grader.

Har ni några fler idéer?

//Emil

Postat: 5 september 2006, 19:45:23
av sodjan
> den vrider sig bara ca 110 grader.

"bara" 110 grader ?
Hur mycket *ska* det vrida sig ?

Postat: 5 september 2006, 19:55:21
av bearing
Pulserna ska komma med ett avstånd på ca 20 ms har jag läst.