Hur minimerar jag prescalern i Arduino UNO?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Hej!

Jag har rätt nyligen fått veta att samplingen i UNO går onödigt långsamt pga av att nåt som kallas prescaler delar ner systemklockan (16MHz) hela 128ggr.

Jag vet inte alls hur mycket denna effektiva klocka (som vi kan kalla E-klocka som då är på 8MHz) används men tydligen används den åtminstone för A/D.

Jag kan dock tänka mig att denna E-klocka i praktiken är den klocka som hela processorn egentligen går på.

Eftersom jag har problem med att hinna med med mitt samplingskrav så är det extra intressant om denna prescaler tom kunde sättas till 1.

Samtidigt tror jag det är omöjligt för en poäng med prescaler kan vara "wave-shaper" dvs den råa kristallens svängning är förmodligen inte perfekt.

Men varför man nyttjar hela 128 gångers neddelning av systemklockan i default, det fattar jag inte.

Eftersom jag är en bekväm jävel skulle jag vilja veta exakt hur man ställer om denna prescaler och hur pass lite neddelning man kan sätta den till.

Vore också roligt om Ni kunde tala om huruvida mitt spekulerande är rätt eller fel.

MVH/Roger
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Icecap »

A/D-omvandlaren är inte hur snabb som helst. I databladet står det max. clock den kan jobba med.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Tack, Icecap!

Du fick mig att kolla upp databladet för A/D'n och där står det lite fascinerande:

"If a lower resolution than 10 bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate."

och

"A normal conversion takes 13 ADC clock cycles"

För det första, ADC kan normalt sett inte jobba med högre frekvens än 200kHz (och det för 10 bitars upplösning).

Då gissar jag att för åtta bitars upplösning kan den jobba med 10/8*200kHz=250kHz, men det är bara en inkompetent ( ;) ) gissning.

I vilket fall klarar den 200kHz som ADC-klocka, sen behöver den 13 cykler för att konvertera en byte, säger vi, dvs effektiv "byte-tid" är runt 20kHz.

Den tycks alltså vara ännu sämre än befarat ty 1 Byte/20kHz verkar vara ungefär max (man kan dock tydligen pressa ADC-klockan en aning om en "riktig" byte är vad man vill ha).

För övrigt finns det tre pinnar modell MUX som kan selecta 1 av 7 tillgängliga neddelningar, det står dock att ADC-frekvensen inte får vara högre än 200kHz och som jag förstår det så är den satt till nära det (16MHz/128=125kHz).

Så här står det:
"By default, the successive approximation circuitry requires an input clock frequency between 50
kHz and 200 kHz to get maximum resolution".

Frågan är om 200kHz som "requires" är ett maximum eller bara en rekommendation?

Fast eftersom jag siktar på en samplingshastighet på 600kHz som är ljusår från 20kHz så behöver inte det här diskuteras mer för det går helt enkelt inte.

Det gick inte redan innan dessa data, och det går ännu sämre efter :)

MVH/Roger
PS
Det ser dock ut som man kan välja prescale-faktor med hjälp av tre pinnar på en MUX, pinnarna heter ADPS0, ADPS1, ADPS2 och det är garanterat som så att minsta delningen är 2 (systemklockan går in i en räknare och sen kan man mha MUX välja en av sju utgångar). En kvarstående fråga är således om prescale-värdet 2 kan väljas, dvs vad betyder egentligen "requires" ovan? Knepigt att man rekommenderar ett spann sådär om det samtidigt inte innebär en begränsning.

Men jag tror att eftersom högre ADC-frekvens sägs innebära färre antal bitars upplösning så är det nog stopp vid 20kHz som max samplingsfrekvens.
Senast redigerad av Spisblinkaren 26 november 2016, 20:47:40, redigerad totalt 1 gång.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av sodjan »

16 Mhz delat med 128 ger en ADC klocka på 125 KHz.

Enligt databladet (men du har väl läst "28.4. Prescaling and Conversion Timing" eller hur?):

"By default, the successive approximation circuitry requires an input clock frequency
between 50kHz and 200kHz to get maximum resolution."

Så prescaler på 128 ger alltså en ADC klocka inom spec.

> Jag vet inte alls hur mycket denna effektiva klocka (som vi kan kalla E-klocka som då är på 8MHz)...

Var får du 8 Mhz ifrån?

> ...används men tydligen används den åtminstone för A/D.

...endast för A/D.

> Jag kan dock tänka mig att denna E-klocka i praktiken är den klocka som hela processorn egentligen går på.

Nej, var har du fått det ifrån?

> Eftersom jag har problem med att hinna med med mitt samplingskrav så är det extra intressant om denna prescaler tom kunde sättas till 1.

Kommer aldrig att fungera.

> Samtidigt tror jag det är omöjligt för en poäng med prescaler kan vara "wave-shaper" dvs den råa kristallens svängning är förmodligen inte perfekt.

Helsnurrigt...

> Men varför man nyttjar hela 128 gångers neddelning av systemklockan i default, det fattar jag inte.

Läs på, speciellt delen i databladet ovan.

> Eftersom jag är en bekväm jävel skulle jag vilja veta exakt hur man ställer om denna prescaler och hur pass lite neddelning man kan sätta den till.

Eftersom du är en bekväm jävel så får du väl skylla dig själv.

> Vore också roligt om Ni kunde tala om huruvida mitt spekulerande är rätt eller fel.

Ja, det var ju inte speciellt svårt att avgöra.

Sen, i ett senare inlägg:

> Du fick mig att kolla upp databladet för A/D'n...

Gjorde du det först *nu*!?
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Hej sodjan!

Jag svarar på sista frågan först, självklart läste jag databladet först nu för om man inte vet vad man behöver så är ju det liksom ingen ide', eller hur?

Det är ju först när man kommit på vilka krav man har som det är relevant att leta efter vad som finns.

Jag tycker det är fundamentalt självklart.

Fast visst, man kan anpassa sig till vad som finns också men jag är hellre sådan att jag ställer upp kraven först.
Var får du 8 Mhz ifrån?
16MHz/2=8MHz och prescalern kan bara dela med minst en faktor två ty ripple-carry räknare, eller nåt.
...endast för A/D.
Tack, då vet jag det.
Nej, var har du fått det ifrån?
Fel av mig.
Kommer aldrig att fungera.
Redan insett detta, men två hade teoretiskt fungerat (dock är begränsningen hos ADC uppenbarligen sådan att det i praktiken inte fungerar).
Helsnurrigt...
Kanske, men den råa svängningen hos en kristall ser inte alltid så fin ut så det skadar inte med nån Schmitt-Trigger för att snygga till den.
Läs på, speciellt delen i databladet ovan.
Redan gjort.

Tack för ditt inlägg, inte så trevligt kanske men intressant :)

MVH/Roger
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av sodjan »

> Jag har rätt nyligen fått veta att samplingen i UNO går onödigt långsamt pga av att
> nåt som kallas prescaler delar ner systemklockan (16MHz) hela 128ggr.

Var eller hur fick du veta det? Länk?
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Jag såg det nånstans väldigt tidigt.

Men när du nu följer min tråd så har du nog sett att ADC-klockan rekommenderas hålla sig mellan 50kHz och 200kHz du kan faktiskt hitta denna information i det datablad som medföljer UNO, jag laddar upp det för enkelhets skull, kolla sidan 253.

Det står dock inte konkret att prescalern är på 128ggr men man får väl anse att sytemklockans frekvens på 16MHz är känd (står nog högst upp alternativt i UNO's datablad).

Och för att pricka 50kHz-200kHz utan att lägga sig på onödigt låg frekvens så blir 16MHz/128=125kHz som jag tror är vad UNO kör med som ADC-klocka i default.

MVH/Roger
PS
Jag kom på att pdf:en jag har är på över 12M och det kan jag inte ladda upp här, jag provade att zippa den men det hände inget med storleken för ovanlighets skull. Dokumentet heter dock uno_doc8161.pdf och är egentligen ett rent datablad på ATmega328P. Här är en sida http://www.atmel.com/devices/atmega328p.aspx men storleken på filen stämmer inte.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av sodjan »

> Jag såg det nånstans väldigt tidigt.

Jo, det fattar jag. Men det är också intressant att se vad det stod på sidan (eller vad
det nu var) för att förstå tolkningarna av det.

Jag fattar inte, det låter som att du tror att *jag* inte har kollat databladet! :D

> Jag kom på att pdf:en jag har är på över 12M och det kan jag inte ladda upp här,

Finns ju absolut ingen anledning att belasta forumet med lagring av datablad som är
allmänt tillgängliga för alla bara en sökning i Google bort.

http://www.atmel.com/Images/Atmel-42735 ... asheet.pdf
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Ja du sodjan, vad ska jag säga.

Jag är lite speciell för jag vill verkligen vara trevligt folk som du till lags men ibland orkar jag helt enkelt inte.

Jag ville ge dig detta datablad men kände inte att jag ville surfa in på Arduinos hemsida (ty lat) och samtidigt visste jag då inte hur jag skulle göra.

Fast klagomålet på att det inte går att ladda upp 12M till forumet, det var ett misstag för är det nåt jag verkligen inte vill så är det att förbruka en massa serverutrymme i onödan (helt enkelt för att det kostar pengar).

Men jag kunde kanske provat att googla på det, samtidigt väldigt skumt att du inte hittade mitt datablad med den unika beteckningen.

MVH/Roger
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av sodjan »

> Jag ville ge dig detta datablad...

En länk räcker långt. Men det är kanske bättre att ta originalet direkt från Microchip/Atmel.

> samtidigt väldigt skumt att du inte hittade mitt datablad med den unika beteckningen.

Jo... Hittade en länk här nu: https://cdn.sparkfun.com/datasheets/Kits/doc8161.pdf
Det är sannolikt det du har (?). Det är daterat 2009. Det aktuella från Atmel är från 2016.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Där är den ju, du har hittat den, vad roligt!

Vilket datablad ska vi nu komma överens om att vi snackar om :humm:

MVH/Roger
PS
Hör verkligen Microchip och Atmel ihop?
Användarvisningsbild
rvl
Inlägg: 5782
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av rvl »

Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av E85 »

Tips, detta står i databladet:
"Up to 76.9kSPS (Up to 15kSPS at Maximum Resolution)"
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av Spisblinkaren »

Hej E85!

Det såg inte jag som lusläste databladet även om jag räknade ut nåt dylikt av det.

Jag kom fram till att standard samplingshastighet är 9,6kHz.

Detta kan man nätt och jämt dubbla och behålla maximal upplösning.

Rent strikt är prescalern satt på 128 (16MHz/128=>125kHz/13cykler) som ger 9,6kHz.

Eftersom det samtidigt står att över 200kHz så tappar man i upplösning så innebär det max 200kHz/125kHz*9,6kHz=15kHz (teoretiskt).

Så högre samplingshastighet (för full upplösning) än c.a 15kSPS kan man inte ha, vilket stämmer bra med vad du nu hittat.

MVH/Roger
PS
Samtidigt vore det intressant att veta vilken samplingshastighet man kan ha för 8 bitar. Eftersom normal upplösning är 10 bitar så kanske man kan fyrdubbla samplingshastigheten för 8 bitar, eller? Fyra gånger mindre delning hos prescalern går sedan faktiskt att sätta (dvs max 38kSPS).
bearing
Inlägg: 11250
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Hur minimerar jag prescalern i Arduino UNO?

Inlägg av bearing »

Jag har kört med 1Mhz ADC-klocka. Har upptäckt att problemet vid hög frekvens är att laddningstiden för kondensatorn (sample and hold) blir för kort om man kör ADC som "free running" (13 ADC-cykler).

Det jag upptäckte var att om man sätter ett interrupt var 16:e ADC-klockcykel (d.v.s. var 16*prescaler CPU-cykler) och i början av det interruptet ställer in ADMUX, så kommer kondensatorn att börja laddas från att ADMUX sätts. Ifall omvandlingen (13.5 ADC-cykler tror jag) startas med en fördröjning på några CPU-cykler från att ADMUX satts, hinner kondensatorn laddas fullt. Se bara till att omvandlingen inte startar för sent, så att den hinner bli färdig innan nästa interrupt.

Min lösning ger en hastighet på 62.5kSPS (1MHz) med vad som ser ut som full upplösning tack vare att kondensatorn laddats fullt.

Varsågod, nu fick du ett tips som är bättre än allt jag hittat på nätet och i datablad om denna ADC. Det framgår (vad jag förstår) inte av databladet att man kan göra på det här sättet, utan det har jag klurat ut på egen hand. Som jag förstått från databladet sätts MUX först när omvandlingen startar. Men så är det tydligen inte.
Skriv svar