www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Umschreiben einer Formel für den AVR


Autor: Hallo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe hier eine Formel für die Berechnung von Temperaturen, nun 
braüchte ich diese Formel in einer Form sodass ich diese auf dem AVR 
verwenden kann. Ich programmiere in C. Tabellen oder ähnliches kann ich 
nicht verwenden da ich zu viele Variablen habe.

Hier die Formel

TVor = (0,55)*Neigung*((Raumsoll)^(gem.AT/(320-gem. AT*4)))*((-gem. 
AT+20)*2)+Raumsoll+Niveau

Autor: Nico Sch. (nico22)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du nichtmal deinen Namen nennst: Wo liegt denn das Problem genau?

Wie liegen die Werte vor? Als Integer? Was ist die gewünschte 
Genauigkeit?

Autor: Hallo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ein bisschen genauer hätte ich es schon beschreiben können.

Neigung ist eine Komma Zahl von 0 bis 10 mit zwei nachstellen
Raumsoll, gem.AT und Niveau sind 8-bit integer


Mein eigentliches Problem ist die Potenz da weis ich einfach nicht 
weiter das ganze sollte recht Speichersparend auf nem mega8 laufen

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo schrieb:
> Mein eigentliches Problem ist die Potenz da weis ich einfach nicht
> weiter

pow()

Hallo schrieb:
> das ganze sollte recht Speichersparend auf nem mega8 laufen

Nun ja, schreibs einfach hin, und lass den rechnen. Wenn der Speicher 
nicht auseicht, nimm einen pinkompatiblen AVR mit mehr Speicher.

Aber warum willst du denn die 856733. Heizungsregelung selber basteln? 
Da gibts inzwischen so viele davon, die kann man sogar kaufen (oder eins 
der vielen im Netz verfügbaren Beispiele nutzen)

Oliver

Autor: No Name (assi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm ich war die ganze Zeit nicht eingeloggt also ich bin Hallo!

ich bin gerade dabei mir eine Heizkreisregelung mit 2 Kreisen und 
jeweils einem Mischer zu bauen diese gibt es zwar zu kaufen und die 
Auswahl ist auch recht groß, jedoch sind die Preise für so eine 
Steuerung nicht garde niedrig ich wollte zuerst eine Zusatzplatine in 
meinen Holzkessel einbauen jedoch kostet dieses Zusatzmodul um die 500€. 
Universelle Steuerungen sind etwas günstiger aber für 2Kreise sind immer 
noch so 200-400€ fällig.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo schrieb:
> Tabellen oder ähnliches kann ich
> nicht verwenden

es dürfte doch kein Problem sein für den Therm mit gem.AT und Raumsoll 
ein 2-Dimensionales Kennfeld (so 8*8 = 64 Werte = byte oder integer) 
aufzuspannen und die Zwischenwerte linear zu interpolieren.
Ist alles eine Frage der richtigen Skalierung.

Gruß Anja

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Formel braucht 2kB, der ATmega8 reicht also.
Oder nimm ATmega168 oder 328P.


Peter

Autor: No Name (assi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm gut ich hab das nun mal probiert. Nun ist das das erste mal das ich 
mit Kommazahlen im AVR rechnen muss. Irgendwie kommen auch nicht die 
ganz richtigen Werten raus. Ich hab das so gelöst:

double t2 = (0.55)*(1.7)/200;

int fertig = t2;

Das ist jetz nur ein Beispiel da der Code auf nem andern PC ist.

//Edit:

Hab den PC schnell gewechselt hier der Code zur Berechnung
TA = Temp uint8_t
Soll1 = Solltemp uint8_t

#define Niveau 1.7
uint8_t Vorlauf(){

  float T1 = (TA/(320-TA*4));
  T1 = pow(Soll1, T1);

  float fert = (0.55)*Niveau*T1*((20-TA)*2);
  fert = fert + Soll1 +Niveau;

  uint8_t ff = 0;

  ff = runden(fert);


  return ff;



}

Autor: No Name (assi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Die Formel braucht 2kB, der ATmega8 reicht also.
> Oder nimm ATmega168 oder 328P.
>
>
> Peter

Habs gerade nochmal durchprobiert ich krieg das irgendwie nicht mit 2kB 
hin wie machst du das?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Festkommaarithmetik wahrscheinlich.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  float T1 = (TA/(320-TA*4));

Wenn TA ein Ganzzahl-Datentyp ist, diesen zuerst in eine Gleitkommazahl 
casten: float T1 = ((float)TA/(320-TA*4));

Dadurch wird die Berechnung TA/Ganzzahl als Gleitkommarechnung 
durchgeführt.

ZW1 = TA*4;       // Integer ZW1 = Integer TA * Integer 4
ZW2 = 320-ZW1;    // Integer ZW2 = Integer 320 - Integer ZW1
ZW3 = (float) TA; // Float ZW3 = Integer TA in Float gewandelt
ZW4 = ZW3 / ZW2;  // Float ZW4 = Float ZW3 / Integer ZW2
T1 = ZW4;         // Float T1 = Float ZW4

Ohne den Cast als Ganzzahlberechung mit anschliessender Umwandlung in 
den Gleitkomma-Datentyp der Zielvariable T1.

ZW1 = TA*4;       // Integer ZW1 = Integer TA * Integer 4
ZW2 = 320-ZW1;    // Integer ZW2 = Integer 320 - Integer ZW1
ZW3 = (float) TA; // Integer ZW3 = Integer TA nicht in Float 
gewandelt
ZW4 = ZW3 / ZW2;  // Integer ZW4 = Integer ZW3 / Integer ZW2
T1 = ZW4;         // Float T1 = Integer ZW4 in Float gewandelt

Alternativ kannst du auch eine oder beide Konstante(n) als 
Gleitkommazahl angeben.

float T1 = TA/(320.0-TA*4.0);

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2. Beispiel Korrektur:

ZW1 = TA*4;       // Integer ZW1 = Integer TA * Integer 4
ZW2 = 320-ZW1;    // Integer ZW2 = Integer 320 - Integer ZW1
ZW3 = TA;         // Integer ZW3 = Integer TA nicht in Float gewandelt
ZW4 = ZW3 / ZW2;  // Integer ZW4 = Integer ZW3 / Integer ZW2
T1 = ZW4;         // Float T1 = Integer ZW4 in Float gewandelt

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
No Name schrieb:
> Habs gerade nochmal durchprobiert ich krieg das irgendwie nicht mit 2kB
> hin wie machst du das?

Ich hoff mal, ich hab beim Umwandeln in C keinen Fehler gemacht:

#include <math.h>

float TVor, Neigung, Raumsoll, gem_AT, Niveau;

void test()
{
  TVor = (0.55)*Neigung*
  ( pow(Raumsoll,(gem_AT/(320.0-gem_AT*4))) )*
  ((-gem_AT+20.0)*2)+Raumsoll+Niveau;
}



Peter

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man so ein Projekt nur mit einem Mega8 beginnen ? Ist die 
Ersparnis derart gross, dass sich die Uebung lohnt ?

Fuer kleine Stueckzahlen, wenn ich maximale Flexibilitaet brauche, 
verwende ich den Mega644P, der hat sogar zwei Schnittstellen, eine davon 
kann ich dan zum debuggen verwenden. Den Mehrpreis hab ich nach ein paar 
eingesparten Debugminuten wieder drin.

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.