Stránka 1 z 1

Měření doby trvání impulsu

Napsal: 27 dub 2019, 14:01
od fabio
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

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

Napsal: 27 dub 2019, 15:42
od pavel1tu
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"

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

Napsal: 27 dub 2019, 18:03
od gilhad
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

Napsal: 27 dub 2019, 22:32
od fabio
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;
  }
  
}

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

Napsal: 28 dub 2019, 09:11
od pavel1tu
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

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

Napsal: 06 kvě 2019, 13:21
od fabio
Tak počítám, že takto by to šlo, když nikdo nepíše, že ne.

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

Napsal: 06 kvě 2019, 19:40
od AstroMiK
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/