Sida 2 av 3
Postat: 25 juli 2006, 11:50:36
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
Postat: 25 juli 2006, 12:23:35
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?
Postat: 25 juli 2006, 12:24:15
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.
Postat: 25 juli 2006, 13:04:01
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!
Postat: 25 juli 2006, 16:06:44
av JimmyAndersson
"...eller ett icke-modifierat servo, Jimmy!"
Precis.
Ä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.

Postat: 25 juli 2006, 16:54:50
av Detraw
Hmmm ja 256 lägen har jag inte just nu, snarare 130
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
Postat: 25 juli 2006, 17:36:22
av strombom
Nä men de tiderna är väl helt ok.
/Johan
Postat: 25 juli 2006, 19:12:25
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.
Postat: 27 juli 2006, 13:57:15
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
Postat: 27 juli 2006, 14:00:35
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
Postat: 27 juli 2006, 14:13:24
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.
Postat: 27 juli 2006, 17:54:34
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
Postat: 27 juli 2006, 20:52:40
av strombom
Vilken AVR var det du använde ?
Postat: 27 juli 2006, 22:58:14
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...
Postat: 28 juli 2006, 00:54:04
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