Hallo Ihr Controller-Profis,
ich muss einen STM32F103 auf einem Keil-Starter-Kit dazu bringen 5 PWM
Signale so genau wie möglich zu messen und das Tastverhältnis zu
berechnen.
Mein riesiges Problem ist, dass ich keine Erfahrungen mit
MicroControllern habe. Ich habe allerdings keine Probleme C zu
programmieren.
Mein erstmal größtes Problem ist, dass ich nicht weiß, wie ich die
Eingänge bearbeite um dann mit C zu verarbeiten.
Ich benötige also die Lücke zwischen dem Signal, welches am Port anliegt
und dem Inhalt einer Variable (z.B. PWM_Signal_1) welche ich dann auf
steigende und fallende Flanken auswerte.
Das Tastverhältnis und die Berechnung ist also nicht dass Problem,
sondern die Abfrage der Ports!
Ich hoffe, ihr könnt mir weiterhelfen!
Mathias
Hallo also, nun mit Login!
Ich habe nun weitere Ideen zur Umsetzung meines Programms, benötige aber
immer noch Hilfe!
Also grundsätzlich habe ich mehrere Fragen:
1.: Das PWM Signal, dass ich messen will hat eine Frequenz von bis zu
32kHz und das Tatsverhältnis liegt zwischen 10% und 90%!
Frage: wie muss ich meine Eingänge einstellen?
2.: Ich wollte an meinen Ports einfach einen Timer starten, wenn die
Eingangsspannung größer 2.5V wird (positive Flanke). Wenn die Spannung
kleiner 2.5V wird (negative Flanke) speicher ich die Zeit in eine
Variable ab und warte noch die nächste positive Flanke ab, speicher
diese Zeit auch ab und setze den Timer wieder auf null, damit ich die
nächste Periode erfassen kann.
Die weitere Berechnung ist klar!
Frage: Kann ich dass so machen?
3. Frage: Wie muss ich die benötigten Timer einrichten?
4. Frage: Kann ich dass alles in einer fünffachen Ausführung parallel
machen? (Ich benötige ja 5 PWM-Signale gleichzeitig ohne Verzögerung, da
ich die Signal miteinander verrechnen muss!)
Ich hoffe dass sich jetzt, nach meiner weiteren Erläuterung der
Probleme, jemand meiner annimmt!
Grüße aus dem Rheingau,
Mathias
Mathias Armbrüster schrieb:> Frage: wie muss ich meine Eingänge einstellen?
Wenn sie auf 2,5V reagieren sollen, dann müssen Komparatoren davor.
> Frage: Kann ich dass so machen?
Lass den Timer durchlaufen, aber verwende den Capture Modus der Timer.
Der speichert den aktuellen Timerwert im Capture-Register und löst einen
Interrupt aus. Jeder der allgemeinen Timer hat 4 solcher Capture-Kanäle.
Was aber etwas knackig wird: Nehmen wir an, es kommen 5 PWM Signale mit
32KHz und 10% Tastverhältnis rein, zufälligerweise synchron. Eine
Periode ist ~30µs, d.h. die Flanken eines Eingangs liegen ~3µ
auseinander. Damit nichts verloren geht müssten die Interrupts aller 5
Kanäle innerhalb dieser 3µs den Wert auslesen und die zu erkennende
Flanke umstellen. Das ist eng.
Besser: Jedes PWM Signal an 2 Capture-Kanäle des gleichen Timers legen.
Einer nur für die positive Flanke, einer nur für die negative. Dann sind
es nur noch 5 Interrupts alle 30µs, was kein Problem darstellt.
Danke für deine Antwort!
> Was aber etwas knackig wird: Nehmen wir an, es kommen 5 PWM Signale mit> 32KHz und 10% Tastverhältnis rein, zufälligerweise synchron. Eine> Periode ist ~30µs, d.h. die Flanken eines Eingangs liegen ~3µ> auseinander. Damit nichts verloren geht müssten die Interrupts aller 5> Kanäle innerhalb dieser 3µs den Wert auslesen. Das ist möglich, aber> eng.
Wir können die Frequenzen der Sensoren auch verkleinern, haben noch
keine Erfahrungswerte bekommen!
> Besser: Jedes PWM Signal an 2 Capture-Kanäle des gleichen Timers legen.> Einer für die positive Flanke, einer für die negative. Dann sind es nur> noch 5 Interrupts alle 30µs, was kein Problem darstellt.
Das hört sich sehr gut an!
Wie ganz oben zu lesen ist dies meine erstes uControler-Projekt und ich
habe echte Probleme mit dem einrichten der Eingänge!
Kannst du mir da Tipps geben oder ein Beispiel, welches ein PWM
einliest?
Ich programmiere mit Keil, habe aber auch Yagarto und Eclipse
installiert (Tip von unserem Informatiker! Für einen E-Techniker finde
ich aber Keil leicher!)
Ich benötige alos hauptsächlich Unterstützung um Signal in Variablen
einzulesen!
Mathias
Du wirst nicht drum herum kommen, dich etwas intensiver in die
Programmierung von Mikrocontrollern und speziell der STM32-Timer
einzulesen. Ist etwas Arbeit, aber die werde ich dir nicht abnehmen.
Ich gehe davon aus, dass es bei Keil einige Beispiele gibt. Die werden
aber nicht direkt dein Problem lösen.
Entschuldigung, wenn du dass falsch verstanden hast!
Ich wollt nicht, dass du mir die Arbeit machst!
Ich will mich ja auch einarbeiten, ich dachte da auch an irgend ein
Beispiel, welches ein PWM einliest.
Hast du Tipps für mich, mit was ich mich da am besten einlese?
Mathias
Hallo,
nach vielen demotivierenden Stunden mit der reference manuel, dem
Datenblatt, meinem PCs und des Demoboard habe ich eine Ausgabe an der
Seriellen Schnittstelle.
Das Problem ist, dass ich keine Werte außer 0000... bekomme!
Nun habe ich die Frage, ob die Register nicht gefüllt werden, oder ob
ich sie nicht richtig auslese.
Kann ich mit diesen Befehlen meine Register von Tim2 Ch1 und Ch2
auslesen, oder funktioniert das nicht?
float Periode, DutyCycle;
Periode = TIM2->CCR1;
DutyCycle = TIM2->CCR2;
Grüße,
Mathias