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


von Guerrero G. (elguerrero)


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.

von Falk B. (falk)


Lesenswert?

An deiner Software.

von Christian M. (Gast)


Lesenswert?

Guerrero G. schrieb:
> 16:30

Falk B. schrieb:
> 16:30

Problemlösung in Realtime!

Gruss Chregu

von Guerrero G. (elguerrero)


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:
1
main()
2
{
3
   ADC_VALUE = ADC();
4
   PWM(ADC_VALUE);
5
}
6
7
8
ADC(void)
9
{
10
   ADC_MEASUREMENT_FINISH = FALSE;
11
   ...
12
13
/* SOBALD DIE AD WANDLUNG FERTIG IST, WIRD DIE WHILE SCHLEIFE VERLASSEN */
14
   adc_wert = while(!ADC_MEASUREMENT_FINISH); 
15
16
17
   return adc_wert;
18
}
19
20
PWM(ADC_VALUE)
21
{
22
  Dutycylce(ADC_VALUE);
23
}


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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
Antwort schreiben
2
3
Wichtige Regeln - erst lesen, dann posten!
4
    Groß- und Kleinschreibung verwenden
5
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
6
7
Formatierung (mehr Informationen...)
8
    [c]C-Code[/c]
9
:
10
:

von Thomas E. (picalic)


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
von Guerrero G. (elguerrero)


Lesenswert?

ach das hab ich voll vergessen sry. natürlich sieht der code wie folgt 
aus:
1
 main()
2
 {
3
   while(1)
4
   {
5
     ADC_VALUE = ADC();
6
     PWM(ADC_VALUE);
7
   }
8
 }
sonst macht ja der Einsatz von einem µC keinen Sinn.

: Bearbeitet durch Moderator
von Teo D. (teoderix)


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?

von Thomas E. (picalic)


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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Teo D. (teoderix)


Lesenswert?

Guerrero G. schrieb:
> ...

Sicher versteckt sich der Fehler da dahinter.

von A. D. (egsler)


Lesenswert?

Guerrero G. schrieb:
> adc_wert = while(!ADC_MEASUREMENT_FINISH);

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

von Axel R. (Gast)


Lesenswert?

popcorn :)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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:
1
uint16_t ADC(void) {
2
uint16_t myADCValue = ADC_DR; // oder wasauchimmer abfragen
3
4
return myADCValue;
5
}

von Guerrero G. (elguerrero)


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)
1
 while(!((ADC_RESULT_REGISTER)&(ADC_FINISH_FLAG))); 
2
3
    return (ADC_RESULT_REGISTER & 0x00000FFF);

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Guerrero G. schrieb:
1
  while(!((ADC_RESULT_REGISTER)&(ADC_FINISH_FLAG)));
2
  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...

von Peter D. (peda)


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.

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.