Měření doby trvání impulsu

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
fabio
Příspěvky: 3
Registrován: 27 dub 2019, 13:53
Reputation: 0

Měření doby trvání impulsu

Příspěvek od fabio » 27 dub 2019, 14:01

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

Uživatelský avatar
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

Příspěvek od pavel1tu » 27 dub 2019, 15:42

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"
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Měření doby trvání impulsu

Příspěvek od gilhad » 27 dub 2019, 18:03

Jen bych dodal, že zadání trvá na vyřešení pomocí timeru a ne nějak jinak

fabio
Příspěvky: 3
Registrován: 27 dub 2019, 13:53
Reputation: 0

Re: Měření doby trvání impulsu

Příspěvek od fabio » 27 dub 2019, 22:32

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.

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;
  }
  
}

Uživatelský avatar
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

Příspěvek od pavel1tu » 28 dub 2019, 09:11

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

fabio
Příspěvky: 3
Registrován: 27 dub 2019, 13:53
Reputation: 0

Re: Měření doby trvání impulsu

Příspěvek od fabio » 06 kvě 2019, 13:21

Tak počítám, že takto by to šlo, když nikdo nepíše, že ne.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Měření doby trvání impulsu

Příspěvek od AstroMiK » 06 kvě 2019, 19:40

Kdyby nebyly povinné ty timery, tak na to má Arduino přímo speciální funkci :

Kód: Vybrat vše

pulseIn(pin, value, timeout)
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/

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů