mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik keine 100% Dutycycke bei voller Aussteuerung mit PWM


Autor: Kartoffel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,
also zur Erinnerung: ich steruere einen GS-Motor mit PWM an. Das 
eigentliche Ziel meines Projektes ist, einen Regler für diesen Motor zu 
programmieren. Der Algorithmus steht jetzt soweit, nur kann er nicht 
getestet werden, weil schon im Leerlauf meine vorgegebene Drehzahl nicht 
der tatsächlichen entspricht. Und zwar hab ich eine Maximaldrehzahl von 
3000 U/min. Dann sollte der Motor eigentlich auch mit 100% 
Tastverhältnis angesteuert werden, dies ist leider nie der Fall. Hab mir 
das Signal in Abh. der Geschwindigkeit (Vorgabe) angeschaut. Im Anhang 
sind die Bilder.

Weiß einer vielleicht woran das liegen könnte?
Ich verdächtige eigentlich die Gegen-EMK vom Motor, bin mir aber nicht 
sicher.
Wie könnte ich diese Differenz kompensieren?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal sagen, du hast in deiner Software einen Fehler.

Autor: dösbadl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Software? Controller?

Autor: klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gegen EMK kann doch deinen dutycycle nicht beeinflussen...
Lediglich den Strom bzw. die rel. Spannung zwischen PWM-Ausgang und 
"Wicklungseingang".

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Benedikt K.:
das glaube ich nicht. Ich hatte sie nämlich hier schon gepostet kritisch 
analysieren lassen.

Die Pulsbreite lässt sich mit einem Register verändern. Bei dez. 65135 
hab ich PWM 50% und Drehzahl 0. Bei dez. 65535 hab ich PWM 100% und 
eigentlich Drehzahl von 3000 U/min.

die Umrechung in den Registerwert erfolgt so:
unsigned int Drehz_setzen(unsigned int Soll_dr)
{
Hexwert = MIN + (Soll_dr/7.5);

return Hexwert;
}

@ dösbadl

Controller XC167

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ klausy

die Gegen EMK ist doch die Spannung die am Motor induziert wird und die 
entgegen der anliegenden Spannung gerichtet ist.
Oder?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kartoffel wrote:
> @  Benedikt K.:
> das glaube ich nicht. Ich hatte sie nämlich hier schon gepostet kritisch
> analysieren lassen.

 Setze doch mal den PWM Wert direkt auf 65535 und schau ob wirklich 100% 
PWM rauskommen. Falls nein, dann hast du doch einen Softwarefehler.

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Benedikt K.

