DREHZAHLMESSER MIT PICAXE

Für mein neustes ZwischendurchvomU-BootBauabhaltprojekt, eine CNC Drehbank, benötigte ich auf die Schnelle einen kleinen Drehzahlmesser um mir die Drehzahl der Spindel anzeigen zu lassen.

Bei der Realisierung mit einem PICAXE stellte sich heraus, dass diese Aufgabe erfreulich leicht zu realisieren war. Fester Bestandteil der PICAXE Software ist ein Befehl namens "count". Dieser wird benutzt, um die Impulse an einem Eingang innerhalb einer bestimmten Zeit zu zählen. Diese Messzeit ist einstellbar. Nun muss dieser Wert ja auch noch irgendwie optisch dargestellt werden. Für den ersten Prototypen habe ich ein 2x8 LCD Display benutzt, welches über die serielle Schnittstelle angesprochen wurde. Üblicherweise nimmt man für sowas aber 7 Segment Anzeigen die in der verräucherten Werkstatt durch ihr Eigenleuchten noch gut ablesbar sind, aber genau diese Dinger sind nicht einfach anzusprechen. Im Grunde bestehen diese 7 Segment Anzeigen aus 7 LED Balken plus einem Dezimalpunkt und selbstverständlich gibt es da auch fertige Ansteuerchips zu, aber auch die müssen angesteuert werden. Mit ein wenig Recherche fand ich die Lösung des Problems im Internet. Es gibt für kleine Kohle fertige 4 stellige 7 Segmentanzeigen die per I2C Protokoll angesprochen werden. Der 08M2 PICAXE hat Ausgänge mit denen die I2C Schnittstelle angesprochen werden kann, also wurde die Platine bestellt. Nebenbei fand ich bei der ganzen Sucherei auch gleich fertige Baugruppen chinesischer Herkunft die für weniger Geld Umdrehungen zählen konnten, also eigentlich perfekt und fertig und billiger, aber nun wollte ich das auch selbst fertig stellen.

Nachdem die bestellte Platine eingetroffen war wurde das LCD Display des Prototyps demontiert und gegen die neue 7 Segment Anzeige getauscht. Weiterhin wurde das angefangene Zählprogramm geändert, um eine I2C Ausgaberoutine erweitert und fertig war die Kiste nachdem kleine Fehler beseitigt wurden. 

Als Impulsaufnehmer eignet eigentlich alles Mögliche. Ein Taster, ein Microschalter, eine Gabellichtschranke oder wie in meinem Fall, ein Hallsensor aus einer alten Tauchtanksteuerung. Der Hallsensor wird von einem Magnetpärchen geschaltet, welches auf entgegengesetzten Seiten der Spindelwelle der Drehbank befestigt ist. Ein Nordpol schaltet den Hallsensor ein, der Südpol des zweiten Magneten schaltet den Sensor aus. So gibt es einen Impuls pro Umdrehung, bei 3000 UpM sind das gerade mal 50 Hertz. Kein Problem für den Hallsensor.

 

Das Programm

Die Software initalisiert beim Start ein paar Variablen und gibt auf dem seriellen Terminal einen Erkennungsstring aus sodass der Inhalt eines bespielten Chips leicht erkannt werden kann. Anschliessend wird der Zähleingang mit besagtem "count" Befehl 1000 ms lang abgefragt und daraufhin das Ergebnis mit 60 multipliziert um auf Umdrehungen pro Minute zu kommen.

Zu guter letzt wird das Ergebnis auf die 4 Stellen des Displays auseinandergerechnet und über die I2C Schnittstelle ausgegeben. Dazu sind noch einige Steuerbefehle notwendig die ich im Internet gefunden habe. Diese stehen in den Klammern der lookup Tabellen.

Nachdem das Ergebnis ausgegeben wurde beginnt die Zählung von vorne.

 

Das ganze Programm benötigt gerade mal 248 Bytes. Eine Platine dazu habe ich diesmal nicht erstellt weil der Aufbau leicht auf Lochraster erstellt werden kann. Benutzt man einen Hallsensor, so muss man beachten, dass der Ausgang dieser Sensoren meist ein Open Kollektor Ausgang ist, es ist also zum einwandfreien Betrieb noch ein Pullup Widerstand von 10K nach plus 5 V notwendig. 

DAS PROGRAMM

#picaxe 08m2

sertxd   ("drehzahlmesser drehe mit 08m2 und i2c",cr,lf) ;text wird bei einschalten zur identifizierung des chips gesendet

 

symbol thousands = b0

symbol hundreds = b1

symbol tens = b2

symbol ones = b3

symbol hall = c.3

symbol impulse = w2

symbol SAA1064 =     %01110000 'SAA1064 i2c address

symbol SAA1064ctrl = %01110111 'SAA1064 display control byte - $70=all current, $07=dynamic, not blanked.

'See SAA1064 datasheet on google if needed.

 

Main:

count hall,1000,impulse 'impulse pro sekunde

impulse = impulse * 60 '*60 sekunden

call seg7

goto main

 

seg7: 'SAA1064 output subroutine. data loaded in seg7input.

hi2csetup i2cmaster, SAA1064, i2cslow, i2cbyte 'make sure i2c is pointing at SAA1064.

hi2cout 0, (SAA1064ctrl) 'setup the SAA1064.

bintoascii impulse, thousands, thousands, hundreds, tens, ones 'the first thousands is not used but has to be there.

 

thousands=thousands - 48 '$48 is acii "0" so point to 63.

lookup thousands,(63,6,91,79,102,109,125,7,127,111),thousands '7 segment digits 0 to 9.

 

hundreds=hundreds - 48

lookup hundreds, (63,6,91,79,102,109,125,7,127,111),hundreds

 

tens=tens - 48

lookup tens,     (63,6,91,79,102,109,125,7,127,111),tens

 

ones=ones - 48

lookup ones,     (63,6,91,79,102,109,125,7,127,111),ones

 

If thousands=63 then 'blanks left digits if zero.

  thousands=0

  if hundreds=63 then

    hundreds=0

    if tens=63 then

      tens=0

    endif

  endif

endif 'end zero blanking.

hi2cout 1,(thousands,hundreds,tens,ones) 'output to 7 segment.

pause 100 'helps stabilize display.

return

   
Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.