PWM Dutycycle reagiert langsam auf Potiwert

OP #4701051
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.
Moderator (Firma: Titel) Persönliche Seite #4701061
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
:
(Firma: matzetronics) #4701243
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
}
OP #4701261
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);
Moderator (Firma: Titel) Persönliche Seite #4701271
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren