Witam...
Bawie się troche z silnikami BLDC (przeróbki na 3f)...
W związku z tym potrzebowałem obrotomierz...
A do rzeczy wziąłem się tak...
Mam w rurce zamontowaną żarówkę przed nią osłąnięte fotoogniwo z kalkulatora...
Pomiędzy żarówką a ogniwem wiruje śmigło...
Sygnał z ogniwa wzmacniam w dwóch stopniach na tranzystorach a potem podaje na inwerter (zwarte wejścia NAND) i dostaje ładny sygnał ttl...
Do tego momentu jest wszystko ok...
Dalej sygnał podaje na wejście zliczają w uC (PB1(T1))...
Program jest generalnie prosty jak konstrukcja cepa...
Timer2 pracuje w trybie asynchronicznym z kwarcem 32kHz i daje przerwanie co 1s...
Timer1 pracuje w trybie normalnym zliczając przy narastającym zboczu z wejścia T1...
Przy przerwaniu od timer2 sprawdzam stan rejestru timer1 zeruje i odczytaną wartość wyświetlam na lcd...
Lcd nie ma na schemacie ale to najzwyklejszy 2x16 na HD44780 w trybie 8-bitowym...
Problem w tym, że wskazania są bardzo nie stabilne...
Przy 2000-3000 tys wachania są 200-300 obrotów a to już sporo...
Nie bardzo wiem skąd się to bierze...
Jeśli macie jakieś sugestie lub pomysły...
Albo widzicie, że coś zawaliłem to się nie krępujcie...
Aha mega pracuje na wewnętrznym generatorze 8MHz...
Bawie się troche z silnikami BLDC (przeróbki na 3f)...
W związku z tym potrzebowałem obrotomierz...
A do rzeczy wziąłem się tak...
Mam w rurce zamontowaną żarówkę przed nią osłąnięte fotoogniwo z kalkulatora...
Pomiędzy żarówką a ogniwem wiruje śmigło...
Sygnał z ogniwa wzmacniam w dwóch stopniach na tranzystorach a potem podaje na inwerter (zwarte wejścia NAND) i dostaje ładny sygnał ttl...
Do tego momentu jest wszystko ok...
Dalej sygnał podaje na wejście zliczają w uC (PB1(T1))...
Program jest generalnie prosty jak konstrukcja cepa...
Timer2 pracuje w trybie asynchronicznym z kwarcem 32kHz i daje przerwanie co 1s...
Timer1 pracuje w trybie normalnym zliczając przy narastającym zboczu z wejścia T1...
Przy przerwaniu od timer2 sprawdzam stan rejestru timer1 zeruje i odczytaną wartość wyświetlam na lcd...
Lcd nie ma na schemacie ale to najzwyklejszy 2x16 na HD44780 w trybie 8-bitowym...
Problem w tym, że wskazania są bardzo nie stabilne...
Przy 2000-3000 tys wachania są 200-300 obrotów a to już sporo...
Nie bardzo wiem skąd się to bierze...
Jeśli macie jakieś sugestie lub pomysły...
Albo widzicie, że coś zawaliłem to się nie krępujcie...
void Timer_Init (void)
{
TCCR1A = 0b00000000;
TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10); //timer zlicza z zewnętrznego źródła (T1), zbocze narastające
}
void Start_Clock(void) // inicjalizacja timer2 do pracy z kwarcem 32kHz
{
ASSR = (1 << AS2); //timer2 ustawiony na prace asynchroniczną z kwarcem 32kHz
TCCR2 = (1 << CS22) | (1 << CS20); //| (1 << CS20); //prescaler na 128 => przepełnienie co 1s
TIMSK |= (1 << TOIE2); //aktywne przerwanie przepełnienia od timer2
}
int main(void)
{
DDRA = 0b11111111;
DDRD = 0b11000000;
unsigned int dt, t, s, d, temp;
unsigned char napis[11] = " Obroty/min", i;
Start_Clock();
Timer_Init();
lcd_init();
sei();
for(;;)
{
if(wys==1)
{
rpm = rpm / 2;
rpm = rpm * 60;
lcd_clear();
lcd_data(napis[0]);
dt = rpm/10000; lcd_data(ascii(dt));
temp = rpm - (dt*10000);
t = temp/1000; lcd_data(ascii(t));
temp = temp - (t*1000);
s = temp/100; lcd_data(ascii(s));
temp = temp - (s*100);
d = temp/10; lcd_data(ascii(d));
temp = temp - (d*10);
lcd_data(ascii(temp));
for(i=0; i<11; i++)
{lcd_data(napis[i]);}
wys=0;
}
}
return(0);
}
SIGNAL (SIG_OVERFLOW2) // obsługa przerwania od timer2 => przepełnienie
{
rpm = TCNT1;
TCNT1 = 0;
wys = 1;
}
Aha mega pracuje na wewnętrznym generatorze 8MHz...