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
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?
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
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
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.
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
Die Formel braucht 2kB, der ATmega8 reicht also. Oder nimm ATmega168 oder 328P. Peter
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; }
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?
> 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);
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.