Skocz do zawartości

analogRead - inny pomiar po wgraniu z Arduino IDE i inny z platformio


roz

Pomocna odpowiedź

Poniższy szkic wgrałem przez Arduino IDE oraz przez Platformio (kopiuj-wklej bez modyfikacji).

Płytka Lolin32 v1.0.0

Skąd taka różnica w odczycie?

Kod programu:

#include <Arduino.h>

void setup() {
  // initialize serial communication at 115200 bits per second:
  Serial.begin(115200);

  //set the resolution to 12 bits (0-4095)
  analogReadResolution(12);
}

void loop() {
  // read the analog / millivolts value for pin 2:
  int analogValue = analogRead(2);
  int analogVolts = analogReadMilliVolts(2);

  // print out the values you read:
  Serial.printf("ADC analog value = %d\n", analogValue);
  Serial.printf("ADC millivolts value = %d\n", analogVolts);

  delay(100);  // delay in between reads for clear read from serial
}

Wgrane przez platformio:

ADC analog value = 401
ADC millivolts value = 433
ADC analog value = 389
ADC millivolts value = 425
ADC analog value = 375
ADC millivolts value = 411
ADC analog value = 359
ADC millivolts value = 401
ADC analog value = 341
ADC millivolts value = 382
ADC analog value = 317
ADC millivolts value = 366
ADC analog value = 297
ADC millivolts value = 348
ADC analog value = 288
ADC millivolts value = 344
ADC analog value = 303
ADC millivolts value = 353
ADC analog value = 297
ADC millivolts value = 349
ADC analog value = 310
ADC millivolts value = 360
ADC analog value = 315
ADC millivolts value = 367
ADC analog value = 336
ADC millivolts value = 382
ADC analog value = 348
ADC millivolts value = 393
ADC analog value = 371
ADC millivolts value = 412
ADC analog value = 398
ADC millivolts value = 433
ADC analog value = 407
ADC millivolts value = 443
ADC analog value = 413
ADC millivolts value = 444
ADC analog value = 406
ADC millivolts value = 438
ADC analog value = 402
ADC millivolts value = 435
ADC analog value = 395
ADC millivolts value = 429
ADC analog value = 374
ADC millivolts value = 409
ADC analog value = 365
ADC millivolts value = 406
ADC analog value = 345
ADC millivolts value = 389
ADC analog value = 317
ADC millivolts value = 362
ADC analog value = 295
ADC millivolts value = 353
ADC analog value = 292
ADC millivolts value = 348
ADC analog value = 293
ADC millivolts value = 348
ADC analog value = 298
ADC millivolts value = 351
ADC analog value = 305
ADC millivolts value = 359
ADC analog value = 322
ADC millivolts value = 374
ADC analog value = 336
ADC millivolts value = 383
ADC analog value = 340
ADC millivolts value = 386
ADC analog value = 372
ADC millivolts value = 414

Wgrane przez Arduino IDE:

21:24:47.858 -> ADC analog value = 11
21:24:47.858 -> ADC millivolts value = 135
21:24:47.940 -> ADC analog value = 14
21:24:47.940 -> ADC millivolts value = 139
21:24:48.062 -> ADC analog value = 16
21:24:48.062 -> ADC millivolts value = 140
21:24:48.140 -> ADC analog value = 9
21:24:48.140 -> ADC millivolts value = 135
21:24:48.278 -> ADC analog value = 7
21:24:48.278 -> ADC millivolts value = 133
21:24:48.371 -> ADC analog value = 9
21:24:48.371 -> ADC millivolts value = 133
21:24:48.441 -> ADC analog value = 10
21:24:48.441 -> ADC millivolts value = 134

 

Link do komentarza
Share on other sites

Jakie masz wersje frameworków dla esp32? U mnie podaje to samo w obu dla lolin32_lite. Info o frameworku znajdziesz w logu jak budujesz projekt.

Arduino IDE:

Using core 'esp32' from platform in folder: /home/pc/.arduino15/packages/esp32/hardware/esp32/3.1.1

Platformio:

framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b

 

Wrzucam ten kod:

#include <Arduino.h>
#define PIN_ADC 2

void setup() {
  Serial.begin(115200);
  while(!Serial);
  analogReadResolution(12);
  analogSetPinAttenuation(PIN_ADC, ADC_11db);
}

