Měření doby trvání impulsu
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Měření doby trvání impulsu
Ahoj všem,
prosím potřeboval bych poradit s následujícím úkolem.
Vytvoř program, který bude plnit jednoúčelovou funkci měření doby trvání impulsu v rozsahu 0.01 - 1 s.
Měřený impuls by byl přiváděn na externí porovnávací vstup vhodného interního časovače, který bude taktován vhodnou frekvencí odvozenou z interního hodinového generátoru a výsledná hodnota odesílána po sériovém portu ve formě textu.
Tak nějak moc nerozumím tomu zadání. Pochopil jsem to například, že budu měřit dobu stisknutí tlačítka, popřípadě dobu rozsvícení diody.
Mohl by mi někdo prosím poradit jak na to?
Děkuji
prosím potřeboval bych poradit s následujícím úkolem.
Vytvoř program, který bude plnit jednoúčelovou funkci měření doby trvání impulsu v rozsahu 0.01 - 1 s.
Měřený impuls by byl přiváděn na externí porovnávací vstup vhodného interního časovače, který bude taktován vhodnou frekvencí odvozenou z interního hodinového generátoru a výsledná hodnota odesílána po sériovém portu ve formě textu.
Tak nějak moc nerozumím tomu zadání. Pochopil jsem to například, že budu měřit dobu stisknutí tlačítka, popřípadě dobu rozsvícení diody.
Mohl by mi někdo prosím poradit jak na to?
Děkuji
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Měření doby trvání impulsu
Většina posledních dotazů je k maturitám.
Pánové, když už z tý školy s prominutím pííííp umíte, používejte google.
Já zadání chápu takto (když tedy nechápeš zdání):
1) na vstup arduina bude přiveden (třeba z tlačítka) signál - u Arduina je tlačítko třeba ošetřit proti zákmitům a to buď zapojením nebo v programu
2) změříš čas stisknutí toho tlačítka
3) změřený čas pošleš po seriovém portu
stačí dát hledat "Arduino Měření doby stisku tlačítka"
jsou i knihovny které ti sami vrátí čas, ale i pomocí základních příkazů to jde jednoduše vyřešit
PS: až něco zplodíš, můžeme pokračovat a pomoci s doladěním - nezapomeň sem hodit kod funkci "zobrazenikodu"
Pánové, když už z tý školy s prominutím pííííp umíte, používejte google.
Já zadání chápu takto (když tedy nechápeš zdání):
1) na vstup arduina bude přiveden (třeba z tlačítka) signál - u Arduina je tlačítko třeba ošetřit proti zákmitům a to buď zapojením nebo v programu
2) změříš čas stisknutí toho tlačítka
3) změřený čas pošleš po seriovém portu
stačí dát hledat "Arduino Měření doby stisku tlačítka"
jsou i knihovny které ti sami vrátí čas, ale i pomocí základních příkazů to jde jednoduše vyřešit
PS: až něco zplodíš, můžeme pokračovat a pomoci s doladěním - nezapomeň sem hodit kod funkci "zobrazenikodu"
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Měření doby trvání impulsu
Jen bych dodal, že zadání trvá na vyřešení pomocí timeru a ne nějak jinak
Re: Měření doby trvání impulsu
Ahoj ,
maturitní úloha to není. Jsem úplný začátečník, a po dvou hodinách jsem se ztratil, proto mě napadlo toto forum.
Pročetl jsem datasheet a něco zplodil. Zřejmě to funguje, ač to není úplně optimalizované.
Tlačítko mám ošetřené paralerně zapojeným kondenzátorem.
Nastavil jsem timer1. Hodnotu OCR1A jsem nastavil na 311.5, dle vzorce z datasheetu.
maturitní úloha to není. Jsem úplný začátečník, a po dvou hodinách jsem se ztratil, proto mě napadlo toto forum.
Pročetl jsem datasheet a něco zplodil. Zřejmě to funguje, ač to není úplně optimalizované.
Tlačítko mám ošetřené paralerně zapojeným kondenzátorem.
Nastavil jsem timer1. Hodnotu OCR1A jsem nastavil na 311.5, dle vzorce z datasheetu.
Kód: Vybrat vše
int buttonPin = 2; // nastaveni pinu tlacitka na pin 2
boolean buttonState = HIGH;
int counter = 0;
float time1 = 0;
void setup(){
//timer1 pro generování periody regulace (0,1(s))
TCCR1A=0;
TCCR1B=0;
TCCR1C=0;
TCNT1=0;
bitSet(TIMSK1, 1);
bitSet(TCCR1B, 3);
bitSet(TCCR1B, 2);
//zapne casovac s prescalem 512
OCR1A=311.5; // spocteno tak, aby ISR bylo spousteno s frekvenci 100Hz
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop()
{
if(counter>0)
{
time1 = recalculate(counter);
Serial.println(time1);
}
}
float recalculate(int cycle)
{
float t = (float) (cycle*0.005);
return t;
/*
* Spousti hardware s frekvenci 100Hz
* Tim je zajistena presnost 0.01s
*/
}
ISR(TIMER1_COMPA_vect)
{
buttonState = digitalRead(buttonPin);
if ( buttonState == HIGH )
{
counter++;
}
if ( buttonState == LOW )
{
counter = 0;
}
}
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Měření doby trvání impulsu
No, teď nemám chuť, večer to zkusím, celou noc jsem řešil něco u zákazníka a spaj asi hodinu, tak jsem trochu out.
Ale,
- dle mne počítáš počet cyklů programu (counter), což měří velmi nepřesně - cykl programu se odvíjí od délky a náročnosti programu.
- já bych asi použil funkci "millis()" - (unsigned long) - je to vnitřní časovač jak dlouho Arduino běží od zapnutí
- po stisku tlačítka bych si uložil třeba "CasON=millis()"
- po uvolnění "CasOFF=millis()"
- výsledný čas v milisekundách máš po odečtení těchto časů
- ještě by bylo možná dobré ošetřit přetečení interního časovače (jediná nevýhoda), najdi si tArduino timer overflov, ale myslím že to přeteče jednou za 50 dní, tak se jen zamysli jestli to řešit nebo ne
třeba ostatní poradí něco dalšího, já jsem K.O.
zatím pěkný den
Ale,
- dle mne počítáš počet cyklů programu (counter), což měří velmi nepřesně - cykl programu se odvíjí od délky a náročnosti programu.
- já bych asi použil funkci "millis()" - (unsigned long) - je to vnitřní časovač jak dlouho Arduino běží od zapnutí
- po stisku tlačítka bych si uložil třeba "CasON=millis()"
- po uvolnění "CasOFF=millis()"
- výsledný čas v milisekundách máš po odečtení těchto časů
- ještě by bylo možná dobré ošetřit přetečení interního časovače (jediná nevýhoda), najdi si tArduino timer overflov, ale myslím že to přeteče jednou za 50 dní, tak se jen zamysli jestli to řešit nebo ne
třeba ostatní poradí něco dalšího, já jsem K.O.
zatím pěkný den
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Měření doby trvání impulsu
Tak počítám, že takto by to šlo, když nikdo nepíše, že ne.
Re: Měření doby trvání impulsu
Kdyby nebyly povinné ty timery, tak na to má Arduino přímo speciální funkci :
Výsledek je čas trvání stavu na zadaném pinu v mikrosekundách, nebo nula, když vyprší timeout.
Detailní popis:
https://www.arduino.cc/reference/en/lan ... o/pulsein/
Kód: Vybrat vše
pulseIn(pin, value, timeout)
Detailní popis:
https://www.arduino.cc/reference/en/lan ... o/pulsein/
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů