Servo Ansteuerung: Unterschied zwischen den Versionen
Kiwi (Diskussion | Beiträge) |
Mgue (Diskussion | Beiträge) |
||
(14 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | <br> Hier Mal ein kleines Alternatives Servo Test Programm, | + | Ethersex bietet verschiedene Möglichkeiten der Servo Ansteuerung an. |
+ | |||
+ | == via I2C-Bus IC PCA9531 == | ||
+ | siehe [[I2C]] | ||
+ | |||
+ | == 10x PWM mit einem Timer (in Menuconfig auswählbar) == | ||
+ | |||
+ | habo: Noch gibt es Probleme wegen der Doppelbenutzung des timer1, ansonsten scheint der 10x Servo-Code gut zu laufen. | ||
+ | |||
+ | make menuconfig | ||
+ | -> I/O | ||
+ | -> PWM Generator | ||
+ | -> PWM Servo | ||
+ | |||
+ | Dort können auch die gewünschte Anzahl der Servos und die Invertierung des Servo Signals festgelegt werden. | ||
+ | Die Pinbelegung hierfür kann in der eigenen Belegungstabelle folgendermaßen eingestellt werden: | ||
+ | |||
+ | pin(SERVO0, PD7,OUTPUT) | ||
+ | pin(SERVO1, PD6,OUTPUT) | ||
+ | pin(SERVO2, PD5,OUTPUT) | ||
+ | pin(SERVO3, PD4,OUTPUT) | ||
+ | pin(SERVO4, PD3,OUTPUT) | ||
+ | pin(SERVO5, PD2,OUTPUT) | ||
+ | pin(SERVO6, PD1,OUTPUT) | ||
+ | pin(SERVO7, PD0,OUTPUT) | ||
+ | |||
+ | == PWM mit einem timer via Control6 == | ||
+ | |||
+ | <br>Hier Mal ein kleines Alternatives Servo Test Programm, | ||
<br>Geschrieben für einen ATMega644 @ 16 MHz | <br>Geschrieben für einen ATMega644 @ 16 MHz | ||
<br> | <br> | ||
− | <br>Servo | + | <br>Servo Ausgang liegt am PortC - PC7 |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<br> | <br> | ||
+ | <br>Werte für Servo stellung und mS Pulse | ||
+ | <br>221 Endspricht ca. 0,55mS also endanschlag eine seite, | ||
+ | <br>107 Endspricht ca. 2,4 mS also endanschlag andere seite, | ||
+ | <br>sowie wert 165 mit ca. 1,650 mS endspricht der mittel stellung | ||
+ | <br>(Werte für mein servo) | ||
+ | <br>Frequenz 25 Hz | ||
<br> | <br> | ||
<br> | <br> | ||
Zeile 31: | Zeile 59: | ||
dnl # # | dnl # # | ||
dnl # # | dnl # # | ||
− | dnl # | + | dnl # Programm Erstellung: # |
dnl # Copyright (c) 08/2009 - Michael Schultz <ethersex@keyb.de> # | dnl # Copyright (c) 08/2009 - Michael Schultz <ethersex@keyb.de> # | ||
dnl # # | dnl # # | ||
Zeile 37: | Zeile 65: | ||
dnl | dnl | ||
CONTROL_START | CONTROL_START | ||
− | ECMD_GLOBAL(pos, | + | ECMD_GLOBAL(pos, 165, uint8_t); dnl Mittel Position @ 16 MHz |
THREAD(pwm_on) | THREAD(pwm_on) | ||
PORTC = 255 ; | PORTC = 255 ; | ||
Zeile 44: | Zeile 72: | ||
THREAD_END(pwm_on) | THREAD_END(pwm_on) | ||
ON STARTUP DO | ON STARTUP DO | ||
− | + | _TCCR0_PRESCALE |= _BV(CS02); dnl TCCR0B(CS02)=1 | |
− | + | _TCCR0_PRESCALE &= ~_BV(CS01); dnl TCCR0B(CS01)=0 | |
− | + | _TCCR0_PRESCALE |= _BV(CS00); dnl TCCR0B(CS00)=1 | |
− | + | _TIMSK_TIMER0 |= _BV(TOIE0); dnl TIMSK0(TOIE0) = 1 Interrupt on Timer Overflow aktivieren | |
DDRC = 255; | DDRC = 255; | ||
PINC = 0; | PINC = 0; | ||
Zeile 62: | Zeile 90: | ||
<br> | <br> | ||
<br> | <br> | ||
+ | Kleines Test programm für den Servo:<br> | ||
+ | eingabe durch + oder - mit anschließendem enter drücken | ||
+ | <source lang="text"> | ||
+ | :~# { Count=1665 ; while read Line ; do if [ "$Line" = "+" ] ; then Count=$(( Count + 1 )) ; fi ; if [ "$Line" = "-" ] ; then Count=$(( Count - 1 )) ; fi ; echo "c6 set pos $Count" ; echo "$Count" 1>&2 ; done ; } | socat stdio tcp4:10.0.0.40:2701 | ||
+ | </source> | ||
+ | <br> | ||
+ | oder mit direkter absolut sprung wert eingabe<br> | ||
+ | <source lang="text"> | ||
+ | :~# { Count=175 ; while read Line ; do Count=$(( Count + $(echo $Line | grep "+" | wc -c) - $(echo $Line | grep "-" | wc -c) )) ; if echo $Line | grep -q '[0-9]' ; then Count=$Line ; fi ; echo "c6 set pos $Count" ; echo "$Count" 1>&2 ; done ; } | socat stdio tcp4:10.0.0.40:2701 | ||
+ | </source> | ||
<br> | <br> | ||
<br>achso.. schuldigung, warum ich nicht das pwm servo modul im esex direkt nehme... | <br>achso.. schuldigung, warum ich nicht das pwm servo modul im esex direkt nehme... | ||
Zeile 72: | Zeile 110: | ||
<br> | <br> | ||
<br> | <br> | ||
+ | |||
+ | |||
+ | == PWM für Lüfter == | ||
+ | |||
+ | Siehe auch: [[Temperaturabhängige Lüftersteuerung]] | ||
+ | |||
+ | Es müssen nicht immer Servo Motoren sein die via PWM angesteuert werden. Sehr schön geht auch | ||
+ | ein Lüfter aus dem PC-Gehäuse (Achtung, 3-polig, Schwartz war bei mir Signal) | ||
+ | |||
+ | [[Bild:habo_pwm_luefter.jpg|600px]] | ||
+ | |||
+ | |||
+ | [[Kategorie:PWM]] | ||
+ | [[Kategorie:Ethersex]] | ||
+ | [[Kategorie:Control6 Examples]] | ||
+ | [[Kategorie:Servo]] |
Aktuelle Version vom 31. Mai 2011, 11:32 Uhr
Ethersex bietet verschiedene Möglichkeiten der Servo Ansteuerung an.
Inhaltsverzeichnis
via I2C-Bus IC PCA9531
siehe I2C
10x PWM mit einem Timer (in Menuconfig auswählbar)
habo: Noch gibt es Probleme wegen der Doppelbenutzung des timer1, ansonsten scheint der 10x Servo-Code gut zu laufen.
make menuconfig -> I/O -> PWM Generator -> PWM Servo
Dort können auch die gewünschte Anzahl der Servos und die Invertierung des Servo Signals festgelegt werden. Die Pinbelegung hierfür kann in der eigenen Belegungstabelle folgendermaßen eingestellt werden:
pin(SERVO0, PD7,OUTPUT) pin(SERVO1, PD6,OUTPUT) pin(SERVO2, PD5,OUTPUT) pin(SERVO3, PD4,OUTPUT) pin(SERVO4, PD3,OUTPUT) pin(SERVO5, PD2,OUTPUT) pin(SERVO6, PD1,OUTPUT) pin(SERVO7, PD0,OUTPUT)
PWM mit einem timer via Control6
Hier Mal ein kleines Alternatives Servo Test Programm,
Geschrieben für einen ATMega644 @ 16 MHz
Servo Ausgang liegt am PortC - PC7
Werte für Servo stellung und mS Pulse
221 Endspricht ca. 0,55mS also endanschlag eine seite,
107 Endspricht ca. 2,4 mS also endanschlag andere seite,
sowie wert 165 mit ca. 1,650 mS endspricht der mittel stellung
(Werte für mein servo)
Frequenz 25 Hz
dnl ################################################################################
dnl # This program is free software; you can redistribute it and/or modify it #
dnl # under the terms of the GNU General Public License (either version 2 or #
dnl # version 3) as published by the Free Software Foundation. #
dnl # #
dnl # This program is distributed in the hope that it will be useful, #
dnl # but WITHOUT ANY WARRANTY; without even the implied warranty of #
dnl # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
dnl # GNU General Public License for more details. #
dnl # #
dnl # You should have received a copy of the GNU General Public License #
dnl # along with this program; if not, write to the Free Software #
dnl # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #
dnl # #
dnl # For more information on the GPL, please go to: #
dnl # http://www.gnu.org/copyleft/gpl.html #
dnl # #
dnl # #
dnl # Programm Erstellung: #
dnl # Copyright (c) 08/2009 - Michael Schultz <ethersex@keyb.de> #
dnl # #
dnl ################################################################################
dnl
CONTROL_START
ECMD_GLOBAL(pos, 165, uint8_t); dnl Mittel Position @ 16 MHz
THREAD(pwm_on)
PORTC = 255 ;
TCNT0 = pos ;
PT_YIELD(pt);
THREAD_END(pwm_on)
ON STARTUP DO
_TCCR0_PRESCALE |= _BV(CS02); dnl TCCR0B(CS02)=1
_TCCR0_PRESCALE &= ~_BV(CS01); dnl TCCR0B(CS01)=0
_TCCR0_PRESCALE |= _BV(CS00); dnl TCCR0B(CS00)=1
_TIMSK_TIMER0 |= _BV(TOIE0); dnl TIMSK0(TOIE0) = 1 Interrupt on Timer Overflow aktivieren
DDRC = 255;
PINC = 0;
THREAD_START(pwm_on)
END
CONTROL_END
ISR(TIMER0_OVF_vect)
{
PORTC = 0 ;
TCNT0 = pos ;
}
Kleines Test programm für den Servo:
eingabe durch + oder - mit anschließendem enter drücken
:~# { Count=1665 ; while read Line ; do if [ "$Line" = "+" ] ; then Count=$(( Count + 1 )) ; fi ; if [ "$Line" = "-" ] ; then Count=$(( Count - 1 )) ; fi ; echo "c6 set pos $Count" ; echo "$Count" 1>&2 ; done ; } | socat stdio tcp4:10.0.0.40:2701
oder mit direkter absolut sprung wert eingabe
:~# { Count=175 ; while read Line ; do Count=$(( Count + $(echo $Line | grep "+" | wc -c) - $(echo $Line | grep "-" | wc -c) )) ; if echo $Line | grep -q '[0-9]' ; then Count=$Line ; fi ; echo "c6 set pos $Count" ; echo "$Count" 1>&2 ; done ; } | socat stdio tcp4:10.0.0.40:2701
achso.. schuldigung, warum ich nicht das pwm servo modul im esex direkt nehme...
also irgend was ist dort sehr buggy.....
dieses ist nur als test gedacht um zu schauen ob der servo den ok ist, oder wo das problem sein könnte
pwm servo_init
pwm servo_set 0 0 --> Pulsweite 4mS @ 9 Hz
pwm servo_set 0 225 --> Pulsweite 15mS @ 9 Hz
PWM für Lüfter
Siehe auch: Temperaturabhängige Lüftersteuerung
Es müssen nicht immer Servo Motoren sein die via PWM angesteuert werden. Sehr schön geht auch ein Lüfter aus dem PC-Gehäuse (Achtung, 3-polig, Schwartz war bei mir Signal)