Sprzętowy interfejs czujnika prędkości


Witam. Mój dobry znajomy buduje terenowe pojazdy Buggy. Ja pracuję przy nich przy instalacjach elektrycznych i innowacjach. Większość osprzętu który ma do dyspozycji kierowca pochodzi z Fiata Seicento, w tym licznik.
Jako że opony mają inny rozmiar licznik przekłamuje w dół (zaniża prędkość). Ostatnio zamontowaliśmy do jednego silnik z Opla i wskazania prędkościomierza jeszcze bardziej spadły (mniej impulsów z czujnika).
W jednym z nich modyfikując zawartość eeprom licznika zmieniłem mnożnik i podrasowałem wskazania. Jest to jednak metoda niewygodna. Wymaga demontażu licznika i rozłożenia go na części ze zdjęciem wskazówek włącznie. Próby skalibrowania przez to sa uciążliwe. Do pierwszego z nich, bo pojazdów jest już siedem, udało się u ludzi kalibrujacych tachografy zrobić przejściówkę mechaniczną.
Chciałbym zbudować na mikrokontrolerze taki "mnożnik impulsów". Opony można zakładac różne. Szosowe lub terenowe. Więc byłoby to wygodniejsze.
Urządzenie musiałoby zliczać impulsy z czujnika i z odpowiednią przekładnią generować je na wyjściu.
Panowie, co dwie głowy to nie jedna. Jak ktoś ma pomysł jak by to zrobił to proszę rzucić. Ja myślałem nad czymś w rodzaju miernika częstotliwości z wykorzystaniem dwóch Timerów. Nie mam jeszcze zarysu jak rozwiązać podnoszenie i generowanie impulsów. Mnożnik załóżmy do testów byłby 1,5. Nie musi reagowac natychmiast. Odswieżanie co sekundę wystarczy. Czyli 100 impulsów na sekundę ma dac 150.

Proszę o jakiś pomysł co do rozwiązania a resztę się dopieści :D Każdy pomysł mile widziany.




Portret użytkownika EDC

Generator prędkości/preskaler

Miałem znów wolną chwilę więc doczytałem jak uruchomić Timery w trybie CTC. Pozwoliło to pozbyć się kilku zmiennych i o 2% flash`a kod znów skrócić.
Urządzenie wpina się pomiędzy czujnik prędkości a oryginalne okablowanie. Pozwala zmieniać pokazywana prędkość (zaniżać / zawyżać) albo generować przebieg na postoju :P
Tryb przełącza się wciskając obydwa przyciski przy włączaniu zapłonu. W trybie generatora przyciski zwiększają lub zmniejszają częstotliwość impulsów. W trybie preskaler przyciski zmieniają mnożnik o 0,01.
Nastawy są pamiętane w Eeprom więc po ustawieniu można odłączyć przyciski które dołączane poprzez złącze ISP służące do programowania.
W planie mam jeszcze trzeci przycisk do zapamiętywania ustawień dopiero po testach drogowych.
Może się komuś przyda do czegoś innego taka konfiguracja Timerów i komendy podpatrzy.

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B00011010 : Portb = &B11111111
Config Portd = &B01000000 : Portd = &B10111111
Config Porta = &B00000000 : Porta = &B11111111
 
'*** Timer0 Config for 10ms Interrupt CTC Mode ***
Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
Enable Compare0a : On Compare0a Int_10ms : Compare0a = 77
 
'*** Timer1 Config CTC mode ***
Config Timer1 = Timer , Prescale = 256 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
Enable Compare1a : On Compare1a Timer1_int
 
'*** External INT Config for pulses input from speed sensor ***
Config Int0 = Falling
Enable Int0 : On Int0 Sensor                                'input for sensor pulses
 
Output_led Alias Portb.3
Output_bs Alias Portb.1
Pwr_led Alias Portd.6
 
Dim Ms_counter As Byte                                      'for 1s timing
Dim S_pulses As Byte , Counted As Byte , O_pulses As Word   'for counting and calculating pulses
Dim Y As Word , Multiplier As Byte
Dim Switch As Bit , Tryb As Byte , Freq As Byte
 
Readeeprom Multiplier , 2                                   ' secure for FF in flash writing
If Multiplier = 255 Then Multiplier = 100
 
Readeeprom Tryb , 3
If Tryb = 255 Then Tryb = 1                                 ' secure for FF in flash writing
 
Readeeprom Freq , 4
If Freq = 255 Then Freq = 1                                 ' secure for FF in flash writing
 
If Pinb.6 = 0 And Pinb.5 = 0 Then                           'if switches shorted on Boot
 If Tryb = 0 Then Tryb = 1 Else Tryb = 0                    'change MODE Generator (1) or Prescale (0)
End If
 
Writeeeprom Tryb , 3
 
Enable Interrupts
'**********************
'***** LOOP START *****
Do
 
If Ms_counter = 100 Then                                    '100 * 10ms = 1s
   Ms_counter = 0
 
 If Tryb = 0 Then
  Counted = S_pulses
 S_pulses = 0
 Else                                                       'Counted = S_pulses in Prescale Mode or Freq in Generator Mode
 Counted = Freq
 End If
 
If Counted <> 0 Then
O_pulses = Counted * Multiplier
O_pulses = O_pulses / 50
 Y = 31249 / O_pulses                                       ' value 8MHz / 256 = 31250 for Sec
 Compare1a = Y
 End If
End If
'---------------------------------------
Debounce Pinb.6 , 0 , Calibrate , Sub                       'switch minus
Debounce Pinb.5 , 0 , Calibrate , Sub                       'switch plus
 
Loop
'***** END OF LOOP *****
'***********************
End
 
Calibrate:
If Pinb.6 = 0 Then
Select Case Tryb
Case 0:
 If Multiplier > 80 Then Decr Multiplier                    'In Prescale mode Multiplier is changed
Case 1:
 If Freq > 1 Then Decr Freq                                 'In Generator mode Freq is changed
End Select
End If
If Pinb.5 = 0 Then
Select Case Tryb
Case 0:
 If Multiplier < 140 Then Incr Multiplier
Case 1:
 If Freq < 250 Then Incr Freq
End Select
End If
Writeeeprom Multiplier , 2
Writeeeprom Freq , 4
Return
 
Sensor:                                                     'input from speed sensor
Incr S_pulses
Return
 
Int_10ms:
Incr Ms_counter
Return
 
Timer1_int:
If Counted <> 0 Then
 Toggle Output_led
 Toggle Output_bs
Else                                                        'If car is stopped no output
 Output_led = 1
 Output_bs = 0
End If
Return

Schemat poglądowy poniżej. Płytka ma sześć styków. Z jednej 11V, sygnał i mase. Z drugiej 11V, sygnał i masę :D tylko jeden sygnał to wejście a drugi modulowany układem - wyjście.

Jak zwykle życzę miłego dnia. Uwagi mile widziane :D

-

BARTek
Moja strona

Portret użytkownika EDC

Generator prędkości/preskaler

Jedna ważna uwaga i specjalnie nie edytowałem powyższego postu.
Tu na stronie kod nie mieści się w całej swojej szerokości a bardzo ważne jest żeby konfigurację Timerów zapisac w jednej linii. Piszę żeby ktoś nie miał kłopotów piszac swój program. Musi to być zapisane tak jak poniżej:

Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1

-

BARTek
Moja strona

Portret użytkownika gosc

witam. Można więcej danych

witam.
Można więcej danych ponieważ nie mogę uruchomić tego układu
jak z ustawieniami fusy bitów ?

Portret użytkownika EDC

Odp. Prędkościomierz

Witam. W fabrycznym Tiny włączony jest podzielnik i Tiny fabrycznie nowy pracuje na częstotliwości 1MHz.
Trzeba wyłączyć CKDIV8. Na sam koniec włączyłem też Bity odpowiedzialne za wykrywanie zasilania które nie gwarantuje poprawnej pracy przez co dane w EEprom mogły by ulec zamazaniu. Dopracowałem w miedzyczasie kod. Jedna ze zmiennych na przykład się przepełniała przy napędzaniu urządzenia kalibrowanym generatorem (testy na większych F). Poszukam może..Jak wszystko po czasie, myślę że da sie to napisac lepiej :D
Mieści się w obudowie przekaźnika.

-

BARTek
Moja strona