Hallo, ich habe eine Platine erstellt, mit der es möglich ist mit Spannungsfrequenz-Steuerung eine 1~ Asynchronmaschine (Lüfter) zu regeln. Klappt auch alles wunderbar, nur will ich nun die Drehzahl per Poti regeln. Das heißt, wenn sich der ADC_Wert ändert, soll sich auch der ALFA Wert ändern. ALFA startet bei mir bspw. bei 62500 für 230V (ADC_Wert=1) und endet bei 53300 für 115V (ADC_Wert=1024). Jetzt will ich aber nicht immer schreiben müssen: if(ADC_Wert=1) {ALFA=62500} if(ADC_Wert=2) {ALFA=62490} if(ADC_Wert=3) {ALFA=62480} .... if(ADC_Wert=1024) {ALFA=53300} ALFA könnte man ja dekrementieren, aber auf den ADC_Wert habe ich ja keinen Einfluss, da er extern vom Poti vorgegeben wird. Jemand ne Idee wie man das Elegant lösen könnte? Ich befürchte, man muss mit KLASSEN arbeiten. Bin aber im Programmieren mit C++ ne totale Niete. Wäre über jede Hilfe dankbar. Gruß Markus
Das musst du ausrechnen: ALFA = ((ALFAmax - ALFAmin) / ADCmax) * ADC + ALFAmin mfg.
Thomas Eckmann schrieb: > ALFA = ((ALFAmax - ALFAmin) / ADCmax) * ADC + ALFAmin Nee, andersrum ALFA = ALFAmax - ((ALFAmax - ALFAmin) / ADCmax) * ADC mfg.
Markus schrieb: > ALFA startet bei mir bspw. bei 62500 für 230V (ADC_Wert=1) und endet bei > 53300 für 115V (ADC_Wert=1024). Hilf mir auf die Sprünge: Was bedeutet ALFA? > Jetzt will ich aber nicht immer schreiben müssen: > > if(ADC_Wert=1) > {ALFA=62500} > > if(ADC_Wert=2) > {ALFA=62490} > > if(ADC_Wert=3) > {ALFA=62480} > > .... > > if(ADC_Wert=1024) > {ALFA=53300} Wenn es eine einfache Rechenvorschrift gibt, kannst du ALFA aus ADC berechnen. Ansonsten vielleicht in einer Tabelle speichern. Falls dein Controller genug Speicher hat - eine Tabelle mit 1024 Einträgen ist nicht gerade klein. Klassen (im Sinne von C++-Klassen) braucht man dafür nicht unbedingt. Die Werte in Klassen einzuteilen (und damit die Tabelle kleiner zu machen) könnte eine gute Idee sein.
Ja, super! Vom Aufbau kommt mir die Formel auch irgendwie bekannt vor... Wär ich aber jetzt nicht mehr von allein drauf gekommen! Also nochmal vielen Dank!
Hui, schon wieder so viele Antworten. Danke... Aber der erste Beitrag von Thomas hat mir sehr geholfen. Und mein Problem gelöst. Danke trotzdem an alle!
Ich nochmal. Die Formel: ALFA= (((ALFAmax50 - ALFAmin50)/1024) * ADC_Wert + ALFAmin50); funktioniert nur, wenn ich den ADC_Wert von 0-1024 in einer einzigen "If-Abfrage" laufen lasse. Wie aber mache ich es in meinem folgenden Fall? if (!(PINA & (1<<PA1))) //if S2=ON { if ((ADC_Wert > 10) && (ADC_Wert <= 170)) { ALFA= ((ALFAmax16 - ALFAmin16)/1024) * ADC_Wert + ALFAmin16; zuendmuster = 0; } if ((ADC_Wert > 170) && (ADC_Wert <= 400)) { ALFA= ((ALFAmax25 - ALFAmin25)/1024) * ADC_Wert + ALFAmin25; zuendmuster = 1; } if ((ADC_Wert > 400) && (ADC_Wert <= 1000)) { ALFA= (((ALFAmax50 - ALFAmin50)/1024) * ADC_Wert + ALFAmin50); zuendmuster = 2; } ALFA kann dann nie AFLFAmin werden. Jemand ne Idee?
Markus schrieb: > ALFA kann dann nie AFLFAmin werden. Natürlich kann es. > Jemand ne Idee? Das sind lineare Gleichungen. Die Koeffizienten korrekt bestimmen und du kannst jede Gerade so festlegen, dass du jeden gewünschten Anfangspunkt und jeden gewünschten Endpunkt bekommst und dazwischen linear interpoliert wird. In jedem Abschnitt hast du eine Gerade Alfa = k_Abschnitt * ADC + d_Abschnitt Für 2 Wertepärchen kennst du die Werte, d.h. du hast 2 Gleichungen in 2 Unbekannten (nämlich k_Abschnitt und d_Abschnitt) und das lässt sich lösen. Mathe: 11. oder 12. Klasse
Achtung!
> if(ADC_Wert=1)
^
Das ist der Zuweisungsoperator = und nicht der Vergleichsoperator ==
Ja, das mit dem Vergleichsoperator weiß ich. Im Programm ist es auch richtig, so wie im letzten Beitrag von mir. Hier die Lösung: y=m*x+b y = ALFA m = (ALFAmax-ALFAmin)/(ADCmax-ADCmin) x = ADC_Wert-ADCmin b = ALFAmin Danke für den Tipp mit der Geraden...
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.