Hier jetzt eine Beschreibung eines Windmessers mit CAN-Bus-Anschluss. Windsensoren gibt es wie Sand am Meer, aber alle haben einen oder mehrere Nachteile. Entweder sind sie preiswert, dann ist meistens die Mechanik schlecht, oder die Elektronik oder beides. Oder sie sind mechanisch und elektronisch hervorragend, kosten dann aber weit über 500 Euro - und haben schon lange keinen CAN-Bus Ausgang. Aber warum unbedingt CAN-Bus ? Im Rahmen der Hausautomatisierung hatte ich sowieso schon den CAN-Bus für Jalousien, Rolladen, Heizung etc. verwendet und auch im Haus verlegt (siehe auch ). Der 1-Wire-Bus (den hatte ich auch mal evaluiert) war schlichtweg zu störanfällig bei den im Haus vorkommenden Entfernungen.

Hintergrund für das hier beschriebene Projekt war ein Geschenk, welches ich von einem Bekannten bekommen hatte: Eine Dallas 1-Wire Weather Station. Diese war etwa 15 Jahre alt und enthielt neben der Mechanik eine Elektronik auf Basis der 1-Wire Chips von Dallas. Mit Reed-Kontakten wurde die Windrichtung sowie die Windgeschwindigkeit gemessen. Um diese dann per 1-Wire/RS232 Adapter mit einem PC einzulesen. Die Mechanik war schon ganz brauchbar, wenngleich auch recht amerikatypisch  - robust - aufgebaut.

Aber der Wind ist dort sicher auch häufiger stärker als in unseren Breiten. Den hässlichen Dallas 1-Wire Aufkleber habe ich entfernt, weil jetzt ja kein einziger Dallas Chip mehr drin ist. Ausser dem Kunststoff und den Kugellagern habe ich nichts mehr verwendet.

Das obige Bild zeigt die Orginalplatine von Dallas. Man sieht sehr schön die Reed-Kontakte...und das hat wohl mal funktioniert.. ;-)

Also hab ich die Mechanik behalten und die Elektronik eben neu entwickelt. Basis ist der Mikrokontroller ATMEGA644(P) oder AU mit separatem Microchip CAN-Controller für den CAN-Bus und RS232-Ein/Ausgang zum Einstellen und Debuggen. Programmiert ist das Ganze in der Programmiersprache C mit GCC (WinAVR) übersetzt. Die Programmgröße hätte auch locker in eine 16k-Flash-CPU gepasst, aber wie gesagt der ATMEGA 644 ist mein Universal-Chip für alle Fälle (aber jetzt gibts ja den STM32 ...;-) ); der reicht auch für recht große Projekte, und man kann viele Module wiederverwerten, da man nicht auf Speicher achten muss ;-)

Hier sieht man die neue Platine im alten Dallas-Gehäuse. Die linke Welle misst den Drehwinkel, die rechte die Umdrehungen pro Zeit.

Die Platine hat fast die gleichen Maße wie die orginale Dallas-Platine, jedoch habe ich den freien Platz im Befestigungsbereich ebenfalls ausgenutzt. Dort sind jetzt alle Anschlüsse wie Stromversorgung, CAN-Bus sowie zum debuggen RS232-Ausgang und ISP-Anschluß zum Flashen des Programms. Man benötigt später nur noch 4 Adern (CAN+ CAN- sowie 9-12V DC und GND) in der Zuleitung.

Was wird jetzt wie gemessen ?

Windgeschwindigkeit

Die Windgeschwindigkeit wird mit dem Schalenkreuzanemometer gemessen. Das Schalenkreuz dreht sich in Abhängigkeit der Windgeschwindigkeit eine bestimmte Anzahl pro Zeiteinheit. Die Umdrehung wird über eine Welle ins Innere geleitet. Dort ist ein kleiner Magnet auf einem Ausleger angebracht der an einem Hall-Sensor "vorbeifliegt". Die Auswahl eines geeigneten Hallsensors war garnicht so einfach wie zunächst gedacht, denn: Viele dienen nur als Abstands- oder Wegsensor, und schalten dann einen Ausgang. Hauptproblem dabei ist, dass manche dieser Sensoren recht langsam ansprechen (50ms), und für die UPM oder besser UPS (Umdrehungen pro Sekunde) sind sie viiiiel zu langsam. Mit dem AH183 von Diodes.inc (https://www.diodes.com/datasheets/AH182_AH183.pdf) habe ich aber einen Sensor gefunden der mit 200us Ansprechzeit gut und ausreichend schnell funktioniert. Der Sensor ist auf dem Aussenradius des Drehgebers angebracht. Im Bild oben sieht man den winzigen Quadermagnet (1.5*1.5*2mm). Diesen musste ich statt der orginalen Dallas-Magnete nutzen, da diese viel zu stark waren. Diese haben dann meinen Drehwinkelsensor - für die Windrichtung - beeinflusst.

Den Magnet habe ich mit Heisskleber an Stelle der orginalen Magnete eingeklebt.

Windrichtung

Die Windrichtung grundsätzlich zu messen ist eigentlich ganz einfach. Man misst den Winkel den die Windfahne aufgrund der Windrichtung einnimmt. Nur wie misst man den Winkel ? Zunächst dachte ich, ich ersetze einfach die Reedkontakte ebenfalls durch "moderne" Hallsensoren. Entweder 8 oder 16 Sensoren, je nach Auflösung. Gut der ATMEGA 644 hat genug Eingänge, und die Hallsensoren sind auch preiswert.

Dies hatte ich auch schon weitgehend konstruiert, jedoch gefiel mir überhaupt nicht, dass man dann in Software herausfinden muss ob die Windfahne quasi zwischen zwei Positionen steht. Auch war das Routing auf der Platine (sofern man auf einer Seite bleiben möchte) recht schwierig, von den vielen Bauteilen ganz zu schweigen.

Nun mit etwas Recherche habe ich einen schönen Sensor gefunden der sehr elegant "magnetisch" direkt den Winkel messen und ausgeben kann, und zwar mit nahezu beliebiger Gradauflösung, und das auch noch schnell.

Der Sensor AS5040 kommt von Austria Microsystems und liefert 10 Bit Auflösung, dass sind über 360 Grad 1024 Teilstriche - also ca 0.35 Grad Auflösung. Für eine Windfahne zumindest sicher ausreichend.

Im nachfolgenden Bild sieht man den Sensor-Chip in der Mitte der Platine sowie den Magnet mit Schrumpfschlauch auf der Welle befestigt.

 

Das Hauptproblem hier ist, das man für den Sensor sogenannte Diametral-Magnete benötigt, oder einfach einen "normalen" Magnet entsprechend ausgerichtet auf der Welle befestigt. Das Prinzip findet sich schön erklärt auf der Austria Microsystems-Webseite.

Elektronik

Windgeschwindigkeit wir über die ICP (Input Capture Interrupt Pin) Funktion des ATMEGA 644 gemessen. Das bedeutet per Hardware wird die genaue Zeit beim Eingang eines Pegelwechsels erfasst. Dies funktioniert auch wenn die CPU irgendetwas anderes macht, z.B. weil sie in einem anderen Interupt hängt. Dies ist eine Spezialfunktion der meisten ATMEGA-Chips, und funktioniert nur auf dem PD6 Eingang. Also Achtung wenn jemand das nachbauen will.

Hierzu sind die folgenden ATMEGA 644 Registereinstellungen nötig:

TCCR1B = (1<<ICES1)  | (1<<CS12) ; // Input Capture Edge, 256 Prescaler
TIMSK1 = (1<<ICIE1) | (1<<TOIE1); // Activate Interrupts for Capture + Overflow

diese Routine:

ISR( TIMER1_OVF_vect )
{
TimerOverflows++;
}

und diese:

ISR( TIMER1_CAPT_vect )
{
LastOverFlows=TimerOverflows;
TimerOverflows=0;
StopTimer = StartTimer;
StartTimer = ICR1;
LastTime=StartTimer-StopTimer;;
}

erfasst den Drehimpuls und verabeitet Diesen. Die Anzahl der Impulse pro Zeiteinheit ist dann ein Maß für die Windgeschwindigkeit.

Der Drehwinkel wird über den AS5040 erfasst und per SSI in den ATMEGA 644 übertragen. Da ich keinen fertigen Code oder anderes Verwertbares gefunden hatte, habe ich das halt selbst programmiert (war aber auch einfach). Ich hatte Wert darauf gelegt, die Messung und Kommunikation mit dem Magnetsensor ohne Interrupt oder Timer zu realisieren, damit die für andere Funktionen frei bleiben.

Die Messung und die Übertragung in den Prozesor dauert ca. 50 us und ist schnell genug für die Messung der Windrichtung.

Nachfolgend finden sich die Pläne und die Basissoftware: