Când eșantionăm de la A0 cu un semnal 0-5V pe un micro arduino cu codul de mai jos, am câteva valori negative.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Valori:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
Când rulați (aparent) matematic cod echivalent de mai jos obțin valori exclusiv pozitive.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
Nu cred că aceasta este o depășire a numărului întreg ca în această postare deoarece când trec la long sensor = 0
obțin aceleași rezultate negative.
Ce se întâmplă aici?
Răspuns
abs()
este definit în Arduino.h ca macro:
#define abs(x) ((x)>0?(x):-(x))
O macro nu evaluează în același mod ca o funcție.
sensor = abs(analogRead(A0) - 512);
Această declarație va fi extinsă la compilare la:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Acum „eroarea” este ușor de înțeles. Pinul analogic este citit de două ori. „Eroarea” poate fi evitată adăugând următoarea linie mai întâi în schița dvs.:
#undef abs
Aceasta va elimina macro-ul abs()
și funcția de bibliotecă standard vor fi utilizate în loc.
Noroc!
abs()
Arduino.habs
șilabs
funcție. Macro-ul arduinoabs
este o gafă ridicolă de către arduino. Aaron Ciuffo, faceți clic pe linkul către Arduino.h în răspunsul de Mikael Patel, acolo vedeți celelalte macro-uri. Un alt lucru este să nu folosiți o variabilă cu numele " B1 ".