Hallo
folglich würde man so auch nie eine volle umdrehung schaffen.
Das geht schon deshalb nicht weil 1.: das Poti nicht so weit drehen kann und 2.: die meisten Servos eine mechanische Sperre besitzen (wohl um das Poti vor Überdrehung zu schützen). Man kann den Drehbereich aber vergrößern indem man das Poti über ein Zwischengetriebe antreibt und den mechanischen Anschlag entfernt:
Bild hier
http://www.youtube.com/watch?v=IpIFPm5fswY
Es reichen 2 Interrupts mit einem 16Bit Timer, einer setzt den Port und der nächste löscht ihn wieder.
... und damit belegt ein einziges Servo den kompletten Timer.
Es gibt unzählige Möglichkeiten die Impulse zu erzeugen. Man sollte eben diejenige auswählen die zu dem geplanten Projekt am besten passt. Mein Favorit ist im Moment die Ansteuerung per ADC-Interrupt. Dabei kann ich nebenher noch meine analogen Eingänge einlesen und belege keinen Timer. Allerdings hat der ADC-Interrupt eine sehr geringe Priorität, aber damit kann ich leben :)
Die ADC-ISR meines aktuellen Projekts steuert Servos und wertet den ADC-Eingang am selben Pin aus. Der ADC läuft dabei im Dauerlauf (noch in der Entwicklung):
Code:
ISR(ADC_vect)
{
static uint16_t count=0; // Zykluszähler
if (count>pos[0]) // Servoimpuls senden?
{
DDRA |= 2; // nein, Pin auf Ausgang
PORTA &= ~2; // und low
}
else
{
DDRA &= ~2; // Impuls senden, Pin auf Eingang
PORTA |= 2; // und high per PullUp
}
if (count>pos[1]) // Servoimpuls senden?
{
DDRA |= 1;
PORTA &= ~1;
}
else
{
DDRA &= ~1; // Impuls senden, Pin auf Input
PORTA |= 1; // und high
}
if(count==10)
{
line[0]=ADC; // ADC auswerten und neuen Kanal setzen
ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | 1;
}
if(count==20)
{
line[1]=ADC;
ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | 0;
}
if(count<1000) count++; else count=0; // Zyklus fertig?
}
Parallel zum Servo ist ein Phototransistor (mit einem 560Ohm-Widerstand in Reihe) geschaltet. Der Servoimpuls wird über den internen PullUp bei einem auf Eingang geschaltetem Pin ausgegeben. Während des Impulses wird die Spannung am Eingang (selber Pin!) gemessen. Der Trick dabei: Auch bei voll beleuchtetem Phototransistor wird der Pegel vom Servo immer noch als High erkannt. Die Wahl des Reihenwiderstandes ist dabei etwas kritisch, spart aber gleichzeitig Platz und Pins. Mein Projekt soll mal auf einem tiny13 laufen. Das selbe Prinzip kann man z.B. auch bei Tasten verwenden und einen Servo zusammen mit einem Taster an den selben Pin hängen.
Das läuft im Moment auf einem 8MHz-Mega32 mit prescal /16, also mit 8000000/16/ca. 13(Zyklen_pro_Sample) = 38kHz. Mitte ist der Wert 53, das passt doch so in etwa ;)
Gruß
mic
Lesezeichen