Küsimus:
Kuidas ma saan proovivõtusagedust teada?
user3284376
2014-03-11 02:30:34 UTC
view on stackexchange narkive permalink

Hakkan proovivõtusageduste ja baudikiiruste jms osas natuke segadusse minema. Mul on see Arduino kood:

  #include <eHealth.h>extern volatile unsigned long timer0_overflow_count; float fanalog0; int analog0; unsigned long time; byte serialByte; void setup () {Serial.begin (9600);} void loop () {while (Serial.available () >0) {serialByte = Serial.read (); if (serialByte == 'S') {while (1) {fanalog0 = eHealth.getECG (); // Kasutage taimerit0 = > 1 linnuke iga 4 aja järel = (timer0_overflow_count << 8) + TCNT0; // Mikrosekundite teisendamine. aeg = (aeg * 4); // Simuleerimiseks faili printimine //Serial.print(time); //Serial.print (""); Seeriaprint (fanalog0,5); Serial.print ("\ n"); if (Serial.available () >0) {serialByte = Serial.read (); kui (serialByte == 'F') puruneb; }}}}}  

Kuna viivitust ei toimu, siis milline on proovivõtusagedus / sagedus? Kas see põhineb Arduino ADC kiirusel? Kas suurendan baudikiirust, kas suurendan proovivõtusagedust või lihtsalt kiirust, millega andmeid jadapordi kaudu saadan?

Seitse vastused:
#1
+22
alexan_e
2014-03-11 03:23:02 UTC
view on stackexchange narkive permalink

Arduino ADC taktsagedus on määratud ..arduino-1.5.5 \ hardware \ arduino \ avr \ cores \ arduino \ wiring.c

Siin on vastav osa

  #if define (ADCSRA) // Määrake A / D eelskaala teguriks 128 // 16 MHz / 128 = 125 KHz, soovitud vahemikus 50–200 KHz. // XXX: see ei tööta korralikult teiste taktsageduste korral ja // see kood peaks eelskale teguri määramiseks kasutama F_CPU. sbi (ADCSRA, ADPS2); sbi (ADCSRA, ADPS1); sbi (ADCSRA, ADPS0); // Luba A / D-konversioonid sbi (ADCSRA, ADEN); # endif  

16 MHz Arduino jaoks on ADC kell 16 MHz / 128 = 125 KHz. Iga AVR-i teisendamine võtab 13 ADC kella, seega 125 KHz / 13 = 9615 Hz.

See on maksimaalne võimalik proovivõtusagedus, kuid teie rakenduse tegelik proovivõtusagedus sõltub järjestikuste konversioonikõnede vahelisest intervallist. Kuna loete tulemust ja saadate jadapordi kaudu, saate viivituse, mis suureneb, kui baudikiirus väheneb. Mida madalam on baudikiirus, seda kauem kulub sama pikkuse andmete saatmiseks ja seda kauem kulub järgmise ADC teisenduse kutsumiseks.

Teie rakenduse tegeliku proovivõtusageduse saab määrata siluri või simulaatori, kuid lihtsam lahendus on vahetada digitaalne nööpnõel iga kord, kui teisendate, ja mõõta sagedust, millega digitaalne nööpnõel vahetab.

Samuti suureneb aeg minu ajatemplite vahel ~ 1300-st kuni ~ 16400-ni, kindlasti peaksid need jääma samaks? See on 9600 juures, 115200 juures, suurenevad nad pika aja möödudes ainult umbes 1500ni.
@user3284376 seoses teie ajatempli koodiga, ma arvan, et see ei saa alati töötada (mõned katkestajad võivad valel ajal kallutada). Ma soovitaksin teil postitada konkreetse küsimuse selle kohta, kuidas saada Arduinole täpset ajastust ja panna oma koodi vastav osa sinna.
#2
+7
Salar Khan
2015-09-26 18:05:19 UTC
view on stackexchange narkive permalink

Tahtsin saada ka projekti jaoks kõrget valimisagedust. selgub, et ADCSRA registri ADPS2, ADPS1, ADPS0 bitti saab konfigureerida nii, et saada proovivõtusagedus 76923 s / s või 76,8 ks / s. Kuid olge ettevaatlik, et käitan oma arduino ADC-d vabas režiimis, minu jaoks töötasid järgmised read.

  #ifndef cbi # define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit)) # endif # ifndef sbi # define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit)) # endifvoid setup () {// Seadke eelkaaleri väärtuseks 16 (16000KHz / 16 = 1MHz ) // HOIATUS: Üle 200KHz ei ole 10-bitised tulemused usaldusväärsed .//ADCSRA | = B00000100; sbi (ADCSRA, ADPS2); cbi (ADCSRA, ADPS1); cbi (ADCSRA, ADPS0); // ADIE seadistamine ADCSRAs ( 0x7A) ADC-katkestuse lubamiseks .// Ilma selleta ei käivitu sisemine katkestus .//ADCSRA | = B00001000; sbi (ADCSRA, ADIE)}  

Sel sagedusel on tavaline 10-bitised tulemused pole usaldusväärsed. See tähendab, et valimisageduse suurendamine vähendab tulemuste täpsust. Nii et ma kasutan ainult ülemist 8 bitti, kuna selle eelkalari korral on ülemised 8 bitti usaldusväärsed. Sellel lehel saate üksikasjadesse minna, see kutt rokib! ta tegi UNO http://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/ abil suure proovikiirusega ostsilloskoopi

#3
+4
user34028
2015-12-21 01:32:34 UTC
view on stackexchange narkive permalink

Saates 11 bitti järjestikuse kiirusega 9600 buuti, kuid proovivõtmise jaoks salvestan selle massiivi võimalikult vähese viivitusega, siis kui see on tehtud, saadan selle jadapordi kaudu pythonile lugemiseks stsenaarium. Ma teen seda FFT jaoks, kasutades matplotlibi. Kuulan 0–5 V signaali, seejärel ilma viivituse () funktsiooni kasutamata salvestan selle massiivi väärtused analoog-lugeja (). Sekundi murdosa jooksul tehakse lugemine ja seejärel algab jadandmete väljavõte. Kui kalibreerisin sisendsageduse, kasutades teise ühendatud Arduino tooni (), mõistsin, et täpsuse saamiseks 1 Hz täpsusega pean indeksit jagama 8915-ga. Kuna nõuetekohaste indeksintervallide saamiseks tuleks jagada proovivõtmise sagedusega, on minu arust Arduino proovivõtusagedus (vähemalt minu koodiga minu oma) 8915Hz.

#4
+3
Cybergibbons
2014-03-11 03:14:33 UTC
view on stackexchange narkive permalink

Iga silmus, mille printite 8 tähemärki 9600bit / s jadalingi kaudu. Iga tähemärk võtab 10 bitti (1 algus, 8 bitti tähemärgi jaoks, 1 peatus). See tähendab, et saate selle tsükli läbida ainult ~ 120 korda / s.

Funktsioon analogRead () võib teoreetiliselt proovida umbes 9600 korda / s, reaalselt on see umbes 8600 korda / s.

Teid piirab jadaühendus.

Kas suurendades 115200-ni, annab see 1440 korda / s, kas see on valimiskiirus?
Anna või võta, jah. Peate meeles pidama, et Serial nõuab, et teine ​​ots reageeriks, seega sõltute arvuti reageerimisest. See pole deterministlik, nii et saate närvi.
Teil on õigus asjade Arduino otsas, kõik näib hästi, kuid Pythonis on asjad palju aeglasemad, milliseid asju ma peaksin tegema, et suurendada jõudlust arvutilõpus?
Te ei pea seda käsitlema kui probleemi arvuti jadajõudlusega, vaid kuidas saada proovivõtmine andmete saatmisest lahti.
@Cybergibbons - ei, kuna see töötab Unos, kus USB ja jada on lahti ühendatud, pole PC-st sõltuvust peale S-märgi väljaandmise ja F-tähe väljastamise. Siia postitatud visand ja platvorm, millel see töötab, viskavad seerianumbrid õnnelikult USB-jadakaaslasele mikropilti, pimedalt unustamata, kui see või miski USB teises otsas püsib.
#5
+1
ThermoRestart
2019-07-06 01:52:31 UTC
view on stackexchange narkive permalink

