Hexapod
Bra tanke strombom, det ska jag komma ihåg nästa gång jag pysslar med servon!
Detraw: Precis när jag postat kom jag på "få se nu, Detaw kanske skrev i asm?" =) Aja, du fattade "tänket" i allafall... Försök koda in stromboms förslag också, att lägga pulserna lite ur fas. (Bäst vore ju att även lägga en fast fasförskjutning för varje enskild modul också.)
Detraw: Precis när jag postat kom jag på "få se nu, Detaw kanske skrev i asm?" =) Aja, du fattade "tänket" i allafall... Försök koda in stromboms förslag också, att lägga pulserna lite ur fas. (Bäst vore ju att även lägga en fast fasförskjutning för varje enskild modul också.)
Precis Chribbe76,
smartaste vore ju att ha en interrupt som första gången sätter första servos utgång hög, programmerar tiden till nästa interrupt till önskade bredden.
Vid nästa interrupt clearar du första servosignalen och sätter nästa servo. Programmera tiden till nästa till önskade bredden för servo 2. ock så vidare.
Sista tiden man sätter är endöd tid som motsvarar 20 ms - summan av pulsbredderna för alla servona i interruptkedjan.
På så vis får man automatiskt effekten som strombom påpekade...
Metoden ger teoretisk möjlighet till att styra 10 servon (10x2ms = 20 ms total uppdateringstid)
Man får ju också väldigt låg processorbelastning.
smartaste vore ju att ha en interrupt som första gången sätter första servos utgång hög, programmerar tiden till nästa interrupt till önskade bredden.
Vid nästa interrupt clearar du första servosignalen och sätter nästa servo. Programmera tiden till nästa till önskade bredden för servo 2. ock så vidare.
Sista tiden man sätter är endöd tid som motsvarar 20 ms - summan av pulsbredderna för alla servona i interruptkedjan.
På så vis får man automatiskt effekten som strombom påpekade...
Metoden ger teoretisk möjlighet till att styra 10 servon (10x2ms = 20 ms total uppdateringstid)
Man får ju också väldigt låg processorbelastning.
>> Andax
Det är en bra lösning, precis så kör jag också i mina lib. Dock räcker inte 2.0 ms i ändläge för de servo jag testat, det behövs faktist närmare 2,5 ms. Detta medför att man inte hinner med riktigt 10 st servo med en uppdateringsperiod om 20 ms.
Edit: No code
Det är en bra lösning, precis så kör jag också i mina lib. Dock räcker inte 2.0 ms i ändläge för de servo jag testat, det behövs faktist närmare 2,5 ms. Detta medför att man inte hinner med riktigt 10 st servo med en uppdateringsperiod om 20 ms.
Edit: No code
Senast redigerad av $tiff 31 juli 2006, 22:14:30, redigerad totalt 1 gång.
Så där ja nu är man tillbaka efter lite resandes....
Hmmm mycket smarta lösningar ni har kommit fram till medan jag varit borta.... Det där med att man programmerar om interupt tiden efter varje interupt har jag varit inne och nosat på tidigare, och det verkar som en riktigt smidig metod, och eftersom varje drivare ska driva 4 servo, så är det inget problem med att ha en vänt delay på 20ms
Jag ska flytta nu denna vecka, men jag ska försöka bli klar med mjukvaran så snabbt som möjligt...
/Daniel
Hmmm mycket smarta lösningar ni har kommit fram till medan jag varit borta.... Det där med att man programmerar om interupt tiden efter varje interupt har jag varit inne och nosat på tidigare, och det verkar som en riktigt smidig metod, och eftersom varje drivare ska driva 4 servo, så är det inget problem med att ha en vänt delay på 20ms
Jag ska flytta nu denna vecka, men jag ska försöka bli klar med mjukvaran så snabbt som möjligt...
/Daniel
Projektet har fått ligga lite på is nu ett tag medan jag flyttar, men jag har i alla fall skirivit klart mjukvaran för att röra alla servon, nu ska bara kommunikationen mellan drivarna och huvud processorn skrivas, jag vet inte riktigt vilket protokoll jag ska använda än, men det återstår att se.....
Mina små ATTiny kom nu också, så när jag har packat upp löd- och etsutrustningen så jag bygga drivarna....
Förhoppningsvis är det upppackat om två veckor, ska upp till fjällen nämligen nästa vecka, och kan då inte packa upp nått då....
/Daniel
Mina små ATTiny kom nu också, så när jag har packat upp löd- och etsutrustningen så jag bygga drivarna....
Förhoppningsvis är det upppackat om två veckor, ska upp till fjällen nämligen nästa vecka, och kan då inte packa upp nått då....
/Daniel
Hej igen!
Tyckte att det var dags att uppdatera tråden lite nu när det har hänt en del grejjer.... Jag är fortfarande på första benparet, men nu rör sig alla servon som de ska, nästan
Och man ändrar läget på servorna genom drivarens UART....
Men om man kopplar på mer än ett servo rör de sig skumt, eller ibland bara rycker de fram och tillbaka (med bara en inkopplad funkar allt som det ska)... Jag gissar på att de inte för tillräckligt med ström, men det borde inte va det som är fel eftersom jag pulsar ett servo i taget...
Här nedan är min interrupt kod för att pulsa servot:
Är det nån som kan se nått fel ikoden, eller har nån annan idé om varför det inte funkar med två servon?
Tack på förhand
/Daniel
Tyckte att det var dags att uppdatera tråden lite nu när det har hänt en del grejjer.... Jag är fortfarande på första benparet, men nu rör sig alla servon som de ska, nästan

