Forum: Mikrocontroller und Digitale Elektronik ATmega8 PWM mit Input Capture generieren


von adi (Gast)


Angehängte Dateien:

Lesenswert?

Hi

ich habe das Forum durchsucht, aber nicht die Lösung zu meinem Problem 
gefunden.

Ich möchte auf Basis eines externen PWM-Signals ein PWM-Signal 
generieren, welches 1.5 ms auf high ist. (für servo)
Nun eigentlich müsste das Programm funktionieren, nur tut es das nicht.
Ich habe kein Oszilloskop zur hand, deshalb weiss ich nicht, welches 
Signal tatsächlich generiert wird, auf jeden fall nicht die 1.5 ms, denn 
der Servo fährt immer an den Anschlag und nicht schön in die Mitte.

Vielleicht kann mir jemand sagen, was der Fehler ist.

Vielen dank schonmal,

adi

PS: ich bin noch ein ziehmlicher Anfänger

von Düsendieb (Gast)


Lesenswert?

adi schrieb:
> PS: ich bin noch ein ziehmlicher Anfänger

Schneide die Aufgabe in mehrere Teile.

1. PWM messen
2. Ausgabe auf eine LED z.B. mit einem Vergleicher
3. Ausgabe des neuen PWM Signals mit festem Sollwert
4. jetzt alles zusammen,  Ausgabe des neuen PWM Signals mit eingelesenem 
Sollwert

Dann berichte, an welcher Stelle Du gescheitert bist.

Axel

von adi (Gast)


Lesenswert?

ach ja, das kann vielleicht zu Verwirrung führen...
Der Input capture dient vorerst nur als externer Interrupt.

adi

von adi (Gast)


Lesenswert?

Vielen Dank für die Antwort!

ich probiers gleich mal aus...

adi

von Karl H. (kbuchegg)


Lesenswert?

Düsendieb schrieb:

> Schneide die Aufgabe in mehrere Teile.

Full Ack

>
> 1. PWM messen
> 2. Ausgabe auf eine LED z.B. mit einem Vergleicher
> 3. Ausgabe des neuen PWM Signals mit festem Sollwert
> 4. jetzt alles zusammen,  Ausgabe des neuen PWM Signals mit eingelesenem
> Sollwert

Ich würds umdrehen und erst mal mit der 'Ausgabenseite' anfangen.
D.h Servo-Positionierung. Erst mit fixen Werten. Dann mit variablen 
Werten. Und erst wenn das läuft, wird die Input Seite in Angriff 
genommen. Ist meistens eine gute Idee, wenn man erst mal dafür sorgt, 
dass man in irgendeiner Form Werte sichtbar machen kann.

1
int main(void)
2
{
3
  TCCR1B |= (1<<ICNC1) | (1<<ICES1);
4
  TIMSK |= (1<<TICIE1);
5
  
6
  DDRC |= (1<<DDRC0);

täusch ich mich oder hat der Timer keinen Vorteiler?

von adi (Gast)


Angehängte Dateien:

Lesenswert?

@ kbuchegg
In dem Programm oben habe ich die Input capture-Funktion nur als 
externen Interrupt benutzt, das funktioniert auch ohne den Timer zu 
starten, der wird dann erst in der Interrupt-routine gestartet. (hat 
wohl noch niemand versucht?)
Das Programm war nur dafür gedacht, auf basis des inputs ein pwm signal 
zu generieren, also bei jedem IC-interrupt (alle 20ms) ein signal von 
1.5ms auszugeben.

...

Ich hab jetzt mal versucht, das eingangssignal zu messen und zu 
vergleichen, aber der wert schwankt die ganze Zeit, die LED blinkt, auch 
wenn ich das input signal verändere.

adi

von adi (Gast)


Angehängte Dateien:

Lesenswert?

Hi

also vielen Dank nochmal für die Hilfe und hier ist jetzt mein fertiges 
Programm, wo Input Capture und PWM-generierung seperat erfolgen, aber 
mit dem selben Timer. Und es funktioniert bestens!

gute Nacht,

adi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.