Skocz do zawartości

Ćwiczenia z Arduino nano, zagadnienia, problemy.


Pomocna odpowiedź

32 minuty temu, _LM_ napisał:

Twoje odczyty pokrywają się z wykresami w podanym dokumencie.

Gdyby to była taka prosta linia jak w dokumencie, to nie byłoby problemu. W rzeczywistości wygląda to tak jak to przedstawiono tutaj; https://randomnerdtutorials.com/esp32-adc-analog-read-arduino-ide/ Taką poszarpaną charakterystykę mimo wszystko trudno jest zlinearyzować zwykłymi przesunięciami. XD

Tyle, że to już nie będzie się nadawać jako "multimetr" Te przetworniki 12bit w tych ESP są jakościowo gorsze niż te 10bit w przykładowej mega328. Przy takim odstrzale ta dokładność 12bit po prostu znika. Xd Tam post wyżej wstawiłem kawałek nietypowego kodu który nieco linearyzuje odczyt wprowadzając nieliniowe przesunięcie. Działa to zjadliwie do wartości 2600mV. Można się pokusić o pełny zakres, ale wówczas trzeba wprowadzić kolejną linearyzację przy końcu zakresu. 2600-2840mV w moim przypadku.  

A poszarpana hka z twojego linku to według mnie kiepska metoda pomiaru. Bez odniesienia, z byle jakim źródłem danych wejściowych, potencjometr to nie jest wyznacznik 

Nie no ja robię pomiary w odniesieniu do dość dokładnego multimetra i widzę co się dzieje.  Natomiast potencjometry tylko szumią przy nastawie. Ustawiam wartość co 100mV oraz porównuję wynik na wyświetlaczu OLED z multimetrem. Po wprowadzeniu korekcji do wartości 2600mV mam prawie równo. Wskazanie buja się w zakresie +/- 10mV. Nie jest najgorzej. 🙂

(edytowany)
7 minut temu, _LM_ napisał:

Eh, ok daj zewnętrzny ADC i po bólu 

No w tym projekcie już niczego nie dodam. Ale te ESP dały mocną nauczkę na przyszłość. xd

Edytowano przez rafal220

Zwykły dzielnik pomiarowy z kondensatorem 100nF na wejściu ADC + zenerka 3V3 na zabezpieczeniu. To wejście ma mierzyć napięcie baterii (akumulatora). 

(edytowany)

No i widzisz, taka z tobą dyskusja. Szkoda czasu. Gdzie ta zenerka? Równie dobrze ta dioda może wprowadzać zniekształcenia i szumy do obwodu

Edytowano przez _LM_
  • Lubię! 1
(edytowany)

Zenerka bezpośrednio na wejściu ADC. Odnośnie zniekształceń, to wiem o tym, dlatego należy dawać min. 0,3V więcej od max wartości mierzonej przez ADC. Co do szumów, to nie będzie tego dopóki zenerka nie zacznie przewodzić. Właśnie przeprowadziłem test z 12V i 18V zasilając układ bateryjnie. Po wprowadzeniu wspomnianej korekcji błąd pomiaru wynosi 2-3mV. Wcześniej było ponad 100mV. Jeszcze nie robiłem testów przy 8V, ale zaraz coś się zorganizuje. 

Edytowano przez rafal220

Działam powoli z tym. Prąd mam już ogarnięty. Co prawda super ideału nie zrobię, ale i tak jest przyzwoicie.

//***********************************Inicjacja biblioteki wyświetlacza OLED SSD1315 (128x64)**********************************
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // Szerokość wyświetlacza OLED w pikselach
#define SCREEN_HEIGHT 64  // Wysokość wyświetlacza OLED w pikselach

#define OLED_RESET -1        // Bez pinu RST
#define SCREEN_ADDRESS 0x3C  // Adres wyświetlacza
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//****************************************************************************************************************

int napiecie, prad_LED, prad_cewki;

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);  // Uruchamianie OLED 128 x 64
  display.clearDisplay();

  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {

  digitalWrite(7, 1);
  digitalWrite(10, 1);

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE, BLACK);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(napiecie);
  display.println(prad_LED);
  display.println(prad_cewki);
  display.display();

  delay(100);
  funkcja_pomiarADC_AND_konwersja(10);
}

void funkcja_pomiarADC_AND_konwersja(int iloscProbek) {

  static int usrednionyPomiarNapiecia, korekcjaNapiecia, korekcjaNapiecia1, napiecieUsrednione = 0;
  static int usrednionyPomiarPraduLED, korekcjaPraduLED, korekcjaPraduLED1, usrednionyPradLed = 0;
  static int usrednionyPomiarPraduCewki, korekcjaPraduCewki, korekcjaPraduCewki1, usrednionyPradCewki = 0;
  static int i0 = 0;

  usrednionyPomiarPraduCewki += analogRead(A0);
  usrednionyPomiarPraduLED += analogRead(A1);
  usrednionyPomiarNapiecia += analogRead(A4);
  i0++;

  if (i0 >= iloscProbek) {
    napiecieUsrednione = usrednionyPomiarNapiecia / iloscProbek;
    usrednionyPradLed = usrednionyPomiarPraduLED / iloscProbek;
    usrednionyPradCewki = usrednionyPomiarPraduCewki / iloscProbek;
    usrednionyPomiarNapiecia = 0;
    usrednionyPomiarPraduLED = 0;
    usrednionyPomiarPraduCewki = 0;
    i0 = 0;
  }

  //----------------------------------------------------------------------------------------------------------------------
  korekcjaNapiecia1 = napiecieUsrednione;
  korekcjaNapiecia1 = min(korekcjaNapiecia1, 1300);
  korekcjaNapiecia = napiecieUsrednione + map(korekcjaNapiecia1, 0, 1000, 0, 50);
  napiecie = map(korekcjaNapiecia, 0, 4095, 0, 32600);  // Mapowanie na (mV)
  napiecie = min(napiecie, 20000);

  //---------------------------------------------------------------------------------------------------------------

  korekcjaPraduLED1 = usrednionyPradLed;
  korekcjaPraduLED1 = min(korekcjaPraduLED1, 1300);
  korekcjaPraduLED = (usrednionyPradLed - 22) + map(korekcjaPraduLED1, 0, 1000, 0, 50);
  prad_LED = map(korekcjaPraduLED, 0, 4095, 0, 1141);  // mapowanie na prąd LED (ma)
  prad_LED = min(prad_LED, 999);

  //---------------------------------------------------------------------------------------------------------------

  korekcjaPraduCewki1 = usrednionyPradCewki;
  korekcjaPraduCewki1 = min(korekcjaPraduCewki1, 1300);
  korekcjaPraduCewki = (usrednionyPradCewki - 10) + map(korekcjaPraduCewki1, 0, 1000, 0, 50);
  prad_cewki = map(korekcjaPraduCewki, 0, 4095, 0, 338);  // mapowanie na prąd cewki (A)
  prad_cewki = min(prad_cewki, 300);
}

 Została jeszcze do zrobienia korekcja napięcia cewki względem napięcia zasilania układu które jest mierzone bezpośrednio na zaciskach przekaźnika. A rzecz jasna do zacisków cewki sprzęgła na PCB jest jeszcze po drożdże bezpiecznik, druk,  rezystor pomiarowy, przekaźnik. Zawsze jakaś rezystancja się uzbiera którą trzeba odjąć. Pi razy drzwi jak odejmę 0,1R to powinno być ok. Zresztą się zorientuję.  

Dnia 15.07.2024 o 22:57, ethanak napisał:

Czemu nie zastosujesz czegos co do tego sluży (np. INA219)

A co sądzisz o INA226? W sumie złotówka różnicy w porównaniu z INA219. Potestuję sobie te układy. W ramach ćwiczeń zamówiłem też i takie przetworniki HX711 + jakieś byle jakie belki tensometryczne. Generalnie w wagach przemysłowych stosuje się analogowy sumator wagowy dla 4 belek. Ale można też zrobić cyfrową obróbkę która niesie ze sobą łatwiejszą kalibrację belek pomiarowych. No ale zanim do tego dojdę, to chciałbym na początku uruchomić wyświetlacz 3,5" z dotykiem. Taka waga z wyświetlaczem dotykowym i innymi bajerami może być dobrym wyzwaniem na sam start. 

6 minut temu, rafal220 napisał:

A co sądzisz o INA226?

W sumie dla zastosowań (tak samo moich jak i twoich) jedna chwała - różnią się maksymalnym napięciem. Poza tym 219 występuje w przyrodzie w postaci modułu z trzema sztukami na pokładzie, co może być w pewnych warunkach wygodne - przykładowo mój zasilaczyk na akumulator Parkside V20 ma trzy wyjścia (5V, regulowane, bezpośrednio z akumulatora) i trochę mniej kabli wypada 🙂

 

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...