arrays
18 berichten
• Pagina 2 van 2 • 1, 2
Advertisement
Re: arrays
@FPCUser, Over mooie oefening gesproken, er is een standaard manier voor.
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.
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![Wink ;)](./images/smilies/icon_e_wink.gif)
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.
- 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
![Wink ;)](./images/smilies/icon_e_wink.gif)
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.
Re: arrays
@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!
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!
Re: arrays
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.
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.
Re: arrays
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
shooter@home.nl
Re: arrays
@Koepel:
Het kwartje is nog niet helemaal gevallen
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.
Het kwartje is nog niet helemaal gevallen
![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
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.
Re: arrays
En daarbij , FPCUser , was de uitleg voor een leek zoals ik , fantastisch goed . Een klein zetje en dan valt de nikkel wel .
- knutselaar
- Berichten: 5
- Geregistreerd: 27 Dec 2018, 20:32
Re: arrays
Mooie uitleg FPCuser, misschien heeft de (positieve) energie die je hierin stak anderen geholpen.
Grtn
Grtn
18 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 28 gasten