SchemaTheek
 
Home Nieuws Forum Schema's Artikelen Magazine Downloads Links Shops Zoeken
 
Controle Paneel
Gebruikersnaam
Wachtwoord
  Onthoud mij
» Wachtwoord?
» Registreren
Site info
» Het Team
» Contact
» FAQ
» Leden
» Upload Archief
Stats
Totaal online: 9
9 gasten
0 leden:
Forum > Digitaal > Motorfiets versnelling indicator
P A U L
Lid
Berichten: 2
Gepost op maandag 23 April 2012 19:53:47 QuoteWijzig

Geachte mede hobbyisten,

vanwege het gebrek aan een standaard versnellingsindicator op mijn motorfiets (en het feit dat zo'n ding meer dan 100 euro moest kosten) ben ik aan het programmeren geslagen.
Het resultaat is een schakeling die dmv optocouplers is gescheiden van de verschillende sensors.
Dmv een trigger (ik heb gekozen voor de grootlicht schakelaar) kan het systeem geleerd worden welke verhouding van toerental en snelheid hoort bij de verschillende versnellingen. Hierbij wordt ook een spreiding aangebracht zodat afwijkingen niet snel resulteren in een mis aanwijzing. De verschillende waarden worden opgeslagen in intern eeprom. De uitlezing wordt door een standaard 7-segment display verzorgd welke ik in m?n cockpit heb ingebouwd.
Ik heb de unit volledig werkend op mijn eigen motorfiets zitten, een Kawasaki Versys 650 (overigens de beste fiets ooit gemaakt....;-). De schakeling lijkt me ook toepasbaar voor andere fietsen zolang het toerental en snelheid digitaal wordt aangeboden. De hoogte van de spanningspulsen heeft dankzij het gebruik van een optocoupler een redelijk breed bereik, de huidige opzet werkt met pulsen van 5 Vtt en bij frequenties rond de 100Hz (frequentie uiteraard afhankelijk van snelheid en toerental). De signalen heb ik afgetakt ter hoogte van het display. Gewoon even je garage manual raadplegen.
Schema en PCB gemaakt met Target3001!, ik zal mezelf eens aanleren om Eagle te gebruiken

Schema



PCB



Programma


Code

'****************************************************************
'*  Name    : Gear indicator                                    *
'*  Author  : Paul Smits                                        *
'*  Notice  : All Rights Reserved                               *
'*          :                                                   *
'*  Date    : 23/04/2012                                        *
'*  Version : 1.2                                               *
'*  Notes   : Getest met Kawasaki versys 650 bj 2009            *
'*          :                                                   *
'****************************************************************

Device 16F628A                                                       ;de PIC16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF    ;geen externe xtal

All_Digital true
 
Dim var1 As Word
Dim var2 As Word
Dim var3 As Word
Dim var4 As Word
Dim var5 As Word
Dim TPT1 As Word
Dim TPT2 As Word
Dim ratio_temp As Float
Dim ratio As Byte
Dim ratio1 As Byte
Dim ratio1L As Byte
Dim ratio1H As Byte
Dim ratio2 As Byte
Dim ratio2L As Byte
Dim ratio2H As Byte
Dim ratio3 As Byte
Dim ratio3L As Byte
Dim ratio3H As Byte
Dim ratio4 As Byte
Dim ratio4L As Byte
Dim ratio4H As Byte
Dim ratio5 As Byte
Dim ratio5L As Byte
Dim ratio5H As Byte
Dim ratio6 As Byte
Dim ratio6L As Byte
Dim ratio6H As Byte
Dim V1 As Byte
Dim V2 As Byte
Dim T As Word
Dim R As Byte
Dim frame As Byte
Dim trigger As Byte
Dim teller As Byte
Symbol input_speed = PORTA.0     ;frequentiemeting voortandwiel op portA.0 (pin 17) 
Symbol input_tacho = PORTA.1     ;frequentiemeting tachometer op portA.1 (pin 18)
Symbol input_neutraal = PORTA.2  ;indicatie versnellingsbak neutraalstand  op portA.2 (pin 1)
Symbol GL = PORTA.3     ; GL is grootlicht en wordt gebruikt om de ratio meting te starten
;aansluiten 7 segment display (common cathode):
;a =  portb.0           a
;b =  portb.1          ---
;c =  portb.2        f|   |b
;d =  portb.3          ---
;e =  portb.4        e| g |c
;f =  portb.5          ---
;g =  portb.6           d

TRISB = %0000000 ;PORTB.0t/m 7 als uitgangen instellen
TRISA = %0001111 ;PORTA.0t/m 3 als ingangen instellen 

V1 = 0         
V2 = 0          

GoSub ratios

GoTo hoofdprogramma

'subroutines------------------------------------------------------------------------------------------------------------

ratios:
;inlezen van ratio's
ratio1 = ERead 1
ratio1L = ERead 7
ratio1H = ERead 8
ratio2 = ERead 2
ratio2L = ERead 9
ratio2H = ERead 10
ratio3 = ERead 3
ratio3L = ERead 11
ratio3H = ERead 12
ratio4 = ERead 4
ratio4L = ERead 13
ratio4H = ERead 14
ratio5 = ERead 5
ratio5L = ERead 15
ratio5H = ERead 16
ratio6 = ERead 6
ratio6L = ERead 17
ratio6H = ERead 18
Return

meting_voortandwiel:
;frequentiemeting voortandwiel  
var1 = PulsIn input_speed , 1 ; tijd meten van de duur dat de puls van het voortandwiel hoog is.
var2 = PulsIn input_speed , 0 ; tijd meten van de duur dat de puls van het voortandwiel laag is. 
TPT1 = var1 + var2 ; TPT1 is de totale periode tijd (indien duty cycle niet exact 50% is).
If TPT1 < 215 Then TPT1 = 215    ;limitering van topsnelheid op 270 km/h en voorkomen van delen door nul.
If TPT1 > 11000 Then TPT1 = 11000 ;limitering van lage snelheid op 5 km/h
Return

meting_tacho:
;frequentiemeting van de tachmeter
var3 = PulsIn input_tacho , 1 ; tijd meten van de duur dat de puls van de tachometer hoog is.
var4 = PulsIn input_tacho , 0 ; tijd meten van de duur dat de puls van tachometer laag is. 
TPT2 = var3 + var4 ; TPT2 is de totale periode tijd (indien duty cycle niet exact 50% is).
;TPT2 = 750 ;toeren instelling voor testdoeleinden (4000rpm = 133Hz = 7,5ms = 750 x 10 us)
If TPT2 < 250 Then TPT2 = 250 ;limitering van hoge toeren (ca 11000 rpm)
If TPT2 > 11000 Then TPT2 = 11000 ;limitering van toerental lager dan stationair (ca 200 rpm)
Return

ratio_berekening:
ratio_temp = TPT2 / TPT1   ;bepaling van de ratio tussen toeren en snelheid (floating voor voldoende nauwkeurigheid). 
ratio = ratio_temp * 100 ;wegwerken van de float
Return

ratio_meten:    ;met deze subroutine wordt voor elke versnelling de ratio tussen toeren en snelheid gemeten en in eeprom opgeslagen.
PORTB = %0000000   ; display leeg maken
DelayMS 200
While GL = 0
PORTB = %0000110 ;aansturing 7 segment display segment b,c cijfer 1
DelayMS 200
PORTB = %0000000 ;knipperen cijfer 1
DelayMS 200
Inc teller
  If teller = 30 Then   ; indien er binnen 15 seconden geen input wordt gegeven dan terug naar hoofdprogramma
  teller = 0
  GoTo hoofdprogramma
EndIf
Wend
While GL = 1: Wend   ;anti dender
GoSub meting_voortandwiel
GoSub meting_tacho 
GoSub ratio_berekening
EWrite 1, [ratio]    ; de waarde van de ratio bepaling wegschrijven naar eeprom adres 1 voor de eerste versnelling

While GL = 0
PORTB = %1011011 ;aansturing 7 segment display segment a,b,g,e,d cijfer 2
DelayMS 200
PORTB = %0000000 ;knipperen cijfer 2
DelayMS 200
Wend ;Wacht hier in deze lus tot grootlicht wordt geactiveerd
While GL = 1: Wend   ;anti dender
GoSub meting_voortandwiel
GoSub meting_tacho 
GoSub ratio_berekening
EWrite 2, [ratio]    ; de waarde van de ratio bepaling wegschrijven naar eeprom adres 2  voor de tweede versnelling

While GL = 0
PORTB = %1001111 ;aansturing 7 segment display segment a,b,g,c,d cijfer 3
DelayMS 200
PORTB = %0000000 ;knipperen cijfer 3
DelayMS 200
Wend ;Wacht hier in deze lus tot grootlicht wordt geactiveerd
While GL = 1: Wend  ;anti dender
GoSub meting_voortandwiel
GoSub meting_tacho 
GoSub ratio_berekening
EWrite 3, [ratio]    ; de waarde van de ratio bepaling wegschrijven naar eeprom adres 3 voor de derde versnelling

While GL = 0
PORTB = %1100110 ;aansturing 7 segment display segment f,g,b,c cijfer 4
DelayMS 200
PORTB = %0000000 ;knipperen cijfer 4
DelayMS 200
Wend ;Wacht hier in deze lus tot grootlicht wordt geactiveerd
While GL = 1: Wend   ;anti dender
GoSub meting_voortandwiel
GoSub meting_tacho 
GoSub ratio_berekening
EWrite 4, [ratio]     ; de waarde van de ratio bepaling wegschrijven naar eeprom adres 4  voor de vierde versnelling

While GL = 0
PORTB = %1101101 ;aansturing 7 segment display segment a,f,g,c,d cijfer 5
DelayMS 200
PORTB = %0000000 ;knipperen cijfer 5
DelayMS 200
Wend ;Wacht hier in deze lus tot grootlicht wordt geactiveerd
While GL = 1: Wend  ;anti dender
GoSub meting_voortandwiel
GoSub meting_tacho 
GoSub ratio_berekening
EWrite 5, [ratio]      ; de waarde van de ratio bepaling wegschrijven naar eeprom adres 5 voor de vijfde versnelling

While GL = 0
PORTB = %1111101 ;aansturing 7 segment display segment a,f,g,c,d,e  cijfer 6
DelayMS 200
PORTB = %0000000 ;knipperen cijfer 6
DelayMS 200
Wend ;Wacht hier in deze lus tot grootlicht wordt geactiveerd
While GL = 1: Wend ;anti dender
GoSub meting_voortandwiel
GoSub meting_tacho 
GoSub ratio_berekening
EWrite 6, [ratio]      ; de waarde van de ratio bepaling wegschrijven naar eeprom adres 6  voor de zesde versnelling

frame = ratio1 - 10
EWrite 7, [frame] ;hiermee wordt de onderste limiet voor de 1ste versnelling bepaald

frame = ratio1 + ((ratio2 - ratio1) / 2)
EWrite 8, [frame] ;hiermee wordt de bovenste limiet voor de 1ste versnelling bepaald

frame = ratio2 - ((ratio2 - ratio1) / 2)
EWrite 9, [frame] ;hiermee wordt de onderste limiet voor de 2ste versnelling bepaald

frame = ratio2 + ((ratio3 - ratio2) / 2)
EWrite 10, [frame] ;hiermee wordt de bovenste limiet voor de 2ste versnelling bepaald

frame = ratio3 - ((ratio3 - ratio2) / 2)
EWrite 11, [frame] ;hiermee wordt de onderste limiet voor de 3ste versnelling bepaald

frame = ratio3 + ((ratio4 - ratio3) / 2)
EWrite 12, [frame] ;hiermee wordt de bovenste limiet voor de 3ste versnelling bepaald

frame = ratio4 - ((ratio4 - ratio3) / 2)
EWrite 13, [frame] ;hiermee wordt de onderste limiet voor de 4ste versnelling bepaald

frame = ratio4 + ((ratio5 - ratio4) / 2)
EWrite 14, [frame] ;hiermee wordt de bovenste limiet voor de 4ste versnelling bepaald

frame = ratio5 - ((ratio5 - ratio4) / 2)
EWrite 15, [frame] ;hiermee wordt de onderste limiet voor de 5ste versnelling bepaald

frame = ratio5 + ((ratio5 - ratio4) / 2)
EWrite 16, [frame] ;hiermee wordt de bovenste limiet voor de 5ste versnelling bepaald

frame = ratio6 - ((ratio6 - ratio5) / 2)
EWrite 17, [frame] ;hiermee wordt de onderste limiet voor de 6ste versnelling bepaald

frame = ratio6 + 10
EWrite 18, [frame] ;hiermee wordt de bovenste limiet voor de 6ste versnelling bepaald

GoSub ratios

Return

Setup:
trigger = Counter GL , 3000 ;dan binnen 3 seconden 3 keer aandoen 
If trigger > 2 Then
    trigger = 0
    GoSub ratio_meten
EndIf
Return

'einde subroutines------------------------------------------------------------------------

hoofdprogramma:

; naar subroutine voor meten van de ratio
If GL = 1 Then
GoSub Setup  ; grootlicht ca 1 sec aandoen voor trigger
EndIf 

GoSub meting_voortandwiel
GoSub meting_tacho

; naar subroutine voor meten van de ratio
If GL = 1 Then
GoSub Setup  ; grootlicht ca 2 sec aandoen voor trigger
EndIf 

GoSub ratio_berekening 


If TPT2 > 10000  Then    ;check of motor aan staat (>300rpm), zoniet dan een - in display
    PORTB = %01000000 ;aansturing 7 segment display segment g   ratio onbekend, een - in display   
    GoTo hoofdprogramma
EndIf

If input_neutraal = 1 Then  ; check of de versnelling in neutraal staat, zoja dan 0 in display
            '76543210
    PORTB = %00111111 ;aansturing 7 segment display segment a,b,c,d,e,f 
    GoTo hoofdprogramma
EndIf

;Display van versnelling
Select ratio
 Case ratio1L To ratio1H      ;ratio 1e versnelling  
  ;        76543210
  PORTB = %00000110 ;aansturing 7 segment display segment b,c
  V2 = 0
 Case ratio2L To ratio2H      ;ratio 2e versnelling
  PORTB = %01011011 ;aansturing 7 segment display segment a,b,g,e,d
  V2 = 0 
 Case ratio3L To ratio3H      ;ratio 3e versnelling
  PORTB = %01001111 ;aansturing 7 segment display segment a,b,g,c,d
  V2 = 0
 Case ratio4L To ratio4H      ;ratio 4e versnelling
  PORTB = %01100110 ;aansturing 7 segment display segment f,g,b,c
  V2 = 0
 Case ratio5L To ratio5H     ;ratio 5e versnelling
  PORTB = %01101101 ;aansturing 7 segment display segment a,f,g,c,d
  V2 = 0
 Case ratio6L To ratio6H    ;ratio 6e versnelling
  PORTB = %01111101 ;aansturing 7 segment display segment a,f,g,c,d,e
  V2 = 0
 Case Else          ;indien de ratio niet in de range past (bijv ingeknepen koppeling) 
  V2 = 1
EndSelect

If V2 = 0 Then
    V1 = 0
    GoTo hoofdprogramma
EndIf

;bepaling van de pulstijd van de neutraal
var5 = PulsIn input_neutraal, 1 ;meet de tijd waarin de versnelling neutraal actief is.

;indien de puls tussen 0,1ms en 500ms dan blijkbaar door neutraal geschakeld
If var5 > 1 And var5 < 50000 Then
    V1 = 1
EndIf

If V2 = 1 And V1 = 1 Then      ;bepalen of ratio onbekend is en of er door neutraal geschakeld is, zoja dan een 1 op display 
    PORTB = %00000110 ;aansturing 7 segment display segment b,c
Else 
    PORTB = %01000000 ;aansturing 7 segment display segment g   ratio onbekend, een - in display
EndIf

GoTo hoofdprogramma

End

Er zijn nog geen reacties geplaatst.

Active Topics

» Virtual Chemist probleem
» Probleem met Toyota Av...
» Whirlpool kookplaat
» 24 volt motor vertrage...
» Show je mini projecten
» Purer 8.3se
» MULTIMETERS geven alle...
» Werkplaatsinrichting
» 2022
» De tuin.

» Meer actieve topics

Advertenties

PCBway

© 2004-2022 SchemaTheek
Laadtijd: 0.22178 sec.