hab ich gemacht, und nö, ich hab immer noch keine 100% :-(
Der Verlauf schaut genau so aus wie der mit 3000 U/min bei den Bildern

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal direkt am µC Pin gemessen ?

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Benedikt K.

nö, hab am Motor gemessen. Ich hab zwei Pins für PWM, also invers 
zueinander.
Mess aber gleich mal nach.

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab am Pin vom µC auch schon keine 100%, hmmm

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Kartoffel (Gast)

>hab am Pin vom µC auch schon keine 100%, hmmm

Der AVR kann AFAIK keine 100% PWM generieren. Nur Null Prozent.

MFG
Falk

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch geht, zumindest beim Tiny25, wobei aufm Oszi da eine minimal Lücke 
ist. 99,9% sollten aber drin sein.

EDIT: Grade erst gesehen das es sich um ein XC167 Controller handelt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tim T. (tim_taylor)

>Doch geht, zumindest beim Tiny25, wobei aufm Oszi da eine minimal Lücke
>ist. 99,9% sollten aber drin sein.

Das meinse ich. Es ist immer ein Timertakt Lücke, weil der maximale 
PWM-Wert 255 bzw 65535 ist, die PWM aber 256 bzw 65536 Takte 
Periodendauer hat. Steht auch im Datenblatt.

MfG
Falk

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab aber auch keine 99,9%!!!!!!!

Autor: Dieter Stotz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kartoffel,

in Bild 10 (?) ist auffällig, dass die PWM unregelmäßig ist. Entweder 
Messfehler oder aber die PWM ist gestört durch Resets oder dergleichen.


Dieter

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> @ Tim T. (tim_taylor)
>
>>Doch geht, zumindest beim Tiny25, wobei aufm Oszi da eine minimal Lücke
>>ist. 99,9% sollten aber drin sein.
>
> Das meinse ich. Es ist immer ein Timertakt Lücke, weil der maximale
> PWM-Wert 255 bzw 65535 ist, die PWM aber 256 bzw 65536 Takte
> Periodendauer hat. Steht auch im Datenblatt.
>
> MfG
> Falk

Aber der Counter zählt doch ab 0.
0..65535

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Dieter:
es ist so, dass ich die Messung der Geschwindigkeit höher priorisiert 
habe, als sie PWM Erzeugung. Deswegen kann es sein, dass die Interrupts 
sich überschneiden und es zu nicht ganz regelmäßigen Signalen kommt.
Aber ich hatte die Prioritäten auch schon andersrum und auch keine 100% 
Dutycycle...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, es ist anders herum. Es gibt keine 0%, aber 100%

"The extreme values for the OCR1x Register represents special cases when 
generating a PWM waveform output in the fast PWM mode. If the OCR1x is 
set equal to BOTTOM (0x0000) the output will be a narrow spike for each 
TOP+1 timer clock cycle. Setting the OCR1x equal to TOP will result in a 
constant high or low output (depending on the polarity of the output set 
by the
COM1x1:0 bits.)"

MfG
Falk

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jop, zur Vollständigkeit noch der Phase Correct PWM Mode:

The extreme values for the OCR1x Register represent special cases when 
generating a PWM waveform output in the phase correct PWM mode. If the 
OCR1x is set equal to BOTTOM, the output will be continuously low and if 
set equal to MAX the output will be continuously high for non-inverted 
PWM mode. For inverted PWM the output will have the opposite logic 
values.

Demnach sollte es doch möglich sein 0% und 100% zu erreichen.

Ich hatte wohl den Fast PWM und inversen Ausgang benutzt und somit einen 
Spike nach unten generiert.

Zurück zum OP: kannst Du mal deinen Code (Ausschnittsweise) posten?

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er hat aber keinen AVR, sondern einen XC167. Ein Auszug aus dessen 
Datenblatt zu diesem Thema wäre interessant.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel Rühl wrote:
> er hat aber keinen AVR, sondern einen XC167. Ein Auszug aus dessen
> Datenblatt zu diesem Thema wäre interessant.

Stimmt, wenn man allerdings die Messungen des OP ansieht, ist der Fehler 
durch die 0%/100% Problematik auszuschliessen, dafür ist er einfach zu 
groß.

Bin mir zu 99% sicher das es ein Softwarefehler des OP ist...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim T. wrote:
> Bin mir zu 99% sicher das es ein Softwareproblem ist...

Dann macht er aber etwas total falsch:
Beitrag "Re: keine 100% Dutycycke bei voller Aussteuerung mit PWM"

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab doch geschrieben, dass ich einen XC167er hab und keinen AVR.
Die PWM generierung läuft so ab:
Ich lasse einen Timer mitlaufen mit Reload nach 20µs, das ist auch meine 
Periode vom PWM, (passt genau, siehe Anhang). Timer Reload Register ist 
FCE0. Also zähl ich von FCE0 bis FFFF. Die Differenz ist 799 (also 800). 
Ab FE70 (65136) bis FFFF (65535) dreh ich mich vorwärts. Also wenn Timer 
abgelaufen->  Pin auf 1, wenn der Timerwert dem Inhalt der Compare 
Registers entspricht, dann Pin per Int. wieder auf 0 usw.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie groß ist MIN?

EDIT: Verdammt, hab irgendwie den Text gekillt.

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tim.T
ich setze einfach den Wert des Compare Registers auf 100% also auf FFFF, 
hab es schon per Funktion implementiert, hab es aber auch manuell im 
Programm gesetzt gehabt-> keinen Unterschied

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tim.T
MIN ist 65135

Autor: reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal den SourceCode der Timer-Init zeigen?

mfg

Autor: Kartoffel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ reiner: hab ihn  mit Dave erzeugt.
Timer wird in der CapCom2 Einheit mit initialisiert.

die C.Datei ist im Anhang

Autor: reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dann mal das dave-File da, das ist leichter zu lesen... warum 
nutzt du eigentlich nicht die CAPCOM6, die ist, soweit ich mich 
erinnere, doch wesentlich einfacher zu konfigurieren und für PWM bestens 
geeignet.

mfg

Autor: Kartoffel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dave File ist im Anhang.
Also mit CC2 muss es doch auch funktionieren.

Autor: reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann noch eine kurze Frage: Welchen XC167 nutzt du?

Autor: reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal in meinen alten Unterlagen nachgesehen und dort folgendes 
gefunden.

Timer7 im TimerMode, PreScaler je nachdem...
Interrupt Timer7 enabled
Reload Register ebenfalls je nachdem

Channelxx CompareMode 3:Set Pin on each Match
CompareRegister CCxx je nachdem
CCxx allocated to Timer7

Interrupt Timer7 aktivieren

In der Timer7 (Overflow) InterruptRoutine dann einfach den PortPin 
wieder auf 0 setzen. Damit sollte man auf eine ausreichende Genauigkeit 
kommen.
Außerdem empfiehlt sich ein größerer PreScaler für den Timer, damit der 
Wertebereich des Timer-Registers etwas besser ausgenntzt wird. Ist aber 
meine persönliche Meinung. Außerdem die PWM-Frequenz runternehmen, 5kHz 
sind auch ok...

Wie kannst du eigentlich nen prescaler von 1 für den Timer einstellen? 
bei mir ist 8 das Minimum...

Daher nochmal die Frage: Welchen C167 nutzt du?

mfg

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@reiner:
1. also zum µC: ich nutze den XC167 CI-32F4OF (so steht's drauf).
2. ja, ich kann auch mit Dave einen Prescaler von 1 einstellen, und zwar 
hab ich in dem Manual ne Formel gesehen, mit deren Hilfe man aus dem 
Clock den Prescaler ausrechnen kann und deswegen komme ich auf 0,025µs.

Channelxx CompareMode 3:Set Pin on each Match:
also das kann ich bei mir nicht anklicken. Ich kann nur zwischen Compare 
Mode 0 und 2 wählen (hab Interrupt only). Was ist die Compare Mode 3? 
Warum sollte ich sie deiner Meinung nach nehmen?

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@reiner:
ich hab das übrigens auch mit einer geringeren PWM Frequenz probiert 
(25kHz).
Hat auch nicht funktioniert....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.