Hallo, Wir arbeiten derzeit für die Uni an einem Projekt welches auf eine Lageregelung hinauslaufen soll. Dazu freunden wir uns gerade mit den ADC Funktionen des STMF4 disovery boards an. Testweise soll derzeit nur die Spannung an einem Poti eingelesen werden und ein PWM proportional dazu generiert werden. Die einfach Grundformel dafür war: "pwm=(adcvariable/Max)*100;" wobei pwm und advariable double und Max eine preprozessorkonstante mit dem Bereich des ADCs ist. Das funktioniert zufriedenstellend und deckt den PWM Bereich in etwa komplett ab. Um jetzt den Bereich des PWMs zu verfeinern (eben in den 20-30% in denen auch tatsächlich geregelt werden soll)bzw das poti von linkem bis rechten Anschlag nur zB von 30-50% PWM laufen zu lassen haben wir diese Formel benutzt: "pwm=(((adcvariable/(Max/(rangemax-rangemin)))+rangemin)/Max)*100;" wobei rangemax und rangemin dann eben zB 30 und 50% von "Max" sind. Gebe ich diese Formel nun so in den taschenrechner ein kommt dabei ein Sinnvolles ergebnis heraus. Bzw das exakt gleiche wenn rangemin 0 ist und rangemax = Max In der Praxis hat der µC dann allerdings einen deutlich kleineren Bereich obwohl rangemax=max rangemin=0. Kann mir jemand Tippsgeben was ich hier übersehen könnte bzw. wie die Formel auszusehen hat damit die Rechenschritte im Code korrekt abgearbeitet werden? PS: Gibt es eine Möglichkeit mit Atollic True Studio live Werte zu monitoren? Lg
Hallo Dominic, magst du uns den ADC-Code zeigen? Wie holst du den Wert? Verwendest du Interrupts? Mein erster Gedanke war eine Racecondition zwischen ADC-Wert verarbeiten und ADC-Wert holen. Mit anderen Worten während du den ADC-Wert verarbeitest wird dieser evtl. überschrieben. Gibt es denn Timing kritische Sachen die in deinem Code vorkommen? Also falls Interrupts an sind, schalte diese während der Verarbeitung aus. Junge junge junge :-) man haben wir wenig Infos :-P Gruß public
Dominic W. schrieb: > Gibt es eine Möglichkeit mit Atollic True Studio live Werte zu > monitoren? Ja, schalte doch mal den Debugger ein und halte den Code mit einem Brakepoint vor deiner Berechnung an. Dann kannst Du zweilenweise den Code debuggen... Die vielen Divisionen sind auf einen uC nicht der Hit! Rechnen in Floatingpoint ist OK, wandle Divisionen mit Konstante oder quasikonstanten in Multiplikationen mit dem Kehrwert um. Geschwindigkeitssteigerung um Faktor 20 möglich :). Ich habe keine Ahnung wie schnell die einzelnen Programmteile laufen und was ihr da genau macht. z.B. wenn der AD-Wandler mehrfach neue Ergebnisse liefert und ihr eine sehr langsame PWM Frequenz gewählt hat, so werden sicher Zwischenwerte verschluckt. Baue doch mal einen Zähler, der von 0 bis MAX zählt und schreibe diese Werte in den PWM Block.
Hallo, nehmt doch eine einfachere Formel. pwm = rangemin + (adcvariable/Max)*(rangemax-rangemin); Bei adcvariable = 0 bekommt Ihr pwm = rangemin; Bei adcvariable = Max bekommt Ihr pwm = rangemax; Dazwischen ist die Funktion linear. MfG egonotto
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.