Proovisageduse ja baudikiiruse erinevust käsitlevale osale viidates on erinevad mõõtmised.

Näidissagedus on sagedus, mille abil seade (arduino) saab sissetulevate analoogväärtuste digitaalset esitust uuesti luua.

Baudi kiirus on teabe edastamise kiirus sidekanalis. See kirjeldab mikrokontrolleri ja välismaailma (arvuti) vahelise suhtlemise kiirust.

Soovitaksin seda linki electronics_stack_exchange. https://electronics.stackexchange.com/questions/135056/sampling-rate-data-rate-and-bandwidth

#6
  0
E_Sh
2019-11-14 04:39:03 UTC
view on stackexchange narkive permalink

8915Hz - see on väga lähedal väärtusele 125000/14 ~ = 8928,6. Minu esialgne oletus, et külgnevate teisenduste vahel on vaja täpselt ühte tühikut Üks proovivõtuks mõeldud ADC-kell ja enda teisendamiseks 13 ADC-kella. Väike viga võib olla mitte täiusliku kellaallika mõju Arduino kohta. Ma pole veel kindel. See teema on minu jaoks praegu aktuaalne, kuna valimisse võetud andmed peavad andma digitaalset filtrit.

Ma pole kindel, mida mõtlete, kui ütlete "See teema on minu jaoks praegu aktuaalne, kuna valimisse kuuluvad andmed peavad digitaalset filtrit toidma". Kas teil on sarnane probleem?
Iga teisendamine algab ADC-kella tõusvas servas ja _ vähemalt_ üks ADC-kellatsükkel kaotatakse koodi täitmisel. Nii et jah, 8928,6 Hz on kiireim, kui helistate tihedas ringis `analogRead ()`, v.s. väga püsiv 9615,4 Hz vabarežiimis.
#7
  0
Gil
2020-08-20 00:34:06 UTC
view on stackexchange narkive permalink

Kas olete kaalunud Saleae või sarnase loogikaanalüsaatori hankimist? Lihtsad ja odavad tooted toimivad suurepäraselt ja võimaldavad teil neid mõõtmisi teha üsna lihtsalt. See töötab enamikus minu rakendustes paremini kui ulatus. Kui signaal kattub, kuvatakse see. Ma pühendan lihtsalt ühe tihvti testimiseks ja nimetan seda testpiniks. Rutiini alustades seadke see lihtsalt kõrgeks ja pärast lõpetamist madalaks. Sellel on 8 sisendit, nii et näete signaalide suhet. Saate jälgida A / D-d, käivitades päästiku ja asetades jada teisele tihvtile. Teiste asjade jaoks on teil veel 6 jäänud. Veeda sellega paar tundi ja see saab üheks teie kõige olulisemaks tööriistaks. Ma kasutan Linux Mint, nii et ma lihtsalt hoian seda teisel ekraanil, nii et lihtne klõps toob selle kuvale ja see töötab olenemata sellest, kas aken on vaatamiseks või mitte. Olge ettevaatlik, kui teil on kasutamata sisendeid, need toimivad antennina ja võtavad vastu signaale, eriti toiteallikatelt. Valige lihtsalt soovitud kanalid või eirake mitteolulisi kanaleid. Sisseehitatud analüsaatorid teevad jadasignaalidest lühikese töö.



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...