PWM Dutycycle reagiert langsam auf Potiwert

OP
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
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
:
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...
(Firma: matzetronics)
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.