PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Temperaturregelung



RAM
28.10.2011, 18:23
Hallo Leute,

hab mal wieder ein BASCOM-Problem. Und zwar geht es um eine Temperaturregelung mit einem Attiny85. Geregelt werden soll eine Heizfolie, welche über einen MOSFET an OCR0 hängt. Die Ist-Temperatur der Folie wird durch einen LM35 erfasst, welcher 10 mV/°C ausgibt. Die Solltemperatur habe ich in meinem Programm mal mit 35 °C angegeben, davon soll die Isttemperatur abgezogen werden und daraus der Wert für die PWM berechnet werden. Der PWM-Wert soll 255 betragen, also voll heizen, bis die Temperaturdifferenz kleiner als 5 °C wird. Dann woll der PWM-Wert reduziert werden (deshalb auch das Ausgang = Tempdiff * 51). Außerdem habe ich noch einen Unterspannungsalarm mit einer LED eingebaut, welcher beim unterschreiten einer bestimmten Spannung zu leuchten beginnt.
Nun zu meinem Problem: Der Unterspannungsalarm funktioniert, aber bei der Temperaturregelung funktionier irgendetwas nicht. Am PWM-Pin kommt irgendwie nix an. Bin nicht so der BASCOM-Experte, aber vielleicht kann mir ja von euch jemand weiterhelfen.

Hab mal mein Programm für euch angehängt




'Heizfolien-Temperaturregler
'Heizfolie mit FET an OCR1 (PB1)
'Temperatursensor LM35 an ADC2 (PB4)
'Spannungsmessung an ADC3 (PB3)
'Spannungsanzeige LED an PB2



$regfile = "attiny85.dat"
$crystal = 8000000



Dim U As Word 'Spannungsteiler Vcc--> 4,7 k --> ADC3 --> 2,2 k --> Gnd'
Dim Temp As Word 'LM35 an ADC2, gibt 10 mV/°C aus
Dim Tempdiff As Single
Dim Ausgang As Word
Dim Channel As Byte
Channel = 0
Config Portb.2 = Output 'Spannungsanzeige LED
Config Portb.1 = Output 'Ausgang für Heizfolie
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
Const Faktor = 5 / 1023
Do

Start Adc
U = Getadc(3)
Temp = Getadc(2)

Stop Adc

If U < 705 Then 'LED an, wenn Spannung unter 10,8 V
Portb.2 = 1
Else
Portb.2 = 0
End If

Temp = Temp * Faktor 'Umrechnung ADC-wert Temp in °C
Temp = Temp / 0.01

Tempdiff = 35 - Temp 'Berechnung Temperaturdifferenz (Solltemperatur 35 °C)

Ausgang = Tempdiff * 51 'Berechnung des PWM-Ausgangs für die Heizfolie

If Ausgang > 255 Then
Ausgang = 255
End If
If Ausgang < 0 Then
Ausgang = 0
End If
Compare0a = Ausgang


Loop

End

Thegon
28.10.2011, 18:45
Hallo,

also ich habe jetzt im Programm keinen Fehler entdeckt, aber natürlich soll das nichts heißen.
Ich würde raten, einfach einmal compare0a = 127 hineinzuschreiben, als Test, und zu schauen, ob was raus kommt. Wenn nicht, dann muss es an der Hardware liegen (Pin Defekt, oder etwas in der Deklaration vergessen?), wenn schon, dann habe die Variablen nicht die Werte, die sie sollen. Dann muss man sich natürlich wieder fragen warum, eventuell mit der Led etwas herumexperimentieren (z.B. if ausgang > 100 then led = 1, oder so)
bzw. villeicht den ADC in Frage stellen, (überprüfen).

Villeicht findet ja noch jemand einen Fehler, aber es ist sicherlich auch für die Anderen Hilfreich, wenn man Dinge ausschließen kann, also z.B. an der Hardware liegts nicht, weil wenn ich einen Wert direkt zuweise, funktioniert die PWM oder so was. ;-)

Mfg Thegon

MagicWSmoke
28.10.2011, 18:56
Dim Temp As Word
...
Const Faktor = 5 / 1023 ' 0.00488
...
Temp = Temp * Faktor
Integer-Variablen enthalten keine Nachkommastellen, eine Integer-Variable mal Konstante < 0 = 0

Rone
28.10.2011, 19:02
Hallo!

Ausgang & Temp als Single deklarieren könnte Abhilfe schaffen.

MfG
Rone

Edit: zu spät

RAM
28.10.2011, 19:50
habs jetzt mal versucht und temp und ausgang als single deklariert, da bringt mir allerdings der compiler die Fehlermeldung "Line 29 (wo der befehl getadc(2) steht) Source variable does not match the target variable.

Che Guevara
29.10.2011, 00:54
Hallo,

du kannst den Getadc nur in Verbindung mit einem Word nutzen, also:


WordVariable = Getadc(X)
SingleVariable = WordVariable


Gruß
Chris

RAM
29.10.2011, 21:02
So, hab heute nochmal an meinem Code gebaselt. Hab mit den Variablen und dem Timer0 gespielt, und siehe da, es funktioniert!

Hier mein Code:



'Heizfolien-Temperaturregler
'Heizfolie mit FET an OCR0B (PB1)
'Temperatursensor LM35 an ADC2 (PB4)
'Spannungsmessung an ADC3 (PB3)
'Spannungsanzeige LED an PB2

$hwstack = 32
$swstack =16
$framesize = 40


$regfile = "attiny85.dat"
$crystal = 8000000



Dim U As Word 'Spannungsteiler Vcc--> 4,7 k --> ADC3 --> 2,2 k --> Gnd'
Dim Temp As Single
Dim Messwert As Word 'LM35 an ADC2, gibt 10 mV/°C aus
Dim Tempdiff As Single
Dim Ausgang As Single
Dim Channel As Byte
Channel = 0
Config Portb.2 = Output 'Spannungsanzeige LED
Config Portb.1 = Output 'Ausgang für Heizfolie
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Down
Const Faktor = 5 / 1023
Do

Start Adc
U = Getadc(3)
Messwert = Getadc(2)


Stop Adc

Temp = Messwert

If U < 705 Then 'LED an, wenn Spannung unter 10,8 V
Portb.2 = 1
Else
Portb.2 = 0
End If
Temp = Temp * Faktor
'Temp = Messwert * Faktor 'Umrechnung ADC-wert Temp in °C
Temp = Temp / 0.01

Tempdiff = 35 - Temp 'Berechnung Temperaturdifferenz (Solltemperatur 35 °C)

Ausgang = Tempdiff * 51 'Berechnung des PWM-Ausgangs für die Heizfolie

If Ausgang > 255 Then
Ausgang = 255
End If
If Ausgang < 0 Then
Ausgang = 0
End If
Ocr0b = Ausgang


Loop

End


Vielen Dank euch für die Tipps,