Witam, chciałbym zbudować układ który będzie mierzył prędkość i puls podczas jazdy na rowerze. Układ ma działać na podstawie różnic w czasie między impulsami na wejściu uC. Problem w tym, że układ działa poprawnie tylko gdy sygnał jest wysyłany na jedno lub drugie wejście, gdy na oba wtedy pojawiają się błędy.
Np. przy 1 wejściu prędkość wynosi 24km/h, gdy podłącze oba prędkość oscyluje w granicach 13-26km/h. Aby ustabilizować pomiar, wyciągam średnią z 4 pomiarów.
treść kodu:
oraz układ:
napięcia do lcd i uC narazie nie podłączone, w proteus'ie nie jest to wymagane do działania układu.
Np. przy 1 wejściu prędkość wynosi 24km/h, gdy podłącze oba prędkość oscyluje w granicach 13-26km/h. Aby ustabilizować pomiar, wyciągam średnią z 4 pomiarów.
treść kodu:
#include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>
#include <hd44780.c>
static void lcd(unsigned long int a)
{
signed char i;
char str1[12]="------------";
/* Zamiana 32 bitowej liczby bez znaku
na ciąg znaków ASCII */
for(i=12; i>=3; a/=10 ,i--)
str1[i] = a % 10 +'0';
/* Ustawia kursor w pierwszej kolumnie
pierwszego wersza */
LCD_GoTo(0,0);
/* Wysyła do wyświetlacza ciąg znaków z
tablicy str1 */
LCD_WriteText(str1);
}
int main(void)
{
int wynik,i=0,przepelnienie=0,pomiar1,pomiar2,pomocnik1,pomocnik2,z;
int ppomocnik1,ppomocnik2,ppomiar1,ppomiar2,a,b;
double sek=0,min=0,godz=0;
double predkosc1,predkosc2,predkosc4,predkosc3,droga,czas,predsum;
double puls1,puls2,puls3,puls4,pulssum,wwynik,cczas;
char zmienna[10],zzmienna[10],sekundy[2],minuty[2],godziny[2],data[6];
DDRC = 0x00;
PORTC = 0x07;
DDRB |= (1 <<0); // Ustaw jako wyjście LED DDRC=0x00;
TCCR1B |= (1 <<WGM12); // timer Konfiguracja 1 dla trybu CTC
OCR1A = 15624; // Ustaw wartość CTC porównać do 1Hz 1MHz AVR zegar, z prescaler z 64
TCCR1B |= ((1 <<CS10) | (1 <<CS11)); // Start timer na Fcpu/64
LCD_Initalize();
LCD_Clear();
while(1)
{
if (TIFR & (1 <<OCF1A))
{
PORTB ^= (1 <<0); // Włącz LED
przepelnienie++;// wyczyścić flagę CTC (pisanie logiki jednego do zestawu flag czyści go)
TIFR = (1 << OCF1A);
}
if(!(PINC & 0x01))
if(i==1){
pomiar2=TCNT1;
pomocnik2=przepelnienie;
wynik=(((pomocnik2-pomocnik1)*15624)+(pomiar2-pomiar1));
i=0;
droga=2*3,1415926535*2.144;//obwod kola
czas=(wynik*0.000064004); //czas zmierzony/ilosc impulsow na sek
predkosc4=predkosc3;
predkosc3=predkosc2;
predkosc2=predkosc1;
predkosc1=(droga/czas);
predsum=(predkosc1+predkosc2+predkosc3+predkosc4)*0.25;
dtostrf(predsum,5,2,zmienna);
strcat(zmienna," kmph");
LCD_GoTo(1,0);
LCD_WriteText(zmienna);
}else{
pomiar1=TCNT1;
pomocnik1=przepelnienie;
i++;
}
while(!(PINC & 0x01)) {}
if(!(PINC & 0x02))
if(z==1){
ppomiar2=TCNT1;
ppomocnik2=przepelnienie;
wwynik=(((ppomocnik2-ppomocnik1)*15624)+(ppomiar2-ppomiar1));
z=0;
ppomiar1=0;
ppomiar2=0;
ppomocnik1=0;
ppomocnik2=0;
cczas=(wwynik*0.000064004);
puls4=puls3;
puls3=puls2;
puls2=puls1;
puls1=(60/cczas); //ilosc uderzen serca na min.
pulssum=(puls1+puls2+puls3+puls4)*0.25;
dtostrf(pulssum,5,2,zzmienna);
strcat(zzmienna," bpm");
LCD_GoTo(1,1);
LCD_WriteText(zzmienna);
}else{
ppomiar1=TCNT1;
ppomocnik1=przepelnienie;
z++;
}
while(!(PINC & 0x02)) {}
}
return 0;
}oraz układ:
napięcia do lcd i uC narazie nie podłączone, w proteus'ie nie jest to wymagane do działania układu.

![[atmega8][c] Prędkościomierz i pulsometr. [atmega8][c] Prędkościomierz i pulsometr.](https://obrazki.elektroda.pl/71_1276775377.jpg)