Forum: Mikrocontroller und Digitale Elektronik Programm für Poti Abfrage


von Markus (Gast)


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

von Thomas E. (thomase)


Lesenswert?

Das musst du ausrechnen:

ALFA = ((ALFAmax - ALFAmin) / ADCmax) * ADC + ALFAmin

mfg.

von Thomas E. (thomase)


Lesenswert?

Thomas Eckmann schrieb:
> ALFA = ((ALFAmax - ALFAmin) / ADCmax) * ADC + ALFAmin

Nee, andersrum

ALFA = ALFAmax - ((ALFAmax - ALFAmin) / ADCmax) * ADC

mfg.

von willibald (Gast)


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.

von Franz (Gast)


Lesenswert?

while(1)
{
ALFA=62500-10*(ADC_Wert-1);
}

Müsste hinhauen
Gruß

von Markus (Gast)


Lesenswert?

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!

von Markus (Gast)


Lesenswert?

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!

von Markus (Gast)


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?

von Karl H. (kbuchegg)


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

von Helfer (Gast)


Lesenswert?

Achtung!

> if(ADC_Wert=1)
             ^
Das ist der Zuweisungsoperator = und nicht der Vergleichsoperator ==

von Markus (Gast)


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

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
Noch kein Account? Hier anmelden.