Podczas próbkowania z A0 z sygnałem 0-5V na arduino micro z kodem poniżej otrzymuję trochę wartości ujemne.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Wartości:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
Podczas wykonywania (najwyraźniej) matematycznego równoważny kod poniżej otrzymuję wyłącznie wartości dodatnie.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
Nie sądzę, żeby to było przepełnienie liczb całkowitych, jak w tym poście , ponieważ kiedy przełączam się na long sensor = 0
, otrzymuję takie same negatywne wyniki.
Co się tutaj dzieje?
Odpowiedź
abs()
jest zdefiniowana w Arduino.h jako makro:
#define abs(x) ((x)>0?(x):-(x))
Makro nie jest obliczane w ten sam sposób, jak funkcja.
sensor = abs(analogRead(A0) - 512);
Ta instrukcja zostanie rozwinięta w czasie kompilacji do:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Teraz „błąd” jest łatwy do zrozumienia. Pin analogowy jest odczytywany dwukrotnie. „Błąd” można uniknąć, dodając najpierw następujący wiersz w szkicu:
#undef abs
Spowoduje to usunięcie makra abs()
i standardowa funkcja biblioteczna zostaną użyte w zamian.
Pozdrawiam!
abs()
makro w Arduino.habs
ilabs
funkcja. Makro arduinoabs
to absurdalna pomyłka autorstwa arduino. Aaron Ciuffo, kliknij link do Arduino.h w odpowiedzi Mikaela Patela, tam zobaczysz inne makra. Inną rzeczą jest nieużywanie zmiennej o nazwie " B1 ".