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


von Hallo (Gast)


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

von Nico S. (nico22)


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?

von Hallo (Gast)


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

von Oliver (Gast)


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

von No N. (assi)


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.

von Anja (Gast)


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

von Peter D. (peda)


Lesenswert?

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


Peter

von No N. (assi)


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;



}

von No N. (assi)


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?

von Falk B. (falk)


Lesenswert?

Mit Festkommaarithmetik wahrscheinlich.

von Helfer (Gast)


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);

von Helfer (Gast)


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

von Peter D. (peda)


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:
1
#include <math.h>
2
3
float TVor, Neigung, Raumsoll, gem_AT, Niveau;
4
5
void test()
6
{
7
  TVor = (0.55)*Neigung*
8
  ( pow(Raumsoll,(gem_AT/(320.0-gem_AT*4))) )*
9
  ((-gem_AT+20.0)*2)+Raumsoll+Niveau;
10
}



Peter

von Purzel H. (hacky)


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.

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.