Voor een vergelijking even een programmatje gemaakt om te zien hoeveel het scheelt.
Uitgaande van een counter die een Adc simuleert.
Dan in een loop de ADC waarde omrekenen naar een display waarde.
Dan de display waarde optellen in een totaal.
En aan het eind het totaal delen door de counter om het gemiddelde te berekenen.
En dan omrekenen naar een ascii string.
Eerst met floats:
code:
#include <avr/io.h>
#include <stdlib.h>
float Counter;
float AdcValue;
float DisplayValue;
float Total;
float Average;
float Gain;
float Offset;
int main()
{
DDRB |= (1 << PB5);
Gain = 0.6578;
Offset = -5.8;
AdcValue = 0.0;
char Buffer[20];
for ( ;; )
{
Total = 0.0;
for(Counter = 0.0; Counter < 10000.0; Counter += 1.0)
{
AdcValue += 1.0;
DisplayValue = AdcValue * Gain + Offset;
Total += DisplayValue;
}
Average = Total / Counter;
dtostrf(Average, 8, 3, Buffer);
PINB |= (1 << PB5); //< Xor LED
}
return 0;
}
Dan met ints:
code:
#include <avr/io.h>
#include <stdlib.h>
long int Counter;
long int AdcValue;
long int DisplayValue;
long int Total;
long int Average;
long int Gain;
long int Offset;
int main()
{
DDRB |= (1 << PB5);
Gain = 6578;
Offset = -58000;
AdcValue = 0;
char Buffer[20];
for ( ;; )
{
Total = 0;
for(Counter = 0; Counter < 10000; Counter += 1)
{
AdcValue += 1;
DisplayValue = ((AdcValue * Gain + Offset) / 10000);
Total += DisplayValue;
}
Average = Total / Counter;
ltoa(Average, Buffer, 10);
PINB |= (1 << PB5); //< Xor LED
}
return 0;
}
De snelheid blijkt op een Arduino Nano gelijk voor beide versies. De led knippert met ongeveer 1 Hz. Dus het programma gaat 2 keer rond per seconde (loop tijd van 0.5 seconden). De AtMega328 kan dus 20000 keer per seconde een waarde berekenen. Best wel bruikbaar.
Float kost wel iets meer ruimte:
0xC1C (3100) bytes voor de float versie.
0x402 (1026) bytes voor de integer versie.
Met compiler optimalisatie uitgeschakeld ( -O0 )
De float library funkties kosten blijkbaar ongeveer 2K bytes extra.
Maar ik ben bang dat de integer versie last heeft van overflows en dus niet goed werkt.
PS, met een extra conversie binnen de loop (DisplayValue omrekenen naar string) wordt de looptijd iets langer :
1.55 seconden voor de float versie en 1.75 seconden voor de int versie.