Oväntade negativa värden från abs () -funktionen inline med analogRead

Vid sampling från A0 med en 0-5V-signal på en arduino-mikro med koden nedan får jag lite negativa värden.

int sensor = 0; sensor = abs(analogRead(A0) - 512); 

Värden:

77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31 

När du kör (uppenbarligen) matematiskt motsvarande kod nedan får jag uteslutande positiva värden.

int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor); 

Jag tror inte att detta är ett heltalsflöde som i detta inlägg eftersom när jag byter till long sensor = 0 får jag samma negativa resultat.

Vad händer här?

Svar

abs() definieras i Arduino.h som makro:

 #define abs(x) ((x)>0?(x):-(x)) 

Ett makro utvärderas inte på samma sätt som en funktion.

 sensor = abs(analogRead(A0) - 512); 

Detta uttalande kommer att utvidgas vid sammanställningstid till:

 sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512)); 

Nu ”felet” är lätt att förstå. Den analoga stiftet läses två gånger. ”Felet” kan undvikas genom att lägga till följande rad först i din skiss:

#undef abs 

Detta tar bort makrot abs() och standardbiblioteksfunktionen används istället.

Skål!

Kommentarer

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *