mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Dutycycle reagiert langsam auf Potiwert


Autor: Guerrero Guerrero (elguerrero)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Hallo,

ich habe neulich ADC und PWM auf LPCXpresso Board (LPC1769) 
programmiert. Leider reagiert mein PWM Dutycycle verzögert auf die 
Änderungen am Poti´(ca. 1sek). Woran könnte das liegen?

Danke im Voraus.

Autor: Falk Brunner (falk)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
An deiner Software.

Autor: Christian Müller (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> 16:30

Falk B. schrieb:
> 16:30

Problemlösung in Realtime!

Gruss Chregu

Autor: Guerrero Guerrero (elguerrero)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Ich glaube auch das es an der Software liegt und nicht an der 
Konfiguration von der PWM oder ADC.

wie gewährleiste ich die Realtime? Im Folgenden die grobe 
Funktionsweise:
main()
{
   ADC_VALUE = ADC();
   PWM(ADC_VALUE);
}


ADC(void)
{
   ADC_MEASUREMENT_FINISH = FALSE;
   ...

/* SOBALD DIE AD WANDLUNG FERTIG IST, WIRD DIE WHILE SCHLEIFE VERLASSEN */
   adc_wert = while(!ADC_MEASUREMENT_FINISH); 


   return adc_wert;
}

PWM(ADC_VALUE)
{
  Dutycylce(ADC_VALUE);
}


Ich bin mir jetzt auch nicht sicher ob das an der while Schleife liegen 
könnte. Also ich verwende in diesem Fall keine Interrupts. Ich warte bis 
das AD finisih flag gesetzt wird (wird in der while schleife erkannt) 
und anschließend wird zur pwm übergegangen.

: Bearbeitet durch Moderator
Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> adc_wert = while(!ADC_MEASUREMENT_FINISH);
Hast du dieses Codefragment aus dem Kuriositätenkabinett geholt?

Wie auch immmer: der Fehler ist nicht im geposteten Code.

BTW:
Lies und beachte bitte die Bedienungsanleitung über der Eingabebox:
Antwort schreiben

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]
:
:

Autor: Thomas Elger (picalic)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> main()
> {
>    ADC_VALUE = ADC();
>    PWM(ADC_VALUE);
> }

Meine Theorie: der Code wird korrekt ausgeführt und der Controller geht 
dann in eine leere Endlosschleife (weil: main() ist ja fertig 
ausgeführt!), bis nach ca. 1 Sekunde der Watchdog zuschlägt und einen 
Reset ausführt.

: Bearbeitet durch User
Autor: Guerrero Guerrero (elguerrero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach das hab ich voll vergessen sry. natürlich sieht der code wie folgt 
aus:
 main()
 {
   while(1)
   {
     ADC_VALUE = ADC();
     PWM(ADC_VALUE);
   }
 }
sonst macht ja der Einsatz von einem µC keinen Sinn.

: Bearbeitet durch Moderator
Autor: Teo Derix (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> ach das hab ich voll vergessen sry. natürlich sieht der code wie folgt
> aus:

Was soll dann der Fantasiescheiß da oben?
Nicht das es sehr dämlich währe, ist es extrem unfreundlich.

Ich fühle mich verarscht! und ich soll dir helfen?

Autor: Thomas Elger (picalic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann schmeiss' den Debugger an und guck, womit sich der Controller 
die ganze Sekunde lang beschäftigt.
Meine Alternativtheorie: durch einen Fehler geht immer nur eine 
Messung/ein Durchlauf pro MPU-Reset, und wieder ist es der Watchdog, der 
dann den Takt vorgibt...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> natürlich sieht der code wie folgt aus:
Hatte ich da nicht irgendwann irgendwas zum Thema [c]-Tags geschrieben?

Und um der Salamitaktik ein Ende zu bereiten: häng einfach mal GENAU so 
eine C-Datei an, die GENAU dieses Problem aufweist.

Autor: Teo Derix (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> ...

Sicher versteckt sich der Fehler da dahinter.

Autor: A. D. (egsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> adc_wert = while(!ADC_MEASUREMENT_FINISH);

Da ich diese Schreibweise nicht kenne: Wie ist die Zeile zu verstehen?

Autor: Axel R. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
popcorn :)

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
> ADC(void)
> {
>    ADC_MEASUREMENT_FINISH = FALSE;
>    ...
>
> /* SOBALD DIE AD WANDLUNG FERTIG IST, WIRD DIE WHILE SCHLEIFE VERLASSEN
> */
>    adc_wert = while(!ADC_MEASUREMENT_FINISH);
>
>    return adc_wert;
> }

Hä? Auch das sieht sehr mehrwürdig aus. Funktion returniert einen Wert, 
obwohl gar nicht so deklariert.
Ich hätte eher sowas erwartet:
uint16_t ADC(void) {
uint16_t myADCValue = ADC_DR; // oder wasauchimmer abfragen

return myADCValue;
}

Autor: Guerrero Guerrero (elguerrero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Guerrero G. schrieb:
>> natürlich sieht der code wie folgt aus:
> Hatte ich da nicht irgendwann irgendwas zum Thema [ c ]-Tags geschrieben?
>
> Und um der Salamitaktik ein Ende zu bereiten: häng einfach mal GENAU so
> eine C-Datei an, die GENAU dieses Problem aufweist.


Lothar, bin leider relativ neu hier. In der Zukunft wird das besser, 
danke für die Hinweise. C Code häng ich heute Abend an...




Thomas E. schrieb:
> Ok, dann schmeiss' den Debugger an und guck, womit sich der
> Controller
> die ganze Sekunde lang beschäftigt.
> Meine Alternativtheorie: durch einen Fehler geht immer nur eine
> Messung/ein Durchlauf pro MPU-Reset, und wieder ist es der Watchdog, der
> dann den Takt vorgibt...

Das werde ich machen... Danke.



Julian S. schrieb:
> Da ich diese Schreibweise nicht kenne: Wie ist die Zeile zu verstehen?
Also im Hintergrund führt der µC eine AD Wandlung aus. Sobald die 
analogen Signale in digitale umgewandelt sind, wird ein Flag gesetzt das 
informieren soll das die Messung durch ist. Korrekt sieht es so aus:


ADC_RESULT_REGISTER -> 0xy0000xxx -> xxx-> AD Wert; y = flag (nur 1 bit. 
nehmen wir an Bit 31

ADC_FINISH_FLAG ist eine Maske in dem Fall -> 0x80000000.

So mit dieser Zeile prüfe ich also ab wann der 31. Bit auf 1 gesetzt 
wird (=ad wandlung fertig -> Ergebnis zum abholen bereit)
 while(!((ADC_RESULT_REGISTER)&(ADC_FINISH_FLAG))); 

    return (ADC_RESULT_REGISTER & 0x00000FFF); 

: Bearbeitet durch Moderator
Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guerrero G. schrieb:
  while(!((ADC_RESULT_REGISTER)&(ADC_FINISH_FLAG)));
  return (ADC_RESULT_REGISTER & 0x00000FFF);
Das ist jetzt wieder ganz normaler C-Code. Und ich hatte mich schon 
gefragt, was der Rückgabewert einer while()-Funktion ist...

Guerrero G. schrieb:
> C Code häng ich heute Abend an...
Einfach als C-File. Du kannst auch mehrere C-Dateien nacheinander 
anhängen...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian S. schrieb:
> Guerrero G. schrieb:
>> adc_wert = while(!ADC_MEASUREMENT_FINISH);
>
> Da ich diese Schreibweise nicht kenne: Wie ist die Zeile zu verstehen?

Da hab ich auch erstmal gestutzt. Der GCC hat mir dann gesagt, daß das 
Bullshit ist. Schlüsselwörter liefern keinen Wert.

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.