Skocz do zawartości

Błędne odczyty z ADC Arduino UNO


krzysztof1010

Pomocna odpowiedź

Witam posiadam Arduino Uno i postanowiłem wykonać sterownik który porównuje temp z kilku czujników adc (LM35) program spełnia zwoje zadanie poza wyświetlaniem pomiarów z adc. Jego wskazania znacznie się wahają. Mimo zachowanej temp pokojowej 20 - 24 stopni to odczyty potrafią się zmieniać nawet o 50 stopni w ciągu sekundy. W jednej chwili jest temp 24 stopni i nagle skacze do 100 stopni i zaczyna spadać:

#include "LiquidCrystal.h" //Biblioteka służąca do obsługi wyświetlacza 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Definicja pinów do których podłączamy wyprowadzenia ekranu
int tempMIN = 30;
int tempMAX = 75;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
void setup() {

lcd.begin(20,4); //Wybór rodzaju wyświetlacza


pinMode(7,OUTPUT); //sterowanie pompa 
pinMode(8,OUTPUT); //piec

}

void loop() {

  temp1 = ((analogRead(A0)*5.0)/1023.0)*100; //solar
  temp2 = ((analogRead(A1)*5.0)/1023.0)*100; // bojler
  temp3 = ((analogRead(A2)*5.0)/1023.0)*100; // zabezpieczenie pieca

 if ((temp1 > temp2) && (temp1 > tempMIN))  {
 digitalWrite(7,HIGH);
 }

 if ((temp1 <= temp2) || (temp1 <= tempMIN)) {
 digitalWrite(7,LOW);
 }

 if (temp3 >= tempMAX) {
 digitalWrite(8,HIGH);
} else  {
 digitalWrite(8,LOW);
}

 lcd.setCursor(0,0); //Ustawienie kursora w 0 kolumnie i 0 wierszu  
lcd.print(temp1); //Wyświetlenie temperatury
lcd.print(" 'C temp.Solara"); //Wyświetlenie stopnia Celciusza
lcd.setCursor(0,1); //Ustawienie kursora w 0 kolumnie i 0 wierszu
lcd.print(temp2); //Wyświetlenie temperatury
lcd.print(" 'C temp.Zasobnika"); //Wyświetlenie stopnia Celciusza
lcd.setCursor(0,2); //Ustawienie kursora w 0 kolumnie i 0 wierszu  
lcd.print(temp3); //Wyświetlenie temperatury
lcd.print(" 'C temp.Pieca"); //Wyświetlenie stopnia Celciusza
delay(1000); 
}


Przeniosłem ten program na UART i odczyty wyglądają następująco :

126 st. C temp.Solara

51 st. C temp.Zasobnika

91 st. C temp.Pieca

------------------------------

78 st. C temp.Solara

51 st. C temp.Zasobnika

72 st. C temp.Pieca

------------------------------

59 st. C temp.Solara

51 st. C temp.Zasobnika

63 st. C temp.Pieca

------------------------------

63 st. C temp.Solara

51 st. C temp.Zasobnika

64 st. C temp.Pieca

------------------------------

88 st. C temp.Solara

51 st. C temp.Zasobnika

70 st. C temp.Pieca

-----------------------------

Dodałem również do programu obsługę nieużywanych portów aby nie wyłapywały zakłóceń , ale to również niczego nie zmieniło.

Link do komentarza
Share on other sites

krzysztof1010, witam na forum 🙂 Co to dokładnie za układ? Jak dokładnie masz to podłączone? Długi przewody lub złe zasilanie mogą sprawiać sporo problemów przy odczytach przez ADC 🙂

Link do komentarza
Share on other sites

Pomiary analogowe za pomocą ADC polegają na porównaniu napięcia wejściowego z napięciem odniesienia. Oba te sygnały powinny być stabilne, bo zakłócenia wejścia lub pływanie referencji tak samo zmieniają wyniki. Do tego dochodzi jeszcze kabelkologia. Pokaż jak wygląda Twój system zbierania danych albo przynajmniej opisz jak to zmontowałeś. Jak daleko jest do czujników, jakimi kablami puściłeś ich zasilania i sygnały temperatury. Jak zasilasz swoje Arduino, co jest podłączone do pinów 7 i 8 itp. Daj jak najwięcej szczegółów, bo z tego co napisałeś teraz nic wywnioskować (i tym samym poradzić) nie można.

Z pokazanych liczb wygląda, że jest coś bardzo źle. Nie ustawiając jawnie niczego przed wywołaniem funkcji analogRead() zakładasz, że napięciem odniesienia jest Vcc procesora a to może być w pewnych warunkach źródło poważnych problemów. No niestety, układy analogowe mają swoje wymagania.

Zgodnie z Twoimi wzorami, ale czytanymi "od tyłu", zmiana temperatury o 50°C to zmiana aż o 100 jednostek ADC a więc 1/10 całego jego zakresu! W dobrze zrobionym tego typu układzie odchyłki z pomiaru na pomiar nie powinny być większe od 2-3 jednostek ADC (tzw. LSB).

Czekamy na zdjęcia, rysunki itd.

EDIT: Treker czujny jak zawsze 🙂

  • Lubię! 1
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

Nie podawaj rzeczy oczywistych. Wiemy jak jest zrobione Arduino UNO, mamy jego schematy itp. Odpowiadaj na pytania, które jeszcze raz dla pewności powtarzam:

"..opisz jak to zmontowałeś. Jak daleko jest do czujników, jakimi kablami puściłeś ich zasilania i sygnały temperatury. Jak zasilasz swoje Arduino.."

Tu chodzi o sposób i jakość montażu (płytka stykowa? połączenia lutowane czy na kabelkach wtykanych w szpilki), rodzaje kabli, ich długości (jak masz daleko do tego pieca?), źródło zasilania (akumulator - jaki?, zasilacz - jaki, USB?) itd..

Jeśli w ogóle coś działa i mierzy to pewnie topologicznie układ jest połączony poprawnie wg sensownego schematu ideowego, ale tu chodzi o fizykę zjawisk a tego schemat ideowy nie pokaże, prawda?

Link do komentarza
Share on other sites

No to tak zacząłem od zmontowania tego układu na płytce stykowej ,także wszystko było połączone ze sobą na szpilki , arduino było zasilane przez port usb. Jeśli chodzi o długość przewodów nie jest ona dłuższa niż 10 cm. Odległości od piecie nie ma ,bo narazie jest to faza testów 🙂 Wszystkie połączenia sa wyonane tymi samymi przewodami ich długość to 5 albo 10 cm to te same które dostaje sie wraz z zakupem ich przekrój nie jest zbyt duży. Następnie pomyślałem,że może to być problem z połączeniem więc przeniosłem ten schemat na płytkę drukowaną(wszystko polutowałem) , która jest zasilana 12v z zasilacza ,dodałem do tego stabilazator napięcia 7805 z kondensatorami filtrującymi na wejściu i wyjściu oraz dodałem ten układ filtrujący, który zamieściłem powyżej, następnie włożyłem procesor jak i LCD a problem pozostał bez zmian. Zmierzyłem napięcie na czujniki (LM35) pomiedzy + a masa było 5 v a pomiędzy masą a środkową nóżką napięcie "pływało" w sensie było bardzo zmienne . Co jeszcze mnie dziwi to to ,że zwarcie środkowej nóżki z masą nie wyswietlało na LCD wartości 0 stopni tylko wskazywalo 3 stopnie. I doszedłem do wniosku , że skoro zarówno na Arduino jak i na mojej płytce problem pozostał bez zmian to raczej problem nie tkwi w topologi a w programie 🙂

Link do komentarza
Share on other sites

Acha, czyli w obecnie testowanej wersji masz "UNO" zrobione na swoim własnym PCB do którego przełożyłeś procesor z oryginalnego Arduino. Płytka jest zasilana z zasilacza 12V przez stabilizator liniowy 5V i nie ma między nim a procesorem żadnych szeregowych elementów pośrednich na linii Vcc, czy tak?

1. W razie problemów zawsze zaczynaj od prostych programów po to by mieć jak najmniej źródeł potencjalnych błędów. Np. tutaj okrój kod z wszelkich obliczeń i decyzji LEDowych i wypisuj tylko bezpośrednie odczyty z ADC - to daje jakieś pojęcie o tym co naprawdę dzieje się w sprzęcie.

2. Zmierz podczas pracy programu napięcie nie tylko 5V - bo jego drobnych wahań możesz nie zauważyć miernikiem z definicji uśredniającym przez setki ms, ale także wejście 12V. Jeśli to niebezpiecznie zbliża się do 8V, stabilizator może mieć kłopoty z utrzymaniem wyjścia.

3. Zastąp jeden z kanałów czujników (albo dołącz do kolejnego wolnego wejścia ADC) środek w zasadzie dowolnego potencjometru (1k-22k) rozpiętego między GND i Vcc procesora. Nie jest ważne ile tam dokładnie ustawisz - walczysz z niestabilnościami - i testuj to na prostym programie wypisującym wyniki pomiarów ADC. To pozwala wyeliminować czujniki. Jeśli tu będzie dobrze (wahania ± 2...3LSB), trzeba się skupić na LM35. Jeśli będzie gorzej (np. ±50 jak w podanych przez Ciebie wynikach), zrób jedną z dwóch rzeczy:

a. Dostaw kondensator ceramiczny 100nF między masę a wejście ADC z potencjometru tuż przy pinie procesora. To powinno wyeliminować rzeczywiste zakłócenia sygnału - jeśli takowe istnieją.

b. Zmień referencję przetwornika na wewnętrzną za pomocą jednorazowego wywołania w setup() funkcji analogReference(INTERNAL). To zmieni napięcie odniesienia z domyślnego Vcc na wewnętrzne źródło 1.1V. Wyniki skoczą oczywiście w górę a napięcie wejściowe nie może być teraz większe niż te 1.1V, ale jeśli stabilność się poprawi to znaczy, że masz problem ze śmieciami na Vcc. Nie wiem czy docelowo może tak zostać, bo to ogranicza mierzoną przez LM35 temperaturę do 110°C, ale one i tak chyba dużo więcej nie umieją.

Pamiętaj, że wszelkie sygnały ADC mierzy względem pinów GND procesora. Jeśli masa między źródłem sygnału (czujnikiem) a procesorem jest długa, cienka i poprowadzona niepotrzebnie jakoś naokoło to na niej robi się w niesprzyjających warunkach dużo złego, które widzi przetwornik jako nieodróżnialną część sygnału.

Zwarcie wejścia do masy nie musi dawać wartości wyjściowej ADC dokładnie = 0 z powodu jego naturalnych błędów offsetu. Błąd ten może być zarówno dodatni (widzisz np. 3 gdy Uin=0V) jak i ujemny (odczyty zaczynają rosnąć dopiero od pewnego Uin>0).

Czy możesz pokazać tę swoją płytkę jako plik graficzny?

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.