Hexapod

Berätta om dina pågående projekt.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Nej jag har inte tänkt att ha sensorer som känner av om benet är på marken eller inte, men det är mycket möjligt att jag lägger till den sen...

Mitt problem nu är att om jag försöker få servot att röra sig långsammare genom att flytta den småsteg i taget, men då skakar den fram.... Finns det nån annan lösninga på detta, eller är enda lösningen att flytta den ännu mindre steg åt gången??

/Daniel
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Lämplig upplösning för vanliga servon är typ 256 lägen på hela rörelsen.
Bättre upplösning än så ger så lite att det i normala fall är onödigt.
Du ska ge servot en ny position varje puls (50 gånger / sekund) annars kommer servot att gå ojämnt.

Det finns risk att servot kommer gå lite ojämnt ändå pga dålig reglering(inget du kan påverka) när det ska flytta mycket massa men jag tycker inte det borde vara störande.

Hur kör du servot nu?
Användarvisningsbild
JimmyAndersson
Inlägg: 26547
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Hur långt är varje steg (puls) och paus i koden?

Till mitt servoprojekt har jag precis börjat koda den delen som har hand om hur långt servoaxeln får vrida sig. Det hade blivit lite mindre kod om man hade kollat detta med sensorer istället... :) Men det går som sagt att lägga till senare.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

...eller ett icke-modifierat servo, Jimmy! Nästan så jag funderar på om du ska få låna/köpa mina tre HS-303 , det skulle nog underlätta kodskrivandet än mer!
Användarvisningsbild
JimmyAndersson
Inlägg: 26547
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"...eller ett icke-modifierat servo, Jimmy!"

Precis. :D

Än så länge så verkar det som att det fungerar ändå. Jag kommer ju kunna se vad jag filmar, så man kan ju justera rent visuellt.. :)
Nu ska jag inte stjäla Detraw's tråd. :oops:
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Hmmm ja 256 lägen har jag inte just nu, snarare 130 :oops:

Nu varierar jag pulslängden mellan 1ms och 2ms, och pausen är alltid på 20ms... Så med andra ord så blir det till att ändra pause längden...

/Daniel
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Nä men de tiderna är väl helt ok.

/Johan
Användarvisningsbild
JimmyAndersson
Inlägg: 26547
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Jepp, de tiderna låter helt ok. Men om du (Detraw) ändå vill testa så kan du korta ner paus-tiden till 15ms. Det gör servona lite starkare. Har även sett de som fått bra resultat på standardservon med 7-8ms och även futtiga 5ms paus, men det sistnämnda kanske inte fungerar så bra i alla sammanhang.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Jag kortade ner pausetiden lite och servot går nu ganska smidigt....

Just nu håller jag på med programvaran för AVR:en som ska sitta på servo drivarna.... Men hur ska man göra för att översätta att visst gradantal till motsvarande pulslängd? Med nått slags lookup table?? Nån borde ju haft samma problem tidigare?

/Daniel
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Gör en tabell och rita ett diagram (gradtal mot pulslängd) och mät upp hur dina servon uppför sig så är det lättare att dra slutsatser.

/Johan
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

MÅSTE du använda just _grader_?! Använder du grader så innebär det att du överskrider det magiska talet 255. Jag skulle ha skapat ett eget system där servots ena ändläge är 0 "grader" och det andra är 255 "grader".
Sen beror de ju lite på hur du använder AVR:ens timer för att generera tiderna, men uppslagstabell behövs inte, använd istället någon faktor X som länkar ihop "gradtalet" med det register som du ställer in din PWM med.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Varför skulle man överskrida 255 om man kör med grader, servot kan ju bara vrida sig max 180 grader, så i sådana fall skulle det bli 0 - 180

Sen kanske man kan diskutera om jag genererar pulserna på ett dumt sätt.... Nu gör jag det utan att använda några timers eller pwm kanaler, man kanske ska lösa det med de 4 pwm kanalerna som den avr jag ska använda har, eller vad tycker ni som gjort detta förut?

Sen har jag funderat på om man ska ha 5 stycken fasta lägen att välja på, istället ställa servot på en viss grad....

EDIT: Nu har jag suttit och läst databladet för AVR:en fram och tillbaka, men lyckas inte lista ut vad som menas med 4 PWM kanaler, det verkar ju inte som om det finns fyra utpinnar för PWM:en, bara två, och det räcker ju inte när jag ska driva fyra servon med en AVR.... Eller ska man istället med en timer tända de olika ut pinnarna för servona??

/Daniel
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Vilken AVR var det du använde ?
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Jag hade servon som hade en vridningsvinkel som låg runt 270 har jag för mig... med de var lite knäppa också.. =)
När jag skrev PWM i förra inlägget så menade jag inte den inbygga, utan en mjukvaru-PWM av något slag...
Såhär skulle jag lösa problemet (icke-verifierad kod, direkt från huvud till forum... så jag varnar för buggar :) ):
-Sätt upp en timer som genererar avbrott med 256KHz

Kod: Markera allt

volatile unsigned char Servo0_setting = 0;
volatile unsigned char Servo1_setting = 128;
volatile unsigned char Servo2_setting = 156;
volatile unsigned char Servo3_setting = 255;

Avbrottsrutin(Timer)   //Denna körs med 256000Hz
{
	static unsigned int ticks = 0;

	//1 tick motsvarar ca 3,9us
	//256 tick blir då 1ms

	if(ticks++ == (256*15) //Låt räknaren slå runt var 15:e ms
	{
		ticks=0;
		PORTA |= (UT0 | UT1 | UT2 | UT3); //Påbörja HÖG puls på alla servon
	}

	//Sätt LÅG individuellt för varje servo, men minst efter 1ms (256 ticks)
	if(Servo0_setting+256 == ticks)
		PORTA &= ~UT0;
	if(Servo1_setting+256 == ticks)
		PORTA &= ~UT1;
	if(Servo2_setting+256 == ticks)
		PORTA &= ~UT2;
	if(Servo3_setting+256 == ticks)
		PORTA &= ~UT3;

}
)Det är möjligt att du måste göra nån typecast i de fyra if-satserna för att kompilatorn ska vara nöjd.)

Låt timeravbrottet köra som en bakgrundsprocess, det enda du behöver ändra från det övriga programmet är de fyra globala variablerna... Tyvärr finns det (minst) en bugg, nämligen att du kan råka sätta ett nytt (lägre) värde för ett servo precis innan det skulle ha satts låg.. men det borrde inte märkas på servot tycker jag...
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

strombom>> Just nu sitter jag och testar med en ATMega16, men jag har beställt tre stycken ATTiny3213 som ska användas sen....

oJsan>> Hmm smidig ide, jag har kastat min kod och börjat med något liknande som du skrev, fast jag sänker pulsen från servot innan jag höjer nästa puls, så att det första servot för med andra ord en liten längre pulslängd.... Men jag ska helt klart testa din metod också... Ska bara se till att översätta det till ASM först eftersom jag hade tänkt att skriva drivarna i det....

/Daniel
Skriv svar