arrays

algemene C code
Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: arrays

Berichtdoor FPCUser » 05 Jun 2018, 19:17

Ach, het was ook een mooie oefening voor mijzelf: hoe verwoord ik iets.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: arrays

Berichtdoor Koepel » 06 Jun 2018, 03:38

@FPCUser, Over mooie oefening gesproken, er is een standaard manier voor.

Code: Alles selecteren
int total = 0;
for( i=0; i<10; i++)  // maximum 30 times
{
  total += analogRead( A0);
}
int average = total / 10;


Bij de laatste regel "int average = total / 10" verdwijnen de laagste bits. Door die berekening met 'float' te doen is meer resolutie mogelijk dan de 10-bit van de ADC. Een (kleine) ruis op het signaal kan gebruikt worden om meer resolutie te krijgen.
Verder moet het totale getal natuurlijk in de variabele 'total' passen. In het voorbeeld hierboven kun je maar tot ongeveer 30 gaan. Toch is het beter om het optellen van alle waarden met integers te doen, zodat geen enkele bit verloren gaat.
En tot slot kan er zelfs nog een correctie gedaan worden van een halve bit. Die halve bit is een lang verhaal, het heeft de maken hoe de ADC werkt.

De ADC gaat pas naar de volgende stap als dat voltage bereikt is. Dus het gemiddelde ingangssignaal zit midden tussen twee stappen van de ADC.

Code: Alles selecteren
const unsigned int n = 100;
unsigned long total = 0;
for( unsigned int i=0; i<n; i++)
{
  total += analogRead( A0);
}
total += n / 2;   // half bit correction
float voltage = (float) total / (float) n;   // average as float, to get extra resolution
voltage = voltage / 1024.0 * 5.0;  // convert to voltage



Door 1024 te kiezen in plaats van 1023 en door een halve bit correctie toe te voegen kun je de indruk wekken dat je er verstand van hebt ;)
Tutorial: https://www.gammon.com.au/adc

In het voorbeeld hierboven kan het gemiddelde van zo'n 60.000 waarden berekend worden. Als meer nodig is, dan is het nodig dat 'n' en 'i' ook een 'unsigned long' worden.

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: arrays

Berichtdoor FPCUser » 06 Jun 2018, 09:20

@Koepel

Je verhaal om de nauwkeurigheid van de ADC metingen te verhogen is zeker interessant, maar de uitwerking is mij nog niet duidelijk.
Met name de 1/2 bit correctie in de code. Dat de meting tussen twee bits kan zitten wel, maar hoe je dat kan verwerken niet.
Je verhoogd het totaal van 100 metingen met de vaste waarde 50?

Ik zal het stuk van Nick Gammon proberen te begrijpen. Misschien wordt het dan duidelijk. Staat overigens vol met nuttige dingen (referentie spanningen, e.d.).
Bedankt voor je link!

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: arrays

Berichtdoor Koepel » 06 Jun 2018, 10:28

De ADC heeft 1024 stappen. Daarom is het nodig om te delen door 1024. De ADC kan net geen 5V meten, want dat zou de 1025-ste stap zijn.

Stel de Arduino werkt op 5.000V, dan is iedere stap van de ADC 4.88 mV (5 / 1024).
Maar pas als op de ingang echt een voltage van 4.88 mV staat, dan springt de ADC naar de volgende stap en geeft een waarde 1.
Dus als de ADC een waarde 0 geeft, dan zit de ingangsspanning ergens tussen 0 en 4.88 mV. De ingang is dan dus gemiddeld 2.44 mV.
De ingangsspanning is dan niet 0 Volt, maar gemiddeld 2.44 mV, en dat is een halve stap, oftewel een halve bit extra.

Bij het gemiddelde nemen van 100 metingen, zijn er 100 halve bits (halve stappen) extra, dus 50 erbij optellen. Dat valt grotendeels weg door het daarna door 100 te delen om het gemiddelde te nemen, maar dit gaat om extra resolutie (verder dan de 10 bit van de ADC). Zeg maar de extra bits achter de komma.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: arrays

Berichtdoor shooter » 06 Jun 2018, 21:57

je kunt de voedingsspanning van een arduino niet direct meten omdat de reference aan diezelfde spanning zit, het kan wel als je een andere ref gebruikt. zie handleing.
paul deelen
shooter@home.nl

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: arrays

Berichtdoor FPCUser » 07 Jun 2018, 10:24

@Koepel:
Het kwartje is nog niet helemaal gevallen :D
Maar gun me nog even wat tijd.

Overigens lijkt mij het beter om hierover een nieuw topic te starten.
Dan kan f8voa ook reageren of hij uit de voeten kan met de antwoorden op zijn oorspronkelijke vraag betreffende array's.

Berichten: 10
Geregistreerd: 05 Jun 2018, 08:24
Woonplaats: Frankrijk

Re: arrays

Berichtdoor f8voa » 08 Jun 2018, 10:52

En daarbij , FPCUser , was de uitleg voor een leek zoals ik , fantastisch goed . Een klein zetje en dan valt de nikkel wel .

Berichten: 5
Geregistreerd: 27 Dec 2018, 20:32

Re: arrays

Berichtdoor knutselaar » 28 Dec 2018, 22:03

Mooie uitleg FPCuser, misschien heeft de (positieve) energie die je hierin stak anderen geholpen.
Grtn

Vorige

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten