Forum: Mikrocontroller und Digitale Elektronik Griffheizungssteuerung mit Atmega 328p (Arduino)


von Ralf B. (eaglebiker)


Lesenswert?

Hallo ich bin neu hier und habe auch schon gleich ein kleines Anligen.

Ich wollte mir für meinen "Gonzo" (BMW R 1100GS) 
Microcontollergesteuerte Griffheizung bauen da siese schon Serienmässig 
an dem Fahrzeug montiert ist, kam mir halt der Gedanke diese über einen 
Atmega 328 P zu regeln
ich verwende zum testen folgende Bauteile

Arduino SMD Version R3
Buz11
Tempsensor Onewire DS1820
einen Opamp LM358
2 Taster für Temp + und Temp -

Das Problem ist derzeit folgendes
der Buz11 wird tierisch Heiß troz Kühlkörper
der Heizgriff habe noch einen als Ersatz hier liegen den ich auch zum 
testen nehme hat eine Leistungsaufnahme von gut 2 Ampere

Über die Taster kann ich die Soll Temp einstellen welche eigentlich in 
5° schritten erfolgen sollte allerdingst weiss ich nicht wo ich im 
Quellcode die Taster entprellen kann
die ist und Solltemp wird mir derzeit übern Seriellen Monitor ausgegeben
was ich gerne über ein Lcd machen würde

Zumal greift die PWM nicht bei erreichter Temperatur

kann mir da bitte einer Helfen
1
#include <OneWire.h>
2
// Definition of interrupt names
3
#include < avr/io.h >
4
// ISR interrupt service routine
5
#include < avr/interrupt.h >
6
7
//Ab hier anpassen
8
 
9
int Heizgriff = 5;
10
int TasterPlus = 2;  // INT0-Pin
11
int TasterMinus = 3;   // INT1-Pin
12
13
volatile byte SollTemperatur = 30;
14
15
volatile byte TasterPlusActStatus = LOW;
16
volatile byte TasterPlusOldStatus = LOW;
17
volatile byte TasterMinusActStatus = LOW;
18
volatile byte TasterMinusOldStatus = LOW;
19
20
21
//Temperatur Sensoren
22
OneWire  ds(13);                        //Pin an dem die Datenleitung des ds18s20 hängt
23
#define MAX_DS1820_SENSORS 1
24
byte addr[MAX_DS1820_SENSORS][8];
25
26
int IstTemperatur[MAX_DS1820_SENSORS];
27
28
#define DEBUG_MODE true                 //Debug Modus gibt Werte im Terminal aus (Serial)
29
//Bis hier anpassen
30
 
31
// Install the interrupt routine.
32
void TasterPlusInterrupt( void ) {
33
    // check the value again - since it takes some time to
34
  // activate the interrupt routine, we get a clear signal.
35
  TasterPlusActStatus = digitalRead(TasterPlus);
36
  if (TasterPlusActStatus == HIGH && TasterPlusOldStatus == LOW )
37
  {
38
    if ( SollTemperatur < 50 )
39
      SollTemperatur += 5;
40
  }
41
  TasterPlusOldStatus = TasterPlusActStatus;      
42
}
43
44
// Install the interrupt routine.
45
void TasterMinusInterrupt( void ) {
46
  // check the value again - since it takes some time to
47
  // activate the interrupt routine, we get a clear signal.
48
  TasterMinusActStatus = digitalRead(TasterMinus);
49
  if (TasterMinusActStatus == HIGH && TasterMinusOldStatus == LOW )
50
  {
51
    if ( SollTemperatur > 20 )
52
      SollTemperatur -= 5;
53
  }
54
  TasterMinusOldStatus = TasterMinusActStatus;      
55
}
56
57
void setup(void)
58
{
59
  Serial.begin(9600); 
60
  byte i;
61
 
62
   pinMode(Heizgriff, OUTPUT);   // sets the pin as output
63
64
   pinMode(TasterPlus, INPUT);   // sets the pin as input
65
   digitalWrite(TasterPlus, HIGH); // internen Pull-Up-Widerstand einschalten
66
   pinMode(TasterMinus, INPUT);   // sets the pin as input
67
   digitalWrite(TasterMinus, HIGH);  // internen Pull-Up-Widerstand einschalten
68
69
   attachInterrupt( 0, TasterPlusInterrupt, CHANGE ); // TasterPlus Interrupt aktivieren auf beide Flanken
70
   attachInterrupt( 1, TasterMinusInterrupt, CHANGE ); // TasterMinus Interrupt aktivieren auf beide Flanken
71
  
72
  //Anzahl der angeschlossenen Sensoren durchgehen
73
  for ( i = 0; i < MAX_DS1820_SENSORS; i++)
74
  {
75
    if (!ds.search(addr[i]))
76
    {
77
      ds.reset_search();
78
      delay(250);
79
      return;
80
    }
81
  }
82
}
83
 
84
void loop()
85
{ 
86
char buf[30];
87
88
  readTemperature();
89
90
  sprintf( buf, "Soll %d Ist %d\n", SollTemperatur, IstTemperatur[ 0 ] );
91
   Serial.print(buf);
92
   
93
  analogWrite(Heizgriff, 128);
94
  
95
//  analogWrite(Heizgriff, val / 4);
96
}
97
 
98
void readTemperature( void )
99
{
100
  int HighByte, LowByte, TReading, SignBit, Tc_100, Temp, Fract;
101
  char buf[20];
102
 
103
  byte i, sensor;
104
  byte present = 0;
105
  byte data[12];
106
 
107
  for (sensor=0; sensor<MAX_DS1820_SENSORS; sensor++)
108
  {
109
    if (OneWire::crc8( addr[sensor], 7) != addr[sensor][7])
110
    {
111
      return;
112
    }
113
 
114
    if ( addr[sensor][0] != 0x10)
115
    {
116
      return;
117
    }
118
 
119
    ds.reset();
120
    ds.select(addr[sensor]);
121
    ds.write(0x44,1);         // start conversion, with parasite power on at the end
122
 
123
    delay(1000);
124
 
125
    present = ds.reset();
126
    ds.select(addr[sensor]);   
127
    ds.write(0xBE);         // Read Scratchpad
128
 
129
    for (i = 0; i < 9; i++)
130
    {
131
      data[i] = ds.read();
132
    }
133
 
134
    LowByte = data[0];
135
    HighByte = data[1];
136
    TReading = (HighByte << 8) + LowByte;
137
    SignBit = TReading & 0x8000;
138
    if (SignBit) // negative
139
    {
140
      TReading = (TReading ^ 0xffff) + 1;
141
    }
142
    Tc_100 = (TReading*100/2);   
143
 
144
    Temp = Tc_100 / 100;
145
    IstTemperatur[ sensor ] = Temp;
146
   }
147
}

Danke für eure Mühe
Gruss Ralf

von Kanonier (Gast)


Lesenswert?

Dein Ehrgeiz in Ehren, aber eine banale Griffheizung kann man auch ohne 
jegliche MikroControllertechnik regeln.

Kanone -> Spatz

von Ralf B. (eaglebiker)


Lesenswert?

Hmm ok dann erkläre mir bitte wie

zumal ich nicht wirklich lust habe währent der fahrt an nen poti zu 
drehen wollte das halt mit tastern machen

die entsprechen am Lenker angeortnet werden

von P. W. (wassipaul)


Lesenswert?

Soweit ich weiß ist bei der BMW 1100 die Griffheizung mit einem 
zweistufigen Schalter ausgeführt. Somit kann ohne Poti-Herumfummelei die 
Leistung in zwei (drei=aus) Stufen geregelt werden.
Vermutlich werden je nach Schalterstellung einfach die beiden Griffe in 
Serie oder parallel verschaltet.

von Ralf B. (eaglebiker)


Lesenswert?

Die Heizung wird in der ersten Stufe über ein Widerstandskabel runter 
geregelt da aber dieses Defekt ist kann ich die Heizung nur in Stufe 2 
betreiben und da ich mir nicht wirklich die Finger verkokeln wollte 
wollte ich sie halt über einen Microcontroller steuern welcher nicht nur 
die aufgabe hat die Heizung zu Steuern er soll halt auch die 
Steuergeräte auslesen zb ABS und Motorsteuergerät und mir halt das im 
Fehlerfall auf einem Display ausgeben

