mikrocontroller.net

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


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das musst du ausrechnen:

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

mfg.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

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

Nee, andersrum

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

mfg.

Autor: willibald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(1)
{
ALFA=62500-10*(ADC_Wert-1);
}

Müsste hinhauen
Gruß

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achtung!

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.