Küsimus:
Kuidas saab Arduino väljastada kindlat (st 56 kHz) kandesagedust?
jlbnjmn
2014-02-24 06:55:35 UTC
view on stackexchange narkive permalink

Töötan tasuta ruumioptika projektiga, et saata andmeid juhtmeta kahe punkti vahel. Selle saavutamiseks kasutan Arduino Unoga ühendatud IR-valgusdioodi, mis impulssib saatja jaoks 56 kHz kandesagedusega ja teist Arduino 56 kHz IR-detektori mooduliga vastuvõtja jaoks.

Proovisin kandesageduse loomiseks viivitusmikrosekundite () abil tihvtide kõrge ja madal madalam käskude vahel. Selline toimib, kuid sagedus ei ole alati sama ja signaali pulseerimisega seotud täiendavad viivitused (st funktsiooni kutsumiseks ja vähendamiseks kuluv aeg) võivad seda muuta.

ATmega328 näib, et kiibi taimerite abil on võimalik määrata täpsem impulss. Kas see on võimalik ja kui jah, siis kuidas luua taimeritega 56 kHz impulss?

Millist täpsust vajate oma 56KHz sagedusel? St. milline sagedusvahemik on teie projektis vastuvõetav? Küsin, sest ainult Arduino taimerite kasutamisel on täpsusel piirangud.
55,5–56,5 khz oleksid ideaalsed, et detektoris oleks kõrge reageeritavus.
Viis vastused:
#1
+10
jfpoilpret
2014-02-25 02:45:44 UTC
view on stackexchange narkive permalink

56 kHz signaali on tõesti võimalik genereerida Arduino taimeriga .

Taimerit saab tegelikult näha MCU-s spetsiaalse registrina, millel on väärtus (alates 0-st), mida suurendatakse sagedusel, mis on MCU taktsagedus (Arduino Unol 16 MHz), võimalus jagatud teguriga nimega prescaler . Kui see väärtus jõuab teie määratud piirini, mida nimetatakse Võrdle vastet , juhtub kaks asja:

  • Taimerregistri väärtus lähtestatakse väärtusele 0.
  • Üks ISR (teenuse rutiini katkestamine) tagasihelistamisfunktsioon kutsutakse (saate selle määratleda oma koodile osutamiseks).

Idee on kasutada see ISR muudab loogilise tihvti väljundit iga kord, kui seda kutsutakse ( HIGH , siis LOW , siis HIGH ...).

56 kHz ruutlaine genereerimiseks peate oma ISR-i kutsuma 56000 * 2 korda sekundis ( * 2 kuna peate väljundväärtust perioodi jooksul kaks korda muutma).

Taimerile soovitud eelkalkulaatori väärtuse saate valida järgmisest loendist:

  • 1 (taktsagedus pole jagatud, seega 16 MHz)
  • 8 (taktsagedus jagatakse 8-ga, seega 2 MHz)
  • 64
  • 256
  • 1024

Arduino Unol on kahes suuruses taimereid / loendureid (need on nimega taimer / loendur tegelikult): 8 bitti ja 16 bitti.

Arduino Uno (ATmega328P) puhul on teil kokku kolm taimerit, kuid mõnda neist võib Arduino tuum kasutada teek või muud visandid, mida teie visandites kasutatakse (peate seda ise kontrollima):

  • taimer0 (8-bitine)
  • taimer1 (16-bitine)
  • taimer2 (8-bitine): sellel on rohkem eelskaleerimise võimalusi (1, 8, 32, 64, 128, 256 ja 1024)

Nüüd peate genereerige 56 kHz laine 16 MHz-st, seega peate ilma eelskaleerimiseta loendama:

16000000 / (56000 * 2) - 1 = 141,857 ( - 1 kuna taimer loeb 0-st selle väärtuseni ja lähtestab ainult pärast > see on saavutatud)

Selle arvutuse põhjal võime teha kaks tähelepanekut:

  1. 141.857 ei ole täisarv ja seega võitsite ' ei saa genereerida täpselt 56 kHz lainet.
  2. Ilma eelskaleerimiseta vajate 16-bitist taimerit, kuna 285 ei ole esindatav 8-bitise allkirjata täisarvuna.

Nüüdseks on teil kaks võimalust:

  1. kasutage 16-bitist taimerit ( taimer1 ), kasutage prescaler = 1 ja valige 142 kood> Võrdle vastena; see annab teile järgmise sageduse: 16000000 / (2 * (142 + 1)) = 55944 Hz
  2. Kasutage 8-bitist taimerit ( taimer0 ), kasutage prescaler = 8 ja valige Võrdle vasteks 17 ; see annab vähem täpsust järgmise sagedusega: 16000000 / (8 * 2 * (17 + 1)) = 55555 Hz mis on endiselt nõutavas vahemikus.

Nüüd, mis puudutab visandi kirjutamist selle kohta, soovitan teil tutvuda selle juhendiga, mis on väga täielik ja väga huvitav lugeda.

Muidugi, ATmega328P täielik andmeleht on oluline ka siis, kui soovite vähimatki üksikasju mõista, mida teete.

Mõned olulised märkused:

  • ISR täidetakse puudega katkestustega ja see peab seega olema võimalikult lühike. Eelkõige on Arduino raamatukogus mitmeid funktsioone, mida ISR-ist ei saa kutsuda.
  • Arduino Uno kell pole eriti täpne (see kasutab kvartsi asemel keraamilist resonaatorit, mis oleks olnud palju täpsem), seega tähendab see, et väljundsagedus nihkub veelgi.
Ka siis, kui määratud piir on saavutatud, saab * riistvara * tihvti vahetada. Seega pole ISR-i üldse vaja kasutada. ISR-iga on alati * värisemine *, kuna käsku ei saa pärast selle käivitamist katkestada. Kuid riistvara vahetab tihvti alati soovitud kiirusega.
On mõnevõrra üllatav, et Arduino Uno kasutab keraamilist resonaatorit, kuid selle allikaks on * [Arduino UNO KKK] (https://learn.adafruit.com/arduino-tips-tricks-and-techniques/arduino-uno- KKK) * (lähedal * "Kas Uno kasutab protsessori kella jaoks resonaatorit või kristalli?" *).
#2
+3
Peter Bloomfield
2014-02-24 18:02:05 UTC
view on stackexchange narkive permalink

Olen leidnud, et tone () on kasulik kõrgsageduslike impulsside genereerimiseks mis tahes tihvtil. See peaks hakkama saama 56 KHz-ga. (Redigeerimine: Nagu märkis jfpoilpret, on lähim, mida 16 MHz Arduinole tegelikult saada on, umbes 55,944 KHz)

Ilmselt on raskus selle ühendamine teie andmesignaaliga. Ma ei usu, et te saaksite seda tarkvaras teha ilma madala taseme koodita. See peaks olema riistvaras küllaltki lihtne, kuna see on digitaalne.

Kõik, mida peate tegema, on andmesignaali väljastamine teisele pinile ja seejärel kombineerimine operaatoriga AND-värava abil. Kombineeritud signaal võib minna otse teie infrapunasaatja juurde.

Kui teil pole AND-väravat käepärast, on üsna lihtne oma transistoride abil oma teha. Otsige lihtsalt veebis "transistor ja värav".

Sageli on vastuvõtjatel aktiivne madal väljund. Kui ühendate valgusdioodi ülemise osa 56 kHz ja alumise osa oma andmepoldi külge, siis kui andme tihvt langeb madalale, saate IR-väljundi, mis peaks vastuvõtja madalaks tegema. Ei vaja väravat, piisab vaid juhtmest ja takistist. Ainus probleem on piiratud kõigega, mida praegused io tihvtid suudavad juhtida.
#3
+2
zzz
2014-04-01 09:10:47 UTC
view on stackexchange narkive permalink

jfpoilpret'i aktsepteeritud vastus on väga hästi kirjutatud, täiesti kehtiv ja 99% juhtudest teen täpselt seda, mida ta selgitab. Tema lahendused vastavad teie määratletud parameetritele, nii et need peaksid töötama väga hästi. Kuid mis on parem kui " väga hästi "? Täiuslikkus! Lõppude lõpuks on küsimus täpse väärtuse loomises. Nagu öeldud, on enamasti piisavalt lähedal (väidetavalt kõik) piisavalt lähedal ja isegi kui tegelete millegagi kelladena, kui 1 sekund peab olema 1 sekund, peate ikkagi kannatama pärilike osade puuduste all.

Mida ma soovitada ei ole alati võimalik. Mõnel juhul on see võimalik, kuid palju rohkem vaeva ja vaeva kui antud juhul. Kas see on väärt, sõltub juhtumipõhiselt. Minu eesmärk on enamasti näidata tulevaste viidete jaoks alternatiivi, mis on mõnevõrra erandjuhtudel parem. See on kirjutatud algajaid Arduino kasutajaid silmas pidades, kellel pole laialdast elektroonikakogemust.

Edasijõudnutele tundub see ilmselt liiga sisukas ja tummaks tehtud. Aga ma usun, et need samad inimesed ilmselt juba teavad seda ega vaja seda vastust. See kehtib ka iga mikrokontrolleri ning iga tootja ja arhitektuuri kohta. Kuid teiste mikrokontrollerite puhul peate nõuetekohaste registrite ning eelskalasse kuuluvate nimede ja väärtuste väljaselgitamiseks pöörduma õige andmelehe poole.

Teie puhul vajate kindlat sagedust ja tore on see, et täpselt 56 kHz saab tegelikult saavutada väga lihtsalt (arvestamata osade praktilisi puudusi). Nii et see on ka suurepärane näide.

Signaali genereerimine sõltub mikrokontrolleri taimeritest ja kella allikast, nagu jfpoilpret hästi selgitab. Tema vastus käsitleb ainult ühe vaatenurga probleemi ja see on taimeritega möllamine. Kuid võite ka kella allikaga sebida või veelgi parem nii sünergia kui ka suurepäraste tulemuste saavutamiseks. Keskkonna parameetrite muutmisega, antud juhul süsteemi häkkimisega ja kella allika asendamisega saame konkreetse probleemiga toime tulla palju, palju hõlpsamalt ja lihtsamalt.

Kõigepealt tuleb meelde tuletada, kuna lülitamine toimub pin-olekus, peate ISR-i käivitama kaks korda rohkem kui signaali sagedus. See on 112 000 korda sekundis. 56 000 ja 16 000 000 ei liida eriti kenasti, nagu juba märgitud. Peame muutma kas signaali sagedust või taktitihedust. Tegeleme praegu muutumatu signaali sagedusega ja leiame parema taktsageduse.

Kõige lihtsam oleks valida kell, mille suurusjärk on suurem kui 56 kHz (või 112 kHz, kuid see on praktiliselt sama), kuna lisate ainult nulli ja selline matemaatika on enamiku inimeste jaoks kõige lihtsam. Kahjuks on kõik siin maailmas mingi kompromiss millegagi. Kõik väärtused ei tööta.

Esimene näide on liiga väikese taktigeneraatori kiirusega.

Kui valite kella 56 000 Hz, ei saa te enam midagi teha peab igal tsüklil helistama ISR-ile ega saa midagi muud teha. See on täiesti kasutu. Kui valite kümme korda suurema kiiruse (560 kHz), on teie töö tegemiseks 9 (10 tsüklit, kuni taimer saavutab maksimaalse väärtuse - üks tsükkel ISR-funktsiooni kutsumiseks) mikrokontrolleri tsüklid ja see võib täiesti olla ebapiisav. Teil on sageli vaja rohkem arvutusvõimsust.

Kui valite teisest küljest liiga suure väärtuse, kuna 56 MHz ei saa mikrokontroller sellega lihtsalt töötada. See on liiga kiire. Nii et ka poe suurima väärtuse valimine ei vähenda seda.

Originaalse Arduino Uno R3 aktsiakell on 16 MHz, nii et kõik aeglasem, mis töötab, on garanteeritud. Järgmine väärtus, mis on suurusjärgus suurem kui 56 ja väiksem kui 16 MHz, on 5,6 MHz. See võimaldab ISR-ile helistada iga 50 tsükli järel ja loob täiusliku 112 000 Hz taimeri sageduse. Ja teie signaal on täpselt 56 kHz. Teil on 49 MCU tsüklit programmi käivitamiseks ISR-i kõnede vahel, kuid see on endiselt umbes 1/3 algse kella kiirusest. Võib kasutada alusena 112 ja 11,2 MHz kella ning see annab umbes 2/3 põhivarustusega 16 MHz resonaatorist. ISR-funktsiooni kutsutakse iga 100 tsükli järel ja see loob endiselt täiusliku 56 kHz signaali.

Nende väärtustega on siiski kaks peamist probleemi.

  • Esimene probleem sõltub tõsiselt teie vajadustest: ohverdate umbes 1/3 (kiirusega 11,2 MHz) oma maksimaalsest arvutusvõimsusest, et saada täpne signaali sagedus, mis kasutab hõlpsasti leitavat registriväärtust (OCR iirc ). Võib juhtuda, et sellega läheb hästi või mitte.

  • Teine probleem on kõva showstopper : väärtuste leidmine on väga lihtne, kuid väga sageli neid lihtsalt ei eksisteeri valmistatud kella allikana. See on Farnelli resonaatori veebileht , millel pole lihtsalt nii 5,6 MHz kui ka 11,2 MHz.

Sellest möödahiilimiseks saame vaadake saadaolevaid resonaatori väärtusi ja uurige midagi muud, mida saab kasutada täpselt soovitud väärtuste genereerimiseks. Kui jagame 56 4-ga, saame 14 ja õnneks on olemas 14 MHz resonaator. See annab meile palju suurema kiiruse ja suurema võimsuse ning sama hõlpsasti leitava registriväärtuse. ISR-i helistamiseks 112 000 korda sekundis peame OCR-i registrisse lisama kümnendkoha väärtuse 124 või kuueteistkümnendkoha väärtuse 0x7C, nii et loendades ISR-i helistamiseks 124 tsüklit + 1, saame soovitud täiusliku väärtuse.

NB

  1. ISR - katkestage teenuse rutiin (see on kood, mis käivitatakse ainult loodud katkestustel)
  2. Kui suur võib teie programm olla, sõltub mälu suurusest! Sellel pole mingit pistmist taktsagedusega ega midagi pistmist ISR-i helistamise sagedusega.
  3. Kui mikrokontroller käivitab programmi käsklusega, suureneb loendur. Katkestuse tekitamise korral kutsutakse ISR ja see väärtus salvestatakse spetsiaalsesse registrisse. Kui ISR-kood on lõpule jõudnud, taastatakse programmiloenduri väärtus sellest spetsiaalsest registrist ja programm jätkub sealt, kus see katkestati, nagu poleks seda kunagi juhtunud.

    Toon äärmiselt tummaks muudetud näite . Kui olete purist, hoiatan teid: võib tekkida nina- ja silmaverejooks.

    Kujutage ette, et peate kuskilt kuhugi kõndima. Üksikasjalikud marsruudi juhised on teie peamine programm ja selle käsud. See, kui kiiresti te kõnnite või joostate, sõltub teie "kella kiirusest", kuid mitte marsruudi juhistest (30 sammu edasi, 1 pööret 90 grad. Vasakule, 10 sammu edasi, 45 grad. Paremale jne.) Need on alati samad . Kujutage nüüd ette, et mõni väike laps või ahne korrumpeerunud kohalik poliitik võtab teie kingad vahel lahti. See on sündmus, mis tekitab katkestuse. Siis peatud pärast viimast sammu, põlvitad ja seod oma kinga uuesti kinni. See on teie ISR-i programm.

    Seejärel jätkate peatatud kohast; sa ei alusta otsast peale. Kui kõnnite ilma hoolitsuseta kogu maailmas ja kogu aeg, pole teil vahet, isegi kui peate oma jalanõu igal teisel sammul kinni siduma. Kui teete seda siiski ajaliste piirangutega, näiteks olümpiamängudel 100 meetri jooks (või jookseb näljase lihasööja kiskja eest), võivad jalanõude peatamisel ja sidumisel olla kohutavad tagajärjed. Sama on mikrokontrolleritega. Isegi kui täidate ainult ühe koodirea, jätkub teie programm, ehkki aeglaselt. Kui sa ei hooli kiirusest üldse, pole see probleem. Kui peate tegema mõnda aega, näiteks kasutama muid taimerist sõltuvaid toiminguid, võib sekkumine olla väga soovimatu ja problemaatiline.

  4. Vähem on rohkem! Kiirem kell pole alati parem. Aeglasema kellaga seadmed kasutavad tunduvalt vähem energiat. See võib olla patareidega töötava seadme oluline punkt.

  5. Vajalikud tsüklid tuletatakse järgmistest valemitest:
    (taktsagedus / (eelskaaleri väärtus * vajalik ISR) helistamissagedus)) - 1

TLDR: tühjendage keraamiline 16 MHz ostsillaator ja asendage see teisega, mis võimaldab * täpselt * 56 kHz täisarvujaotusega (nt 14 MHz ja jagada 250-ga).
#4
  0
kiwiron
2014-03-31 14:51:33 UTC
view on stackexchange narkive permalink

Kanduri saate sisse ja välja lülitada, lülitades kanduri tihvtirežiimi väljundi ja sisendi vahel. Olen seda kasutanud soojuspumba juhtimiseks läbi 37KHz infrapuna (kaugjuhtimispuldi) pordi.

#5
  0
kiwiron
2014-04-01 13:12:01 UTC
view on stackexchange narkive permalink

Operaatori loomiseks pole vaja kasutada ISR-i. Lihtsalt seadistage taimer 50% PWM väljundi saamiseks vajalikul kandesagedusel. ISR vastutab siis lihtsalt kanduri moduleerimise eest - tavaliselt 0,5 või 1 ms intervalliga - palju mugavama kiirusega. Minu kogemuste kohaselt on enamus infrapunavastuvõtjaid 5% viga kandesageduses talutav. Kasutasin Freetronics EtherMega 2560 (millel on palju taimereid), kuid olen kindel, et ka teised protsessorid saavad sama hästi hakkama.

Kuidas siis kanduri modulatsiooni täpselt rakendatakse? Kas muuta taimeriväljundi hõivamisnupu režiimi sisendi (kandja välja) ja väljundi (kandja sees) vahel?


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...