Atmega tachometr – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Atmega tachometr – Mikrokontroléry – Fórum – Programujte.comAtmega tachometr – Mikrokontroléry – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
kohut
~ Anonymní uživatel
6 příspěvků
13. 6. 2013   #1
-
0
-

Dobrý den 

Chtěl jsem se zeptat jestli někdo nemáte zkušenosti s nějakým jednoduchým tachometrem založeném na atmega se vstupem magnetického senzoru (hallova) a zobrazeným na 7segmentovém led display.

Za jakoukoli radu se zapojením i kódem všem děkuji.

Nahlásit jako SPAM
IP: 89.177.134.–
Reklama
Reklama
KIIV+42
God of flame
13. 6. 2013   #2
-
0
-

zadas obvod, zmeris za jak dlouho se kolo otocilo... pak trosku matiky a zobrazit

pripadne pokud si vypocitas podle obvodu jak dlouho mas pocitat impulzy abys dostal presne pocet impulzu na rychlost v kilometrech/h nebo treba po 2.5km/h nebo po 5km/h (mensi presnost = rychlejsi pocitani)  ...  pro 2m obvod kola by se pak pocitaly impulzy asi 7.2 sekundy .. a dostalo by se primo pocet impulzu = km/h

(teda snad se nepletu.. takhle v noci mi to uz tolik nepali)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
14. 6. 2013   #3
-
0
-

záleží na rozsahu který to má měřit. U velkých otáček stačí měřit frekvenci impulzů za jednotku času. Pro tento účel čítač bude čítat impulzy ze sondy, měřící interval vytvoříš pomocí dalšího časovače. To by fungovalo dobře asi na parní turbíně kolem 12 000 ot/min

U malých otáček (např. spalovací motor - rozsah asi 600 až 4000 ot/min, generátor u MVE - většinou 600ot/min) je vhodnější měřit periodu impulzů a počet otáček (frekvenci) spočítat. Navíc je vhodné generovat více impulzů za otáčku. V tomto případě necháš časovač volně běžet na taktování z oscilátoru (ten je generátorem krátkých časových jednotek) a hardwarově pomocí Capture registru (ovládáš ho impulzem ze sondy z příslušného vstupu) přečteš stav časovače. Rozdíl mezi posledními 2 stavy časovače je přímo úměrný měřené periodě.

Doporučuji na stránkách Atmelu prostudovat Application Notes, měření frekvence tam bylo.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV+42
God of flame
14. 6. 2013   #4
-
0
-

no proste tachometr i otackomer meri to same, jen u tachometru se musi zapocitat i obvod kol, ne jen otacky

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
14. 6. 2013   #5
-
0
-

jsem se asi ještě neprobudil. Takový román jsem napsal a použitelná je asi 1/4. Pro tachometr je vhodnější měřit periodu impulzů a zbytek počítat. Doporučuji umístit rovnoměrně po obvodu kola několik magnetů - aspoň 4.Rychlost = Dráha na impulz (je konstantní) / perioda impulzů  kde dráha na impulz = obvod kola/počet magnetů. Jako počitadlo kilometrů pak stačí na každý impulz k uražené vzdálenosti přičíst dráhu na impulz .

hu

Nahlásit jako SPAM
IP: 195.178.67.–
kohut
~ Anonymní uživatel
6 příspěvků
14. 6. 2013   #6
-
0
-

Všem děkuju za odpovědi, tak ja se ještě kouknu na ten aplication notes a zkusím se do toho pustit.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 89.177.134.–
kohut
~ Anonymní uživatel
6 příspěvků
20. 6. 2013   #7
-
0
-

Zdravím potřeboval bych poradit ještě se zobrazením na tom led display zatím mám tohle:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile unsigned int namerane;
volatile unsigned int stred;
volatile unsigned int vysledek;

ISR (TIMER1_CAPT_vect){
	namerane = TCNT1;
	TCNT1 = 0;
}

int main(){

	unsigned char blik;

	
	DDRB &= ~(1 << PB0); 
	PORTB |= (1 << PB0); 

	TCCR1B |= (1 << CS12) | (1 << CS10); 
	TIMSK |= (1 << TICIE1); 
	OSCCAL = 0xA5;   		
	sei(); 

	while(1){
		if(namerane) {	
			stred = namerane/976;
			vysledek = 30/stred;
                  tento vysledek bych potřeboval zobrazit
		namerane = 0;
		}

	}

return 0;
}

s tím že zapojení jsem si "navrhnul" takhle:

doufám že z toho něco vyčtete

a číslice odpovídají těmto log. hodnotám pinů :

0b01111001; //1
0b00100100; //2
0b01100111; //3
0b00011001; //4
0b00010010; //5
0b00000010; //6
0b01111000; //7
0b00000000; //8
0b00010000; //9
0b01000000; //0

Jsem ješte začátečník takže budu moc vděčný za jakoukoli pomoc s kódem. 

Nahlásit jako SPAM
IP: 89.177.134.–
hlucheucho+10
Posthunter
20. 6. 2013   #8
-
0
-

převod int čísla na hodnoty použij pole, které obsahuje stavy portů pro zobrazené znaky a převáděné číslo použiješ jako index: 

uint8_t cifra;  //obsahuje cifru
uint8_t znaky[] = {0x79, 0x23, ... , 0x81}; //hodnoty vyjadruji stavy portu pro jednotlive znaky

PORTD = znaky[cifra]

Pro práci s porty nezapomeň nastavit porty jako výstupy zapsáním do registrů DDRD a DDRC

Pro zjednodušení DPS bych asi volil multiplexovaný displej, pro společnou elektrodu displeje potřebuješ pomocné tranzistory. Segmenty lze zapojit přímo na porty i u 4-místného displeje.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
kohut
~ Anonymní uživatel
6 příspěvků
21. 6. 2013   #9
-
0
-

takže jestli jsem správně pochopil tak by to mělo být takhle:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile unsigned int namerane;
volatile unsigned int stred;
volatile unsigned int vysledek;

ISR (TIMER1_CAPT_vect){
	namerane = TCNT1;
	TCNT1 = 0;
}

int main(){

	
	DDRB &= ~(1 << PB0); 
	PORTB |= (1 << PB0); 
        DDRD = 0x00000000;
        DDRC = 0x00000000;
	TCCR1B |= (1 << CS12) | (1 << CS10); 
	TIMSK |= (1 << TICIE1); 
	OSCCAL = 0xA5;   		
	sei(); 

	while(1){
		if(namerane) {	
			stred = namerane/976;
			vysledek = 30/stred;
                  uint8_t vysledek;                    uint8_t znaky[] = {0x79, 0x23, 0x67, 0x19, 0                                     x12, 0x02, 0x78,0x00, 0x1                                     0, 0x40}; 
                  PORTD = znaky[vysledek];
		namerane = 0;
		}

	}

return 0;
}

ale jestli jsem to tedy pochopil správně tak tímto máme vyřešen pouze PORTD , jak tedy ještě dostat ty čísla i na ten druhý znak?? 

Nahlásit jako SPAM
IP: 89.177.134.–
hlucheucho+10
Posthunter
21. 6. 2013   #10
-
0
-

ještě jsem zapomněl, že by ty konstanty měli být v paměti programu. 

#include <avr/pgmspace.h>

uint8_t PROGMEM znaky[] = ...atd

hu

Nahlásit jako SPAM
IP: 188.95.60.–
kohut
~ Anonymní uživatel
6 příspěvků
21. 6. 2013   #11
-
0
-

děkuji a mohu se ještě zeptat jak na ten druhý znak na portu c ?

Nahlásit jako SPAM
IP: 89.177.134.–
hlucheucho+10
Posthunter
21. 6. 2013   #12
-
0
-

úplně stejně, akorát zapisuješ na PORTC. Pokud máš segmenty zapojené na "stejné" bity portu, můžeš použít pole s hodnotami společně pro oba znaky.

Pokud chceš aby bit portu byl jako výstup, musíš na jeho pozici v registru DDRx napsat 1, takže DDRC = 0x7f;

Další otázka je zátěž portu. Musíš dodržet max zátěž na pin a k tomu ještě max zátěž celého portu a nakonec zátěž napájecích pinů. Pokud dáš na segment displeje 8 mA, neměl by vzniknout problém. Více najdeš v datasheetu na stránkách www.atmel.com

hu

Nahlásit jako SPAM
IP: 188.95.60.–
kohut
~ Anonymní uživatel
6 příspěvků
15. 8. 2013   #13
-
0
-

zdravím

Vím že už jsem tu dlouho nebyl ale chvíli jsem byl pryč a teď jsem se vrátil a mám stále problém se zobrazení dvouciferného čísla to dvou znacích sedmisegmentového led displeje udělal jsem zkušební program pouze na to zobrazení. 

Tady je :

#include <avr/io.h> 
#include <avr/pgmspace.h> 

   unsigned int zobrazit; 
uint8_t PROGMEM znaky[] = {0xC0, 0x79, 0xA4, 0x30, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x40}; 

int main(){ 
   DDRD=0b11111111; 
   DDRC=0b11111111;  

   while(1){    
         zobrazit = 71;       
         for (zobrazit=0 ; zobrazit<100 ; zobrazit++) 
         { 
            PORTD=znaky[(int)(zobrazit/10)]; 
            PORTC=znaky[(int)(zobrazit%10)]; 
	    _delay_ms(1000)
         } 
   } 
return 0; 
} 

ten cyklus jsem kdesi našel ale nevím jestli je správně zapsán

Chtěl bych vás poprosit jestli by jste mi nepomohli s tím jak zobrazovat i dvouciferná čísla.

Všem předem děkuji za odpověď.

Nahlásit jako SPAM
IP: 89.177.134.–
KIIV+42
God of flame
15. 8. 2013   #14
-
0
-

takhle by to mohlo fungovat... (teda aspon ze to zobrazi to jedno cislo)

ale asi bych se i vyhnul vsem tem intum, kdyz staci char... inty maj trosku slozitejsi operace nez chary na 8bitech

Nahlásit jako SPAM
IP: 213.220.241.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
16. 8. 2013   #15
-
0
-

PORTC=znaky[(int)(zobrazit%10)];  zde je výsledek nějaké desetinné číslo. Přetypováním na int vznikne 0. Takže to uprav na PORTC=znaky[(int)(10*zobrazit%10)];

Mnohem rychlejší by bylo vzít předchozí výsledek celočíselného dělení a odečíst ho od zobrazovaného čísla.

Tuším v math.h jsem viděl funkci, která vrací celočíselný podíl a zbytek po dělení, ta bude asi nejrychlejší, zřejmě je nejblíže způsobu jakým ALU dělení provádí.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
KIIV+42
God of flame
16. 8. 2013   #16
-
0
-

#15 hlucheucho
proc by to melo byt desetinny cislo? sak nikde "zobrazit" nemeni ... ci sem to jen nekde prehlidl?

Samozrejme na deleni deseti jsou i aproximace, kdy se to vynasobi konstantou a v hornich 8bitech se objevi vysledek.... na 8bitech to bylo vcelku docela presny

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
17. 8. 2013   #17
-
0
-

#16 KIIV
Jsem nadělal zmatek. Zbytek po dělení je celé číslo.

Nahlásit jako SPAM
IP: 188.95.60.–
hlucheucho+10
Posthunter
17. 8. 2013   #18
-
0
-

Projít zapojení:
-je zapojená společná anoda (nebo katoda?) u obou míst zobrazovače?
-co je na PORTC a PORTD? Nechat si zobrazit 88, oměřit voltmetrem
-je displej zapojen jako multiplexovaný?

hu

Nahlásit jako SPAM
IP: 188.95.60.–
KIIV+42
God of flame
17. 8. 2013   #19
-
0
-

taky jestli ma nejaky ochranny rezistory smerem k segmentum...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

ATmega a smyčka while — založil Palkic.89

ATmega a brown-out — založil morganzd

Programovanie v atmega 16 — založil BESTTRACKER

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý