Styra servo

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Lullen
Inlägg: 140
Blev medlem: 16 oktober 2006, 17:37:32

Styra servo

Inlägg av Lullen »

Hej, jag har ett parallax standard servo som jag vill försöka få igång. Jag har lyckats halft men problemet är att servot börjar hacka fram o tillbaka ibland för att sedan gå tillbaka till sin bana på 90grader fram o tillbaka.

här e koden jag använder för att styra servot. just nu ska den bara styras fram o tillbaka 90 grader

Kod: Markera allt

      while(1)
          {
          for(i=0;i<100;i++)
          {
              PORTB.F2 = 1;
              delay_us(500);
              PORTB.F2 = 0;
              delay_ms(20);
          }
           
          for(i=0;i<100;i++)
          {
           PORTB.F2 = 1;
           delay_us(2200);
           PORTB.F2 = 0;
           delay_ms(20);
          }
          
          }
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Är inte timingen åt helskotta? Har för mig att neutralt mittläge är 1,5 ms, och ändlägena är 1 ms resp. 2 ms. Du verkar köra 0,5 ms i ena riktningen och 2,2 ms i andra. Dessutom stegar du inte steglöst utan byter abrubt från 0,5 ms till 2,2.
Lullen
Inlägg: 140
Blev medlem: 16 oktober 2006, 17:37:32

Inlägg av Lullen »

asså den fungerar som jag vill i 90% av gångerna. Först går den till ena ändläget med 0.5ms o sen så går den ca 90grader åt andra hållet med 2.2ms. Jag har också läst att det ska vara så. Men det blir helt fel då så jag fick testa mig fram. Men som sagt problemet är att den ibland börjar hacka, den går nån grad åt ena hållet och sedan tillbaka nån grad, tills den stannar helt i ca 1sek för att sedan börja sin rätta rörelse igen, verkligen helskumt
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Som sagt, överskrider man maxvärderna kan oförutsedda saker hända. Testa sätta delay_us(1000) istället för 500 och delay_us(2000) istället för 2200. Sedan kan du dra ner delay_ms(20) till delay_ms(18) eftersom det tillkommer 1-2 ms där pulsen är hög.
Lullen
Inlägg: 140
Blev medlem: 16 oktober 2006, 17:37:32

Inlägg av Lullen »

jag började med o testa 1000 & 2000 men de fungerade inte. Men det kan inte vara maxvärdet för alla servon eller? för jag minns i skolan(där vi använt precis samma servon) så använde vi pulsout 1,1350 (då med basic stamp) o pulsout tar värdet x2 så 2700 är max men nu när du säger det så måste jag dubbelchecka koden för minsta värdet. Men okej jag ändrar till 10ms och återkommer
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Ok. Olika servon har säkert olika gränsvärden o.s.v. så de siffror jag nämde funkar iaf för mig. Hela radien är 90 grader om vi säger att 1 ms -45 grader så är 2 ms +45 grader, d.v.s. ett spann på totalt 90 grader.

Det som är konstigt är att du säger att det funkar 90% av gångerna. Har du talat om för kompilatorn vilken klockfrekvens du kör? Om du kör i 4MHz och kompilatorn tror att du kör i 20MHz så blir delay_* rutinerna felaktiga.

Annars kan det vara glappkoppling eller dålig avkoppling på processorn. Du har väl en konding över Vdd och Vss nära kretsen?

Oops! Förresten såg jag att där jag skrev 18 i mitt inlägg ovan så gjorde forumet om till en smiley. Så jag skrev delay_ms(18 ) *inte* 10. :P
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

>>Först går den till ena ändläget med 0.5ms o sen så går den ca 90grader åt andra hållet med 2.2ms

Definitionsmässigt så ska 1,5ms vara "mitten", 1ms ska vara 90 grader åt ena hållet och 2ms ska vara 90 grader åt andra hållet. Totalt 180 grader mellan ändlägena alltså. Låter knepigt att du bara får 90 grader när du går mellan 0,5ms och 2,2ms. Är du säker på att delay-rutinerna ger önskad delay?

