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!
abs()
makrot i Arduino.habs
ochlabs
funktion. Arduinoabs
makro är en löjlig blunder av arduino. Aaron Ciuffo, klicka på länken till Arduino.h i svaret av Mikael Patel, där ser du de andra makron. En annan sak är att inte använda en variabel med namnet " B1 ".