Hallo
Hier erzeuge ich das Servosignal mit Software-PWM und 36kHz Taktfrequenz:
Bild hier
http://www.youtube.com/watch?v=G836SWiYA_c
https://www.roboternetz.de/community...l=1#post437989
Gruß
mic
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
Hallo
Hier erzeuge ich das Servosignal mit Software-PWM und 36kHz Taktfrequenz:
Bild hier
http://www.youtube.com/watch?v=G836SWiYA_c
https://www.roboternetz.de/community...l=1#post437989
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
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.wenn ich alle 0,136ms einen Interrupt bekomm, behindert das doch sehr das restliche Programm der Bee, oder ? (fahren, US messen, ..)
MfG Torrentula
Hallo
Kein Problem, ich habs nicht eilig.leider erst jetzt dazugekommen, mir das anzuschauen.
Mir ist völlig schleierhaft, was du da berechnest. Im oben verlinkten Beitrag findest du das:meiner Berechnung nach habe ich eine PWM Taktfrequenz von 7,3 kHz (15MHz/8/256)
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
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
Code: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*
Eines meiner vielen unfertigen Projekte:
https://www.roboternetz.de/community...l=1#post436013
Echo ist ein Array in das ich die Sharpwerte der Positionen speichere:
Nach jedem Schwenk werden die Daten gesendet.Code: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; }
Geändert von radbruch (21.08.2012 um 20:02 Uhr)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
Lesezeichen