Att servon fungerar en bit utanför 1ms och 2ms är inte helt ovanligt, så 2700us som du skriver kan nog vara okey för just det servot.

Den glada gubben i Kaggens inlägg ska vara delay_ms(18 ) och inte 10. Servot behöver pulser med mellan 40Hz och 60Hz och en puls räcker inte, flera likadana pulser behövs för att servot på så sätt kan sortera bort störningar.

Att byta abrupt mellan de två for-looparna är inte alls fel, att gå steglöst skulle innbära mer problem för servot (se stycket ovan, inga pulser är likadana)

Edit: Nu blev det lite dubbel information, Kaggen hann posta emellan. En fråga: rör sig inte ett servo 180 grader (och lite till) i normala fall?!?!
Lullen
Inlägg: 140
Blev medlem: 16 oktober 2006, 17:37:32

Inlägg av Lullen »

jag hittade felet det var en glappkoppling. Men jag har ingen kondning över vdd o vss nära kretsen...
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Hum, nu var det ett tag sedan jag höll på med mitt servo-program, men jag är ganska säker på att totala spannet mellan 1 och 2 ms är 90 grader på "standard" servon. Jag sätter dock inte huvudet på det. :)

Angående att gå "hoppa" från 1 till 2 ms eller stega linjärt så har jag hört att servot drar starkare/bättre om man "stegar" till ny position. Om det är en myt vet jag dock inte. Dock har du nog rätt i att abrupt hoppa från 1 ms till 2 ms borde funka i normalfallet.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Dock har du nog rätt i att abrupt hoppa från 1 ms till 2 ms borde funka i normalfallet.

Det enda fall jag kan tänka mig då man inte skulle göra det är om
man vill kontrollera hastigheten på rörelsen. Men oftast vill man bara
att servot så snabbt som möjligt ska inta den nya positionen.

Sen föredrar jag att tala om "max utslag" istället för "90 grader" eftersom
vridningar stämmer dåligt in på linjära servon. :-)
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Allt beror ju naturligtvis på vad ett "standard"-servo egentligen är. Själv tänker jag mig ett sånt här:
http://me.queensu.ca/courses/mech452/sp ... sheet4.pdf
...vilket också är första träffen om man googlar på parallax standard servo, som Lullen beskriver det i första inlägget.

Dessa "standard"-servon finns i 90 och 180-gradersvarianter men jag tror att 180 grader är vanligast, oftast använda i radiobilar m.m.

sodjan: Vad får du in linjära servon i sammanhanget?
Edit: Aha, menar generellt.. inte specifikt för Lullens servo, sorry.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Nä, jag vet inte om de är vanliga nu får tiden.
När jag körde R/C båt (början 80) så hade jag styr och
trottle servo med två linjära armar som gick fram och tillbaka
i var sitt spår. Fördelen är att man får ett utslag med konstant
"steg" utan sinus-kurva...

Och visst var det generellt när det talades om 1,5 +/- 0.5 ms pulsen...
Lullen
Inlägg: 140
Blev medlem: 16 oktober 2006, 17:37:32

Inlägg av Lullen »

oJsan skrev:Allt beror ju naturligtvis på vad ett "standard"-servo egentligen är. Själv tänker jag mig ett sånt här:
http://me.queensu.ca/courses/mech452/sp ... sheet4.pdf
...vilket också är första träffen om man googlar på parallax standard servo, som Lullen beskriver det i första inlägget.

Dessa "standard"-servon finns i 90 och 180-gradersvarianter men jag tror att 180 grader är vanligast, oftast använda i radiobilar m.m.

sodjan: Vad får du in linjära servon i sammanhanget?
Edit: Aha, menar generellt.. inte specifikt för Lullens servo, sorry.
Ang standard servot, så står det på servot "Parallax Standard Servo". har ingen exakt beskrivning på den men den ser likadan ut som den på bilden.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kommenteren om "standard servo" hade inget direkt med Parallax att göra.
Det var en kommentar till "90 grader"...
Skriv svar