Kysymys:
Mistä tiedän näytteenottotaajuuden?
user3284376
2014-03-11 02:30:34 UTC
view on stackexchange narkive permalink

Olen hämmentynyt näytteenottotaajuudesta ja baudinopeudesta jne. Minulla on tämä Arduino-koodi:

  #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') {kun (1) {fanalog0 = eHealth.getECG (); // Käytä ajastinta0 = > 1 rasti 4: n välein joka kerta = (timer0_overflow_count << 8) + TCNT0; // Mikrosekunnin muunnos. aika = (aika * 4); // Tulosta tiedosto simulointia varten //Serial.print(time); //Serial.print (""); Sarjaprintti (fanalog0,5); Sarja.tulos ("\ n"); if (Serial.available () >0) {serialByte = Serial.read (); jos (serialByte == 'F') rikkoutuu; }}}}}  

Koska viivekatkaisua ei ole, mikä on näytteenottotaajuus / taajuus? Perustuuko se Arduino ADC -nopeuteen? Kun kasvatan baudinopeutta, lisäänkö näytteenottotaajuutta vai vain nopeutta, jolla lähetän tietoja sarjaportin kautta?

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

Arduino ADC -kellonopeus on asetettu ..arduino-1.5.5 \ hardware \ arduino \ avr \ ytimet \ arduino \ wiring.c

Tässä on asiaankuuluva osa

  #if määritelty (ADCSRA) // Aseta A / D-esiasteikertoimeksi 128 // 16 MHz / 128 = 125 KHz, halutun 50-200 KHz alueen sisällä. // XXX: tämä ei toimi oikein muilla kellonopeuksilla, ja // tämän koodin tulisi käyttää F_CPU: ta esiasteikertoimen määrittämiseen. sbi (ADCSRA, ADPS2); sbi (ADCSRA, ADPS1); sbi (ADCSRA, ADPS0); // Ota A / D-muunnokset käyttöön sbi (ADCSRA, ADEN); # endif  

16 MHz: n Arduinolle ADC-kelloksi on asetettu 16 MHz / 128 = 125 KHz. Jokainen muunnos AVR: ssä vie 13 ADC-kelloa, joten 125 KHz / 13 = 9615 Hz.

Se on suurin mahdollinen näytteenottotaajuus, mutta sovelluksen todellinen näytteenottotaajuus riippuu peräkkäisten konversiopuheluiden välisestä ajasta. Koska olet lukenut tuloksen ja lähettänyt sen sarjaportin kautta, saat viiveen, joka kasvaa siirtonopeuden laskiessa. Mitä alhaisempi siirtonopeus, sitä kauemmin saman pituisen tiedon lähettäminen kestää ja sitä kauemmin seuraavaan ADC-muunnokseen soittaminen kestää.

Sovelluksen todellinen näytteenottotaajuus voidaan määrittää käytöllä virheenkorjaimen tai simulaattorin, mutta helpompi ratkaisu on vaihtaa digitaalinen tappi aina, kun suoritat muunnoksen, ja mitata taajuus, jolla digitaalinen tappi vaihtaa.

Myös aikaleimojen välinen aika kasvaa ~ 1300: sta aina ~ 16400: een, varmasti niiden pitäisi pysyä samana? Se on 9600, 115200, ne kasvavat vain noin 1500: een pitkän ajan kuluttua.
@user3284376 aikaleimakoodisi suhteen, mielestäni se ei voi toimia koko ajan (jotkut keskeytykset voivat olla puolueellisia väärään aikaan). Ehdotan, että lähetät erityisen kysymyksen siitä, kuinka saada tarkkaa ajoitusta Arduinolle ja laittaa koodisi vastaava osa sinne.
#2
+7
Salar Khan
2015-09-26 18:05:19 UTC
view on stackexchange narkive permalink

Halusin myös saada korkean näytteenottotaajuuden projektille. osoittautuu, että ADCSRA-rekisterin ADPS2-, ADPS1-, ADPS0-bitit voidaan konfiguroida saamaan näytetaajuus 76923 s / s tai 76,8 ks / s. Mutta varokaa, että suoritan arduinoni ADC: tä vapaassa käynnissä, seuraavat rivit toimivat minulle.

  #ifndef cbi # define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bitti)) # endif # ifndef sbi # määritä sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit)) # endifvoid setup () {// Aseta esikalkkeri arvoon 16 (16000KHz / 16 = 1MHz ) // VAROITUS: Yli 200 KHz: n 10-bittiset tulokset eivät ole luotettavia .//ADCSRA | = B00000100; sbi (ADCSRA, ADPS2); cbi (ADCSRA, ADPS1); cbi (ADCSRA, ADPS0); // Aseta ADIE ADCSRA: ssa ( 0x7A) ADC-keskeytyksen ottamiseksi käyttöön .// Ilman tätä sisäinen keskeytys ei laukaise .//ADCSRA | = B00001000; sbi (ADCSRA, ADIE)}  

Tällä taajuudella tavallinen 10-bittiset tulokset eivät ole luotettavia. Se tarkoittaa, että otosnopeuden lisääminen vähentää tulosten tarkkuutta. Joten käytän vain ylempiä 8 bittiä, koska tällä esikalarilla ylemmät 8 bittiä ovat luotettavia. Voit mennä tarkemmin tälle sivulle, tämä kaveri rokkaa! hän teki korkean näytteenottotaajuuden oskilloskoopin UNO: n avulla http://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/

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

Lähetän 11 ​​bittiä sarjalta 9600 baudilla, mutta näytteenottoa varten tallen sen matriisiin mahdollisimman pienellä viiveellä, ja kun se on valmis, lähetän sen sarjaportin kautta pythonin lukemaan käsikirjoitus. Teen tämän FFT: lle matplotlibiä käyttäen. Kuuntelen 0–5 V: n signaalia ja tallentan analogRead () -arvot tähän taulukkoon ilman delay () -toimintoa. Sekunnin murto-osassa lukeminen on valmis, sitten sarjatietotiedosto alkaa. Kun kalibroin tulotaajuuden käyttämällä toisella liitetyllä Arduinolla olevaa ääntä (), tajusin, että minun oli jaettava indeksi 8915: llä saadaksesi tarkkuuden .1 Hz: n tarkkuudella. Koska joudutaan jakamaan näytteenottotaajuudella, jotta saadaan oikeat indeksivälit, arvaan, että Arduinon näytteenottotaajuus (ainakin minun koodini kanssa) on 8915Hz.

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

Jokainen silmukka, jonka tulostat 8 merkkiä 9600 bps: n sarjalinkillä. Jokainen merkki vie 10 bittiä (1 alku, 8 bittiä merkille, 1 stop). Tämä tarkoittaa, että voit käydä tämän silmukan läpi vain ~ 120 kertaa / s.

Funktio analogRead () voi teoriassa näytellä noin 9600 kertaa / s, realistisesti se on noin 8600 kertaa / s.

Sarjayhteys rajoittaa sinua.

Joten nousu 115200: een antaa 1440 kertaa / s, onko näytteenottotaajuus?
Anna tai ota, kyllä. Sinun on pidettävä mielessä, että Serial edellyttää, että toinen pää vastaa, joten olet riippuvainen tietokoneen vastauksesta. Tämä ei ole determinististä, joten saat hermostuneisuutta.
Olet oikeassa asioiden Arduino-päässä, kaikki näyttää hyvältä, mutta Pythonissa asiat ovat paljon hitaampia, minkälaisia ​​asioita minun pitäisi tehdä voidakseni parantaa suorituskykyä tietokoneiden lopussa?
Sinun ei tarvitse katsoa tätä ongelmaksi tietokoneen sarjakuvauksessa, mutta miten saat otoksen irti datan lähettämisestä.
@Cybergibbons - ei, koska tämä toimii Unossa, jossa USB ja sarja on irrotettu, ei ole riippuvuutta tietokoneesta sen jälkeen, kun annetaan S-merkki ja F-merkki. Tähän lähetetty luonnos ja alusta, jolla se toimii, heittää sarjatiedot mielellään USB-sarjaan kuuluvalle mikromikrofonille, sokeasti unohtamassa, jos USB-portin toisessa päässä oleva tai mikä tahansa pysyy mukana.
#5
+1
ThermoRestart
2019-07-06 01:52:31 UTC
view on stackexchange narkive permalink

Viitaten näytteenottotaajuuden ja baudinopeuden eroa koskevaan osaan, ne ovat erilaisia ​​mittauksia.

Näytetaajuus on taajuus, jolla laite (arduino) voi luoda digitaalisen esityksen tulevista analogisista arvoista.

Siirtonopeus on nopeus, jolla tietoa siirretään tietoliikennekanavalla. Se kuvaa mikro-ohjaimen ja ulkomaailman (tietokoneen) välisen tiedonsiirtonopeuden.

Suosittelisin tätä electronics_stack_exchange-linkkiä. 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 - se on hyvin lähellä arvoa 125000/14 ~ = 8928.6 Alkuperäinen arvaukseni, että vierekkäisten muunnosten välillä tarvitaan täsmälleen yksi aukko Yksi ADC-kello näytteenottoa varten ja 13 ADC-kelloa itse muuntamista varten. Pieni virhe voi johtua epätäydellisestä kellolähteestä Arduinosta. En ole vielä varma. Tämä aihe on minulle ajankohtainen, koska näytetietojen on syötettävä digitaalista suodatinta.

En ole varma, mitä tarkoitat sanomalla "Tämä aihe on minulle todellinen nyt, koska näytetietojen on syötettävä digitaalista suodatinta". Onko sinulla samanlainen ongelma?
Jokainen muunnos alkaa ADC-kellon nousevalta reunalta, ja _ ainakin_ yksi ADC-kellosykli menetetään suorittamalla koodi. Joten kyllä, 8928,6 Hz on nopein, jonka saat kutsumalla `` analogRead () '' tiukassa silmukassa, v.s. erittäin tasainen 9615,4 Hz vapaassa tilassa.
#7
  0
Gil
2020-08-20 00:34:06 UTC
view on stackexchange narkive permalink

Oletko harkinnut Saleaen tai vastaavan logiikan analysaattorin hankkimista. Yksinkertaiset, halvat, toimivat hyvin ja antavat sinun tehdä nämä mittaukset melko helposti. Tämä toimii paremmin kuin laajuus useimmissa sovelluksissani. Jos signaali on päällekkäinen, se näkyy. Omistan yksinkertaisesti yhden nastan testaukseen ja kutsun sitä testineulaksi. Aseta se vain korkealle aloittaessasi rutiinia ja sitten matalalle, kun olet valmis. Siinä on 8 tuloa, joten näet signaalien välisen suhteen. Voisit seurata A / D: tä, käynnistää liipaisimen ja sijoittaa sarja toisen nastan päälle. Sinulla on vielä 6 jäljellä muihin asioihin. Vietä muutama tunti sen kanssa, ja siitä tulee yksi tärkeimmistä työkaluistasi. Käytän Linux Mintia, joten pidän sitä vain toisella näytöllä, joten yksinkertainen napsautus tuo sen näkyviin ja se toimii riippumatta siitä, onko ikkuna näkyvissä vai ei. Ole varovainen, jos sinulla on käyttämättömiä tuloja, ne toimivat antennina ja ottavat vastaan ​​hajasignaaleja erityisesti virtalähteistä. Valitse vain haluamasi kanavat tai ohita ne, joilla ei ole merkitystä. Sisäänrakennetut analysaattorit tekevät lyhyen sarjasignaalin.



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