PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahlmesser



derdaswar
15.07.2009, 14:42
Hallo liebe Roboterfreunde

ich bin noch Neuling auf dem Gebiet Elektrik/Programmierung und deshalb brauche ich euren Rat.
Vor ner Woche habe ich mir das C-Control (Version 1) und das applicationsboard (mit LCD-Display) ersteigert. Jetzt wollte ich damit einen Drehzahlmesser realisieren. Ich habe auch schon eine Skizze gemacht so wie ich mir das vorstelle.

http://img196.imageshack.us/i/skizze001.png/


Jetzt habe ich aber noch sehr Größe Probleme wie ich das C-Control Programmieren muss. Könnt ihr mir helfen?


Danke schon mal im voraus
Rene

vohopri
15.07.2009, 16:19
Hallo Rene,

ich seh da nur "image not found"

grüsse,
Hannes

021aet04
15.07.2009, 22:46
Du kannst es schon so machen wie auf der Skizze. welche Drehzahlen erwartest du. Für schnelle DZ würde ich statt dem Reed Relais einen Hallsensor nehmen. Wenn du es so anschließt musst du einen internen Pull Up einschalten. Du kannst aber auch einen externen Widerstand nehmen.

derdaswar
16.07.2009, 10:35
Also die DZ liegen so zwischen 5000U/min und 9000U/min.

Ich habe hier schon mal aus Codeschnipseln und den Hilfe Programmen von Conrad was zusammen gebastelt um das LCD-Display an zu steuern.
Ich komm nur einfach nicht darauf wie ich das mit den Drehzahl pro Minute programmieren muss.


'************************************************* *******************
'
' C-Control/BASIC LCD3.BAS
'
' Systemvoraussetzungen:
'
' - Application Board mit angeschlossenem Display
'
' Schwerpunkt:
'
' - Ausgeben von Zahlenwerten am Display
'
'************************************************* *******************

' *** Daten-Definition ***
define value word
define output word

define lcd_buf byte
define lcd_param byte

define i byte

' *** Definition LCD-Ports ***
define lcd_port byteport[2]
define lcd_rs port[14]
define lcd_rw port[13]
define lcd_e port[15]

'*** ASCII-Codes ***
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A

define LEERZ &H20
define MINUS &H2D
define NULL &H30
define GLEICH &H3D
define ccc ad[7]
'*** Programmoperationen ***

gosub LCD_INIT
randomize timer

' Zufallszahlen ausgeben
for i = 1 to 9999999999999999999999999999999999999
pause 5

lcd_param = 1 : gosub LCD_GOTOLINE

lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = H_ : gosub LCD_WRITECHAR
lcd_param = Z_ : gosub LCD_WRITECHAR
lcd_param = A_ : gosub LCD_WRITECHAR
lcd_param = H_ : gosub LCD_WRITECHAR
lcd_param = L_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = GLEICH : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR

value = ccc

gosub WRITEVALUE
next

end


#WRITEVALUE

output = abs(value)

' negatives Vorzeichen oder Leerzeichen
if value < 0 then lcd_param = MINUS else lcd_param = LEERZ
gosub LCD_WRITECHAR

' Zehntausender-Dezimalstelle oder Leerzeichen (Ausblenden fuehrender Nullen)
if abs(value) >= 10000 then lcd_param = NULL + output/10000 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 10000

' Tausender-Dezimalstelle oder Leerzeichen
if abs(value) >= 1000 then lcd_param = NULL + output/1000 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 1000

' Hunderter-Dezimalstelle oder Leerzeichen
if abs(value) >= 100 then lcd_param = NULL + output/100 else lcd_param = LEERZ
gosub LCD_WRITECHAR
output = output mod 100

' Zehner-Dezimalstelle oder Leerzeichen
if abs(value) >= 10 then lcd_param = NULL + output/10 else lcd_param = LEERZ
gosub LCD_WRITECHAR

' einer Dezimalstelle oder Leerzeichen
lcd_param = NULL + output mod 10
gosub LCD_WRITECHAR
return


'*** LCD_Interface ***
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)

#LCD_INIT

' alle ports 0
lcd_port = OFF

' 8-Bit-Modus aktivieren
lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
lcd_port=&B00000010
tog lcd_e
tog lcd_e

' ab jetzt 4-Bit-Modus
lcd_param = &H28 : gosub LCD_WRITECMD
lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
lcd_param = &H02 : gosub LCD_WRITECMD
lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeilenwechsel
#LCD_GOTOLINE
if lcd_param = 1 then lcd_param = &H80
if lcd_param = 2 then lcd_param = &HC0
goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
lcd_buf = OFF
goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
tog lcd_e
tog lcd_e
lcd_port = lcd_buf or (lcd_param and &H0F) ' Lo-Nibble
tog lcd_e
tog lcd_e
return

Besserwessi
16.07.2009, 17:43
Bei 9000 U/min ist das mit einen Reedschalter schon nicht mehr ganz so einfach. Pro Umdrehung sind das nur etwa 6 ms. Die Ansprechzeit und das Prellen werden auch im Bereich einiger ms liegen. Ein Hallgeber wäre da schon besser und würde das Programm auch vereinfachen.

Die Messung könnte wie folgt aussehen:
1) Warten auf ein steigende Flanke
2) Timer auf Null setzen und starten
3) etwas Warten wegen Prellen (z.B. 3 ms)
4) Warten auf nächste steigende Flanke
5) Timer Auslesen, Drehzahl berechnen.

derdaswar
16.07.2009, 22:49
Ich habe mir ein Hall-Seonsor besort. Jetzt kommt das große problem mit der Programmierung. Ich Programmiere mit Basic (das von Conrad). Kann jemand ein Beispiel Programm posten? Ich würde mich wirklich sehr freuen.

Gruß
Rene

021aet04
16.07.2009, 23:10
Wenn du noch nicht richtig programmieren kannst würde ich zuerst einfacher anfangen. Z.B. Normale Ein- und Ausgabe, danach Interrupt,...
Wenn du das kannst begib dich an so ein Projekt. Bei einem Drehzahlmesser brauchst du Timer, Interrupt und LCD zur Ausgabe das lernst du aber nicht inerhalb kürzester Zeit.

derdaswar
16.07.2009, 23:30
Ist das so richtig?

#anfang
If Sensor = 1 then goto Start
goto anfang

#start
... <---- Ab da weiss ich nicht wie ich das machen soll



mal ne andere Frage geht das überhaupt mit dem c-control? Ich meine der Timer arbeitet doch nur in 20ms schritten oder?

021aet04
17.07.2009, 07:31
So ist es richtig, besser wäre es mit Interrupt. Für den Anfang zu Lernen passt das. Leider kann ich dir nicht helfen. Habe keine C Control und programmiere auch nicht in Basic

Suggarman
17.07.2009, 10:31
Ich befürchte, dass mit der C-Control überhaupt keine brauchbare Messung zu stande kommen wird. Sie ist dafür zu langsam.

mfg

Stefan

FriLu
17.07.2009, 16:45
Hi,
schon ne weile her, aber ich glaube mich zu erinnern, das die V1 Frequenzmesspins hat. Also Freq1 und Freq2. Da werden im Hintergrund ständig die eingehenden Impulse gezählt und der Wert wird 1x pro Sekunde aktualisiert ( Es sollen so ~30kHz messbar sein ). Der Wert direkt ausgelesen ist also Umdrehung pro sekunde - mal 60 ergibt U/min.
Nachteil: Die Anzeige springt in 60er Schritten.
Eine mögliche Lösung wäre eine Teilscheibe mit 60 Hell/dunkelzonen mit
Reflexlichtschranke abtasten, der Ausgelesene Wert wäre dann direkt die Drehzahl in U/min.
... 2 Impulse pro Umdrehung und mal 30 ( Auflösung in 30er Schritten)
... 6 Impulse pro Umdrehung und mal 10 ( Auflösung in 10er Schritten)
...
MfG Lutz