Kysymys:
Kuinka tarkka on pulseIn (): n ajoitus?
Peter Bloomfield
2014-02-20 17:03:18 UTC
view on stackexchange narkive permalink

Olen käyttänyt pulseIn () -toimintoa PWM-pohjaisen binääridatakoodauksen käsittelyyn. Se toimii hyvin erottamaan pulsseja, jotka ovat merkittävästi eri pituisia 500us vs. 1500us. Siksi se on enemmän kuin riittävä tyypillisten IR-kaukosäätimien käsittelyyn.

Haluan kuitenkin tehdä oman infrapunajärjestelmän, joka voi käyttää yli kahta pulssipituutta, jotta tiedonsiirto voi tapahtua nopeammin. Ihannetapauksessa haluaisin käyttää kahdeksan erilaista pulssipituutta oktaalikoodauksessa (esim. 200us, 400us, 600us jne.).

Olen huomannut melko merkittäviä vaihteluita pulseIn: n palauttamissa arvoissa () kuitenkin (+/- 10%). Oletan, että ainakin osa siitä otetaan käyttöön IR-lähetin- ja vastaanotinmoduuleilla, mutta minulla ei ole tarpeeksi hyviä laitteita sen varmistamiseksi.

Olettaen, että pystyn vähentämään ulkoista virhettä, on pulseIn () on todennäköisesti riittävän tarkka erottamaan tällaiset samanlaiset pulssit?

Kaksi vastused:
#1
+11
mpflaga
2014-02-21 09:38:55 UTC
view on stackexchange narkive permalink

Pulsein () -funktio on erittäin häviöllinen, koska se on kova silmukka ja palauttaa luvun * oletetut kellojaksot, joita se tarvitsee silmukkaa kohti

  ... // odota pulssi pysähtyy ((* portInputRegister (portti) &-bitti) == stateMask) {jos (numloops ++ == maxloops) palauttaa 0; width ++;} // muunna lukema mikrosekunteiksi. Silmukan on määritetty olevan 20 kellojaksoa pitkä ja siinä on noin 16 kelloa reunan // ja silmukan alun välillä. // Keskeytyskäsittelijät esittävät jonkin verran virhettä.return clockCyclesToMicroseconds (leveys * 21 + 16); 

Tarkin tapa PIN-koodin ajoitukseen on INPUT CAPTURE FEATURE. Katso tätä esimerkkiä. Se mahdollistaa sisääntulon sieppauksen yhdellä kertaa suorittimessa maksimi resoluutiolle ja tulotapin kukin reuna sieppaa ajastimen kellon arvon luettavaksi luodusta keskeytyspalvelusta. Se mahdollistaa myös ajastimen ylivuotokatkoksen, jotta voidaan säilyttää suuri absoluuttinen aika, kaapata. Koska 1x rullaa melko nopeasti. Sieppaukset tallentavat ajan matriisiin pääpiirin lukemista varten.


Missä signaaleja infrapunayhteyden kautta, tyypillinen kirjasto on shirriff / Arduino-IRremote -kirjasto. Jos sillä on useita demoja, jotka lukevat ja lähettävät IR: n demoduloidusta signaalista. Jotta yksi voisi rakentaa luonnoksen omasta suunnittelustaan. Tämä koodi luo alun perin ajastinkeskeytyksen, joka kysyy syöttötapin nopeudella, joka määritetään seuraavasti: IRremote.h-tiedosto. Tarkoituksissani olen vaihtanut sen 25 meihin. Mistä löydän tämän, voi silti puuttua pulssivirtoja.

Huomaa, että demodulaatio saavutetaan parhaiten infrapunavastaanottimessa, joka puolestaan ​​antaa tämän kiinnostavan signaalin. Mihin lisätä taustaa. Tyypillisen 38 kHz: n modulaation käyttö vastaa 26,3 uS: n vähimmäistarkkuutta pulssisykliä kohti. sherriffin kirjasto näyttää tyypillisesti, että suurin osa baudeista tai biteistä on luokkaa yli 10 pulssia. Ne näyttävät täyttävän haluamasi ajoitukset.

mikroterioni / Arduino-IRremote haaran työhaarukka parantaa vastaanottoa korvaamalla tapin ajastimen keskeytyksen kyselyn PinChangeInterrupts-toiminnolla. Olen yhdistänyt omaan mpflaga / Arduino-IRremote -haarukkaan, joka lisää useita muita ominaisuuksia.

Joten voit käyttää mitä tahansa yllä olevista kirjastoista. Tai luo oma sovellus, joka käyttää jompaa kumpaa alla olevista reunojen kaappaamiseen.

  1. kyselyt ajastintapahtumasta (esim. 50uS)
  2. sieppaa mikrot () PinChangeInterrupt
  3. käyttää syötteensiirtokatkoksia keskeyttääkseen tarkan ajan
Loistava vastaus. Arduino-IRremote on erittäin korkealaatuinen kirjasto. Helposti luettavissa ja siinä on paljon hyvin harkittu muotoilu, mikä tarkoittaa, että se on erittäin luotettava.
#2
+2
TheDoctor
2014-02-20 20:22:36 UTC
view on stackexchange narkive permalink

Tässä on joitain testituloksia pulseIn -testistä. Yksi Arduino lähetti oletettujen 14us-pulssien, ja toinen sylkäisi nämä tiedot:

18,18,18,12,18,18,18,18,18,18,18 , 18,18,18,18,18,18,24,19,18,18,18,18,18,24,18,18,18,19,18,18,12,18,18,19,18 , 18,18,18,18,18,18,18,18,18,18,19,18,19,24,18,18,18,18,18,18,18,24,18,18,18 , 18,18,18,18,18,18,18,18,18,18,19,18,18,18,18,18,18,18,18,18,18,19,18,18,18 , 11,18

Kuten näette, pulssit eivät ole missään nimessä tarkkoja. Aika olisi tarkempi, jos lähetys- ja vastaanottopäätö kirjoitettaisiin kokoonpanossa tai jopa siirrettäisiin heidän omille prosessoreilleen.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...