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....
 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
 Och man ändrar läget på servorna genom drivarens UART....
 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:
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
 
				