Men om man kopplar på mer än ett servo rör de sig skumt, eller ibland bara rycker de fram och tillbaka (med bara en inkopplad funkar allt som det ska)... Jag gissar på att de inte för tillräckligt med ström, men det borde inte va det som är fel eftersom jag pulsar ett servo i taget...
Här nedan är min interrupt kod för att pulsa servot:
Kod: Markera allt
update_servo:
push r16
cpi currentServo, 0 ; Timer is in pause state
breq updateServoA ; put it in servoA state
cpi currentServo, 1 ; Timer is in servoA state
breq updateServoB ; put it in servoB state
cpi currentServo, 2 ; Timer is in servoB state
breq updateServoC ; put it in servoC state
cpi currentServo, 3 ; Timer is in servoC state
breq updateServoD ; put it in servoD state
cpi currentServo, 4 ; Timer is in servoD state
breq updateServoPause ; put it in pause state
return_update_servo:
pop r16
reti
updateServoA:
sbi servoPORT, servoA ; Start the servo A pulse
cli ; Disable global interrupt
ldi r16, 0xFF ; Load the timer with the delay time for servo A
out TCNT1H, r16
out TCNT1L, servoAtime
sei ; Enable global interrupt
ldi currentServo, 0x01 ; Set the current servo to servo A
rjmp return_update_servo ; Return
updateServoB:
cbi servoPORT, servoA ; Stop the servo A pulse
nop
sbi servoPORT, servoB ; Start the servo B pulse
cli ; Disable global interrupt
ldi r16, 0xFF ; Load the timer with the delay time for servo B
out TCNT1H, r16
out TCNT1L, servoBtime
sei ; Enable global interrupt
ldi currentServo, 0x02 ; Set the current servo to servo B
rjmp return_update_servo ; Return
updateServoC:
cbi servoPORT, servoB ; Stop the servo B pulse
nop
sbi servoPORT, servoC ; Start the servo C pulse
cli ; Disable global interrupt
ldi r16, 0xFF ; Load the timer with the delay time for servo C
out TCNT1H, r16
out TCNT1L, servoCtime
sei ; Enable global interrupt
ldi currentServo, 0x03 ; Set the current servo to servo C
rjmp return_update_servo ; Return
updateServoD:
cbi servoPORT, servoC ; Stop the servo C pulse
nop
sbi servoPORT, servoD ; Start the servo D pulse
cli ; Disable global interrupt
ldi r16, 0xFF ; Load the timer with the delay time for servo D
out TCNT1H, r16
out TCNT1L, servoDtime
sei ; Enable global interrupt
ldi currentServo, 0x04 ; Set the current servo to servo D
rjmp return_update_servo ; Return
updateServoPause:
cbi servoPORT, servoD ; Stop the servo D pulse
cli
ldi r16, high(servoPauseTime) ; Load the timer to interrupt after 20ms
out TCNT1H, r16
ldi r16, low(servoPauseTime)
out TCNT1L, r16
sei
ldi currentServo, 0x00 ; Set the current servo to none (timer pause state)
rjmp return_update_servo
Tack på förhand
/Daniel