Forum: Mikrocontroller und Digitale Elektronik PWM linearisieren


von bluemole (Gast)


Lesenswert?

Hallo,

ich würde mal gerne Eure Meinungen/Tipps lesen zu folgendem Problem:

Per Frequenz soll ein Sollwert für eine Spg.-Regelung vorgegeben
werden. Die Sollwertvorgabe soll sich linearverhalten.
Die Frequenz will ich per PWM erzeugen, indem ich das Register für die
Periodenlänge manipuliere. Leider bekomme ich genau an dieser Stelle
Probleme mit der Linearität.

Beispiel: Vorgabe 1 Volt( == 1 Bit) == 1 Herz.

Das bei 10 Volt würde ich 10 Bit in das PWM-Scale-Register eintragen
und den Prescaler der PWM vom uC & die externe Beschaltung so vornehmen
das dann auch 10 Volt als Sollwert anliegen.

Bei 40 Volt wären es dann dann leider nicht 40 Bit. Sondern eine
weitaus höhere Bitzahl. Da sich bei dieser Methode die Frequenz nicht
linear verändert.

Was meint Ihr. Ist es jetzt besser mit einer LookUp-Tabelle zu
arbeiten. Oder sich eine Linearisierungsfunktion zu errechnen.
Oder eine andere Art der Frequenzerzeugung zu wählen. An der
Sollwertvorgabe via Frequenz muss ich aus bestimmten Gründen
festhalten.

Vielen Dank für Eure Meinung,
bluemole

PS: Den Dutycycle der PWM halt ich immer auf dem Tastverhältnis 1:1.
Das ist einfach; Periodenlängen Register geteilt durch zwei und ins
Dutycycle Register geklopft.

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hallo

das versteh ich nicht. Willst Du den PWM-Ausgang als DAC verwenden ?
Dann lass die Frequenz konstant und verändere das
Puls-Pausen-Verhältnis.

Gerhard

von josef (Gast)


Lesenswert?

"Die Frequenz will ich per PWM erzeugen, indem ich das Register für die
Periodenlänge manipuliere." - kein guter Weg. Freuqenzen erzeugt man
nicht mit PWM. Mit PWM kann man nur das Tastverhältnis ändern.
PWM eignet sich aber sehr gut, um mittels eines nachgeschalteten
RC-Tiefpasses und eines OPVs in Folger/ Verstärkerschaltung eine
lineare Spannung zu erzeugen. Wenn du zB einen OPV nachschaltest, der
2-fach verstärkt kannst du schön 0-10 V erzeugen. Mit dem OPV ist
ausserdem eine weitere Linearisierung möglich.


SG Josef

von bluemole (Gast)


Lesenswert?

Die Frequenz geht auf einen OVC (Frequenz-Spannungs-Converter).

von josef (Gast)


Lesenswert?

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: CTC top=OCR1A
// OC1A output: Toggle
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x40;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


Damit kannst du zB. mit dem 90s8535 und mittels seinem Timer1 eine
variable Freuquenz erzeugen. Brauchst nur OCR1AH und OCR1AL verändern.
(OCR1AH = Freq ; OCR1AL=0x00; immer beide  beschreiben !)


Josef

von bluemole (Gast)


Lesenswert?

Wenn ich mir das durchdenke ist die Frequenz aber wieder nicht linear.
Oder?

von josef (Gast)


Lesenswert?

Was ist eine lineare Frequenz ?

von A.K. (Gast)


Lesenswert?

Er meint wohl eine lineare Beziehung zwischen dem Counter-Wert und der
Frequenz. Und die ist nun mal hyperbolisch, d.h. es muss dividiert
werden. Microcontroller mögen nicht dafür geboren sein, aber ein
bischen rechnen können sie auch. Fertige Routinen dafür gibt's via
Compiler oder Application-Note des Herstellers.

Tabelle mag nötig sein, wenn's arg eilig ist.

Was das mit den 40 Bit soll ist mir freilich unklar. Um welchen
Frequenzbereich geht es denn?

von peter dannegger (Gast)


Lesenswert?

"Die Frequenz geht auf einen OVC (Frequenz-Spannungs-Converter)."

Wenn Du vielleicht noch den Sinn dieser Übung verraten könntest ?

Geht es nur darum, etwas möglichst umständlich und ungenau zu machen ?

Warum nimmst Du denn nicht gleich die PWM zur Spanungserzeugung ?

Ist mit Sicherheit wesentlich schneller, genauer und linearer als der
Umweg über ne Umrechnungstabelle und den FVC.


Peter

von bluemole (Gast)


Lesenswert?

Der uC ist auf einem anderen Potential als die Regelung. Um die
galvanische Trennung zu überwinden ist es einfacher und genauer eine
Frequenz zu benutzen.

Um eine weitere oben genannte Unklarheit zu beseitigen. Es handelt sich
um einen Frequenzbereich von ca. 1kHz - 12kHz.

A.K. hat recht mit seiner Hypobolischen Funktion, kennt jemand einen
Link mit einem guten Beispiel?

von Michael (ein anderer) (Gast)


Lesenswert?

Auch ein PWM-Signal ist eine Frequenz... Dann mach' es doch so:

PWM ---> galvanische Trennung (Opto) ---> Tiefpass

Fertig ist der Lack. Wozu der Umweg über einen
Frequenz-Spannungs-Wandler?

von bluemole (Gast)


Lesenswert?

Wozu der Umweg über einen
Frequenz-Spannungs-Wandler?

Ich kann von dem Prinzip leider nicht weg, ist nun mal eine Vorgabe.

von peter dannegger (Gast)


Lesenswert?

Es weiß hier ja keiner, welchen µC Du nimmst.

Mal angenommen einen AVR bei 8MHz:

8e6  12e3  2 = 333

D.h. Du erreichst maximal 333 * (1 - 1/12) = 305 lineare Stufen.

Da ist es das einfachste, eine Tabelle mit 305 Einträgen a 2 Byte zu
nehmen.

Wenn überhaupt Dein FVC so linear ist, ansonsten entsprechend weniger
Einträge.


Im Prinzip hat Michael aber recht, das PWM-Signal vor dem Filter läßt
sich auch prima über nen Optokoppler geben.


Peter

von bluemole (Gast)


Lesenswert?

Es ist ein HCS12 uC von Motorola/Freescale. 16 Bit breit.

von Marko (Gast)


Lesenswert?

Habe den Code vom Zoltan benutzt.

TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10);
TCCR1A=(1<<WGM11)|(1<<WGM10)|(1<<COM1A0);

OCR1A = 100;
// Frequenz einstellen


Allgemein kann man folgende Formel benutzen:

OCR1A = 8000000/Frequenz

Das Problem eine möglichst lineare Frequenz zu generieren liegt darin,
dass OCR1A nur ein 16-bit Register ist.
Das bewirkt, dass bei hohen Frequenzen die Abstände immer größer
werden. (f = 1/T)

Da aber beim Überlauf mind. ein Takt Verzögerung auftritt und diese bei
höheren Frequenzen einen höheren Anteil besitzt, da ja da
T kleiner wird, ergibt sich eine nach oben hin größer werdende
Differenz.

Ein Beispiel:
Quarz = 16 MHz, Vorteiler = 1

f= 5 KHz --> OCR1A = 1600
mit Frequenzmesser gemessen aber : 4,997437 KHz

Differenz =  2,536 Hz

f = 10KHz --> OCR1A = 800
mit Frequenzmesser gemessen aber : 9,988634 KHz

Differenz = 11,366 Hz

Die Formal muss um einen Faktor korrigiert werden.

Verändert man die Formel auf

OCR1A = 8000000/f - 1

Marko

kommt man sehr dicht an die gewünschte Frequenz heran.

f = 10KHz --> OCR1A = 799
mit Frequenzmesser gemessen aber : 10,00112 KHz

f_abstand zum OCR1A +- 1 ca. 8Hz

f= 5 KHz --> OCR1A = 1599
mit Frequenzmesser gemessen aber : 5000,532 KHz

f_abstand zum OCR1A +- 1 ca. 3Hz

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.