also kurzgesagt eine eierlegende wollmilchsau :-)
Das auslesen der Steuergeräte wollte ich dann über die Analogen eingänge 
des ATmegas machen

von Joe J. (neutrino)


Lesenswert?

Moin,

wie hast du den armen BUZ11 angesteuert, dass er so heiß wird? 
Schaltplan? Und wozu der OP?

Gruß, Joe

von Ralf B. (eaglebiker)


Lesenswert?

Habe den Buz11 über einen Digitalen ausgang vom Arduino angesteuert
nach dem ich die schaltung nochmals kontrolliert habe und auch keinen 
fehler gefunden habe habe ich noch mal eingeschaltet und da wurde er 
nicht mehr heiss
wollte halt mit dem OP die 12v auf das Gate legen da ich halt erst 
dachte das die 5v nicht ausreichen würden das er voll durchsteuert

als vorwiderstand habe ich einen 82ohm wiederstand genommen

ps der Buz tut noch seinen dienst

von spontan (Gast)


Lesenswert?

Durchschaus grad nicht. Sind noch Fragen offen?
Woher kommt der Quellcode? Von Dir?

von Ralf B. (eaglebiker)


Lesenswert?

spontan schrieb:
> Durchschaus grad nicht. Sind noch Fragen offen?
> Woher kommt der Quellcode? Von Dir?

Habe den buz11 in einer anderen schaltung getestet von daher kann ich 
davon ausgehen das er noch funzt

der quellcode ist nicht komplett von mir ein bekannter hat ihn 
geschrieben ist auch noch nicht ganz fertig wollte da halt drann weiter 
machen
nur solange ich das nicht mit den tastern im griff habe drehe ich mich 
halt im kreis

von Dominik S. (dasd)


Lesenswert?

Ralf B. schrieb:
> Zumal greift die PWM nicht bei erreichter Temperatur

Dein Problem besteht scheinbar darin, dass du leider keine Ahnung von 
dem hast was du da gerade tust...

Schau dir doch den Code an - selbstverständlich tut die PWM momentan 
noch nicht viel.

von Ralf B. (eaglebiker)


Lesenswert?

Ralf B. schrieb:
> der quellcode ist nicht komplett von mir ein bekannter hat ihn
> geschrieben ist auch noch nicht ganz fertig wollte da halt drann weiter
> machen
> nur solange ich das nicht mit den tastern im griff habe drehe ich mich
> halt im kreis

Sicherlich hab ich keine ahnung darum bin ich ja hier in der hoffnung 
das mir hier ggf geholfen wird aber sich tolle ratschläge anhören kann 
ich mir in anderen foren auch

mein Hauptproblem liegt erstmal bei den tastern die ich halt software 
mäßig enttprellen wollte
habe was von einer include gelesen die sich Bouncer nennt nur weiss ich 
nicht wirklich wo ich sie in den quellcode einfügen soll btw was ich 
einfügen muss
so wenn ich das habe dann kann ich auch weiter machen

P.S mein bekannter ist derzeit im urlaub und da ich halt an der 
schaltung weitermachen wollte frage ich halt hier erfahrende die mir 
weiterhelfen könnten

von spontan (Gast)


Lesenswert?

Klingt halt leider so
- als ob Du nicht die geringste Ahnung hast, wie der Quellcode 
funktioniert
- daß Du auch gar keinen Versuch unternimmst was zu verstehen
- daß Du jemanden suchst, der Dir das Projekt erstellt

Daß der Quellcode von einem Bekannten stammt, der grad in Urlaub ist, 
klingt sowas von umwahrscheinlich.

Wieso werden die Taster im Interrupt abgefragt?
Wieso hat Dein Bekannter das so programmiert?

Tasten raus aus dem Interrupt. Die Entprellroutinen hier aus dem Forum 
benutzen.

Oder warten auf den Bekannten. Ist für Dich eh der schnellste Weg.

von Jürgen S. (jurs)


Lesenswert?

Ralf B. schrieb:
> Über die Taster kann ich die Soll Temp einstellen welche eigentlich in
> 5° schritten erfolgen sollte allerdingst weiss ich nicht wo ich im
> Quellcode die Taster entprellen kann

Ich habe Deine Interrupt-Routine mal umgeschrieben.
1
#define EntprellZeitMillis 2
2
3
long Minus_pressed_time;
4
5
void TasterMinusInterrupt( void ) 
6
{
7
  if (digitalRead(TasterMinus)==HIGH) // Interrupt auf HIGH
8
    Minus_pressed_time=millis();  // Zeit merken, wann Taste gedrückt
9
  else // Interrupt auf LOW, Taste wurde losgelassen
10
  {
11
    // Prüfen ob sie lange genug gedrückt war
12
    if (millis()-Minus_pressed_time>EntprellZeitMillis)
13
    {
14
      if (SollTemperatur>=25) SollTemperatur-=5;
15
      else SollTemperatur=20;
16
    }  
17
  }
18
}

von lüsterklemme (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

Ralf B. schrieb:
> einen Opamp LM358

Wozu soll der gut sein?
Zeig mal den Schaltplan.

Ralf B. schrieb:
> der Buz11 wird tierisch Heiß troz Kühlkörper

Ein FET braucht immer einen Pulldown am Gate!
Sonst spinnt er, wenn der MC im Reset ist (beim Einschalten, 
Programmieren, Unterspannung).

Einen Kühlkörper braucht er hingegen nicht. Es sei denn, Du nimmst ne 
abartig hohe PWM-Frequenz.


Peter

von H.Joachim S. (crazyhorse)


Lesenswert?

Naja, bei 5V Gatespannung ist der BUZ11 nicht unbedingt die 1.Wahl. 
Kommt natürlich auch auf den Drainstrom an.

von Peter D. (peda)


Lesenswert?

H.joachim Seifert schrieb:
> Naja, bei 5V Gatespannung ist der BUZ11 nicht unbedingt die 1.Wahl.

Ich hab jetzt nicht ins Datenblatt geschaut.
Man sollte natürlich einen Logic-Level FET nehmen (Schwellspannung 
1..2V).


Peter

von Udo S. (urschmitt)


Lesenswert?

Ralf B. schrieb:
> wollte ich sie halt über einen Microcontroller steuern welcher nicht nur
> die aufgabe hat die Heizung zu Steuern er soll halt auch die
> Steuergeräte auslesen zb ABS und Motorsteuergerät und mir halt das im
> Fehlerfall auf einem Display ausgeben
> ...
> Das auslesen der Steuergeräte wollte ich dann über die Analogen eingänge
> des ATmegas machen

Du willst ABS und Motorsteuergerät(e) über analoge Arduino Eingänge 
auslesen?
Ich weis ja nicht, aber ich glaube du solltest erst mal ganz langsam 
anfangen, und nicht gleich an Steuergeräten eines 100 ps Mopeds!

von Udo S. (urschmitt)


Lesenswert?

Peter Dannegger schrieb:
> Ich hab jetzt nicht ins Datenblatt geschaut.

Na ja wenn ich das alte Teil richtig in Erinnerung habe, dann fängt er 
zwischen 3 und 4 V Ugs an, seinen Hintern von der Klobrille zu nehmen. 
Richtig durchgesteuert ist er so ab 8V.
Aber der TO hat ja 12V zur Verfügung. Und bei 1 - 2 nF Gatekapazität 
würde ein kleiner Treiber eh gut tun, wobei man für die 
Temperaturregelung im Herzbereich auch darauf verzichten könnte.

von Ralf B. (eaglebiker)


Angehängte Dateien:

Lesenswert?

Hallo sorry das ich meinen alten Beitrag nochmal ausbuddel
aber nach langem Überlegen und probieren habe ich es hinbekommen die 
Steuerung soweit fertig zu stellen

hier mal das ergebnis

http://www.youtube.com/watch?v=n4lejTPeAdU

anbei noch ein paar bilder

Die temperatureinstellung erfolgt mittels Drehencoder

Das Heizgriffsymbpl habe ich Selber Programmiert

MfG Ralf

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.