Programm für Poti Abfrage

Gast #2108702
Lesenswert?

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
Gast #2108718
Lesenswert?

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.
Gast #2125208
Lesenswert?

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?
#2125248
Lesenswert?

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
Gast #2125333
Lesenswert?

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

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