void loop() {
  Serial.printf("ADC: analog=%04d, mV=%04d\n", analogRead(PIN_ADC), analogReadMilliVolts(PIN_ADC));
  delay(100);
}

 

Link do komentarza
Share on other sites

Czy na pewno w obu tych środowiskach masz dobrze wybrane płytkę i procesor?

Obsługa ADC  trochę się różnią w zależności od procesora (np. ESP32 i ESP32-S3).

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@orb777

platformio:

CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/lolin_d32.html
PLATFORM: Espressif 32 (6.9.0) > WEMOS LOLIN D32
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b 
 - tool-esptoolpy @ 1.40501.0 (4.5.1) 
 - tool-mkfatfs @ 2.0.1 
 - tool-mklittlefs @ 1.203.210628 (2.3) 
 - tool-mkspiffs @ 2.230.0 (2.30) 
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5

Arduino pokazuje tyle: (nie wiem jak sprawdzić, ale wczoraj aktualizował się do 3.1.1)

Global variables use 20160 bytes (6%) of dynamic memory, leaving 307520 bytes for local variables. Maximum is 327680 bytes.
esptool.py v4.8.1
Serial port COM7
Connecting......
Chip is ESP32-D0WDQ6 (revision v1.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 24:6f:28:15:ce:00

 

Link do komentarza
Share on other sites

(edytowany)

@jand w platformio mam:

[env:lolin_d32]
platform = espressif32
board = lolin_d32
framework = arduino

W Arduino:

image.thumb.png.2b06babc55fd760e59fb6554269b37e8.png

Kwestia - jak sprawdzić jaka faktycznie jest to płytka. Nadruk na PCB mówi: Lolin32 v1.0.0

 

EDIT: wybrałem w arduino IDE: LOLIN D32 i pomiar taki sam, jak w pierwszym poście moim - odbiega od wgrania przez platformio.

Edytowano przez roz
Link do komentarza
Share on other sites

Według mnie arduino i platformio musi korzystać z różnych wersji bibliotek wewnętrznych. Niema i innej opcji. W esp32 są wejścia do pomiarów milivoltowych ale czytałem gdzieś że espressif usunął ich obsługę w którejś wersji ponieważ coś tam schrzanili na poziomie krzemu 

Link do komentarza
Share on other sites

@_LM_ fakt że usunęli, ale to nie ma nic wspólnego z analogReadMillivolts i podobnymi z idf - ta funkcja po prostu przelicza surowy odczyt ADC na napięcie korzystając z danych kalibracji (kalibracja jest robiona fabrycznie i zapisywana w fusebitach).

Przy ADC ja bym proponował jednak zapomnieć o funkcjach rodem z Arduino i użyć bardzo dobrze udokumentowanych funkcji z idf (dostępnych OOTB w szkicach Arduino). Mniej niepotrzebnego narzutu na arduinizmy i pewność, że będzie działać tak jak się chce a nie jak to sobie różnie wybrażają różni autorzy różnych IDE.

  • Lubię! 2
Link do komentarza
Share on other sites

@ethanak zrobiłem jak radzisz, funkcje esp32 z idf. Jest dobrze. Niestety niedoskonałość ADC w esp32 polega na tym, że nie działa to liniowo (od 3.0V...3.3V brak reakcji już). Ale to obejdę, zrobię poprawkę w kodzie.

Martwi mnie natomiast działanie funkcji map() gdzie dla zera zwraca 26, czyli spoza podanego przeze mnie zakresu w parametrze map().

map(average, 1796, 4060, 15, 0);

 

Cytat

 

image.thumb.png.55576fb7d059ffb8b698bd4941605a3e.png

This behavior means that your ESP32 is not able to distinguish 3.3 V from 3.2 V. You’ll get the same value for both voltages: 4095.

The same happens for very low voltage values: for 0 V and 0.1 V you’ll get the same value: 0. You need to keep this in mind when using the ESP32 ADC pins.

 

Link do komentarza
Share on other sites

 

2 godziny temu, ethanak napisał:

 jaka jest różnica w obsłudze adc w DOWD i S3

W kodzie "Arduinowym" różnicy nie ma, ale biblioteka esp32-hal-adc.c ma trochę kompilacji warunkowych,  w zależności od procesora.

Na przykład analogSetAttenuation()

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.