Archiv verlassen und diese Seite im Standarddesign anzeigen : Nibobee Servo Ansteuerung für US
Hallo zusammen,
wie der Titel schon sagt, möchte ich bei der Bee mit einen Servo den US schwenkbar machen. Habe schon einige Beiträge gelesen, jedoch nicht wirklich das gefunden, was ich mir vorgestellt habe.
Wenn, dann warens nur irgednwelche Servo Tests in Schleifen...
Eine Anwendungsart, die mir recht gut gefallen hat, war die Ansteuerung über die Hardware PWM, jedoch sind diese Pins schon vergeben. Somit bleibt doch eigentlich nur noch eine Software PWM über, oder ?
Kurze Beschreibung meiner Idee:
Verwendung von Timer 0 - 8 Bit (0-255), F_CPU =15.000.000Hz, Prescaler 8
Somit 15.000.000/8/256 = 7324 Overflows in der Sekunde, das heißt alle 0,136 ms ein Interrupt.
Wenn ich dann den Ausgang auf HIGH setze und nach 7 Overflows (1,088ms) wieder auf LOW setze, müsste das funktionieren, liege ich da richtig ..?
Aber !? => wenn ich alle 0,136ms einen Interrupt bekomm, behindert das doch sehr das restliche Programm der Bee, oder ? (fahren, US messen, ..)
Danke für eure Unterstützungen ;)
Grüße xmaniix
radbruch
05.08.2012, 12:03
Hallo
Hier erzeuge ich das Servosignal mit Software-PWM und 36kHz Taktfrequenz:
http://i4.ytimg.com/vi/G836SWiYA_c/3.jpg (http://www.youtube.com/watch?v=G836SWiYA_c)
http://www.youtube.com/watch?v=G836SWiYA_c
https://www.roboternetz.de/community/threads/45403-NIBObee-Erweiterungen?p=437989&viewfull=1#post437989
Gruß
mic
Hey radbruch,
danke für deine schnelle Antwort - leider erst jetzt dazugekommen, mir das anzuschauen.
also nur grundlegend.. meiner Berechnung nach habe ich eine PWM Taktfrequenz von 7,3 kHz (15MHz/8/256)...oder ?
deinen Code schnall ich noch nicht wirklich ganz..
zu meiner Frage oben, kannst du dazu bitte noch was sagen => wenn ich alle 0,136ms einen Interrupt bekomm, behindert das doch sehr das restliche Programm der Bee, oder ? (fahren, US messen, ..)
danke & Grüße,
xmaniix
Torrentula
08.08.2012, 19:29
wenn ich alle 0,136ms einen Interrupt bekomm, behindert das doch sehr das restliche Programm der Bee, oder ? (fahren, US messen, ..)
Ja dein Programm wird alle 0.136ms unterbrochen, egal was es macht (nicht wenn zu diesem Zeitpunkt Interrupts gesperrt sind weil z.B. ein anderer Interrupt abgearbeitet wird). Deswegen sollte man die Ineterrupt service Routinen kurz halten, z.B. nur eine Variable hochzählen, Flag setzten o.ä., damit das Programm nicht allzulange unterbrochen wird.
radbruch
08.08.2012, 19:44
Hallo
leider erst jetzt dazugekommen, mir das anzuschauen.Kein Problem, ich habs nicht eilig.
meiner Berechnung nach habe ich eine PWM Taktfrequenz von 7,3 kHz (15MHz/8/256)Mir ist völlig schleierhaft, was du da berechnest. Im oben verlinkten Beitrag findest du das:
TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
OCR2 = 208; // 36kHz @15MHz
Der Timer2 zählt in diesem Modus von 0 bis 208, das ergibt 15000000/208 oder etwa 72000 Aufrufe der ISR pro Sekunde. Mit diesem Takt werden die LinienLEDs umgeschaltet, deshalb ist ihr Signal mit 36kHz moduliert:
if(status) {LineLEDs_on; status=0;} else {LineLEDs_off; status=1;}
(In der ISR)
Ein 36kHz-TSOP kann so modulierte Daten problemlos lesen. Und der Rest ergibt sich dann ebenfalls: 1/72000*1440 sind genau 20ms für die Wiederholfrequenz des Servosignals:
if(count<1440) count++; else {count=1; if(p) p--;};
(Ebenfalls in der ISR)
Gruß
mic
Hey,
sry bin erst jez wieder im Lande, also hab nicht vergessen zurück zu schreiben ! ;)
Hab mir den Code jetzt genauer angeschaut und ist gut verständlich !
nur eins, was macht
echo[14-servopos]=analog_getValue(ANALOG_EXT3);
Vielen Dank für den Code !
Grüße xmaniix !
PS: Bezüglich dem Video, was ist das, durch die leider schlechtere Qualität, nicht erkennbare halbrunde "Ding" (mit rotem Streifen) in der Mitte auf der Bee ? *neugierig* ;)
radbruch
21.08.2012, 18:55
http://www.youtube.com/watch?v=uwCx0GrFykU
Eines meiner vielen unfertigen Projekte:
https://www.roboternetz.de/community/threads/45403-NIBObee-Erweiterungen?p=436013&viewfull=1#post436013
Echo ist ein Array in das ich die Sharpwerte der Positionen speichere:
uint16_t echo[16];
while(1)
{
servo=35+servopos*10;
delay(100);
echo[14-servopos]=analog_getValue(ANALOG_EXT3);
if((servopos==0) || (servopos==14))
{
for(c=0; c<15; c++)
{
writeInteger(echo[c], 10);
writeString("-");
}
writeString("\n\r");
}
servopos+=schwenk;
if(!servopos) schwenk=1; else if(servopos==14) schwenk=-1;
}Nach jedem Schwenk werden die Daten gesendet.
Sieht cool aus, dachte für nen kurzen Moment das ist ein Echolot ;) wär natürlich auch cool !!
Ah ok, dann mach ich mich jetzt mal daran meinen Servo zum Laufen zu bringen ! (:
Greetz
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.