Skocz do zawartości

Atmega 328p - działanie ADC z obciążeniem i bez.


Apsor

Pomocna odpowiedź

Witam,
mam problem z odczytywaniem wartości adc i zapalaniem diody, problem polega na tym że pomiaru dokonuje na zmianę - przy zapalonej diodzie i przy zgaszonej diodzie i pomiary te różnią się o około 5mV. Co przy ustawionym napięciu wewnętrznym na 1,1V daje aż 5 bitów różnicy. Czy to jest normalne i czy można się jakoś tego pozbyć ? Zasilanie próbowałem dwa różne z zasilacza i z komputera - to samo. kondensatory filtrujące są. Dioda podłączona przez rezystor 220, ale po zwiększeniu też wyskakuje przeskakiwanie wartości. Nie mam cewki dlatego nie ma filtra LC na wejściu. napięcie Uref podłaczone przez kondensator do masy. Ktoś ma jakiś pomysł dlaczego tak się dzieje i jak się tego pozbyć ? Wiem, mogę zawsze odczytywać adc przy takim samym stanie diody, ale przy bardziej złożonych programach jest nieuniknione odczytywanie przy różnym obciążeniu. Program :

/*
* main.c
*
*  Created on: 20 gru 2014
*      Author: User
*/


#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\sleep.h>
#include<util/delay.h>
#include "HD44780.h"

#define LED (1<<PB7)
   #define ADCIN PC4

ISR(ADC_vect)
{
}

void initADC()
{
ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<MUX2);
ADCSRA= (1<<ADEN) | (1<<ADIE) |(1<<ADPS0)|(1<<ADPS1);	//Włącz ADC, przerwania, preskaler
   DDRB |= LED ;
   DDRC &=~ (1<<ADCIN);
   LCD_Initalize();
}

int GetADC()
{
set_sleep_mode(SLEEP_MODE_ADC);	//Tryb noise canceller
cli();
sleep_enable();			//Odblokuj możliwość wejścia w tryb sleep
   sei();
   sleep_cpu();			//Wejdź w tryb uśpienia
   sleep_disable();		//Zablokuj możliwość wejścia w tryb sleep
return ADC;
}

volatile int wyn;

int main()
{
char temp[10];
initADC();

while(1){
wyn=GetADC();
sprintf(temp,"%d",wyn);
LCD_Clear();
LCD_WriteText(temp);
PORTB^=LED;
_delay_ms(300);
}
}
Link do komentarza
Share on other sites

Po co pokazujesz nam program skoro wiesz (lub bardzo silnie podejrzewasz), że to w nie w nim jest problem?

Wrzuć rzeczywisty schemat, ale taki z uwzględnionymi miejscami połączeń masy, doprowadzeń zasilania, mierzonego napięcia, no ogólnie jak najbardziej szczegółowy. Jeśli chcesz się bawić w pomiary mV musisz wziąć pod uwagę wiele czynników w tym rezystancje ścieżek i spadki napięcia od wszelkich prądów płynących w układzie a i tak będzie to tylko początek drogi do precyzyjnych systemów pomiarowych. Do czego potrzebujesz takich dokładności? Przecież ADC w tych procesorach ma błędy na poziomie 4 LSB i to przy referencji 4V. Można się spodziewać, że dla 1V będzie o wiele gorzej.

Moja hipoteza jest taka: załączanie diody powoduje zmianę prądu wpływającego lub wypływającego (to ważne) z/do portu I/O a przetwornik widzi napięcie względem swojej masy wewnątrz struktury procesora. Wystarczy, że źle dobrałeś prowadzenie mas i położenie punktu wspólnego na płytce albo zmuszasz procesor do zasilania diody przez swoją wewnętrzną masę (np. dioda od plusa zasilania do pinu portu).

Link do komentarza
Share on other sites

Nie potrzebuje takiej dokładności, ale ucze się dopiero o programowaniu / uC i chcę wiedzieć jak eliminować najwięcej błędów : ). Oddzielenie masy AGND i GND dużo pomogło.

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

Zrobiłem tak żeby masy się stykały najbliżej źródła, jedną mam na AGND, AVCC AREF i czujnik, a drugą na resztę. są połączone w jednym miejscu, przy źródle. Zauważyłem jednak pewien problem, podczas gdy dioda jest włożona fizycznie do układu to wartość skacze od np. 223 do 226 ( jeden pomiar z włączoną diodą jeden z wyłączoną ) a jak wyjmę diode z układu ( idealnie tan sam program, tylko ją wyjmę z płytki ) to jest stała na poziomie około 231 : d. Czy brak filtra LC może mieć aż takie znaczenie ?

Link do komentarza
Share on other sites

No ale to wciąż jest bajka o Czerwonym Kapturku. Dopóki nie pokażesz szczegółowego schematu o czym pisałem poprzednio, to czego się spodziewasz? Odpowiedzi typu:

"Wynik pomiaru ADC jest stosunkiem napięcia mierzonego do Vref. Jeżeli zmienia się (widziane przez ADC) napięcie wejściowe, wynik ulega zmianie. Jeżeli zmienia się Vref, to samo."? Jeżeli nie pokażesz nam układu pomiarowego, resztę musisz sobie sam dośpiewać. Jeżeli prąd diodki płynie na jakimkolwiek odcinku wspólną ścieżką masy względem której ADC mierzy, masz objaw jaki masz. Najgorszy przypadek to obciążenie (diodka LED) podłączone od plusa zasilania do nóżki portu - o tym też już pisałem, ale nic na to nie odpowiedziałeś. W tym przypadku zmienia się prąd płynący przez wewnętrzne połączenia masy procesora i tym samym poziom odniesienia Vref w ADC. Jeżeli zmienia się napięcie zasilania na skutek zmian pobieranego prądu, to przecież Vref też nie jest idealne i też się trochę zmienia - choć to zjawisko jest o rzędy wielkości słabsze niż problemy spadków napięcia na masie. Jak masz to podłączone? Do którego portu? Schemat, Kolego, dobry schemat z dokładnie odwzorowanymi miejscami rzeczywistych połączeń. Chcesz szczegółowej dyskusji czy mamy się domyślać i gdybać? Trochę mi szkoda czasu.

Link do komentarza
Share on other sites

Oczywiści, w załączniku przesyłam dwa filmy jeden z włożoną diodą i drugi bez włożonej diody. Mogę pomierzyć napięcia miernikiem tylko podajcie które potrzeba. Na zdjęciu myślę że wyraźnie widać schemat jak to w rzeczywistości wygląda.

edit: pomierzyłem jak zmienia się napięcie na na Aref, bez diody - stałe na piziome 1,104V z dioda zmienia się od 1,104 do 1,107V.

2.avi

1.avi

Link do komentarza
Share on other sites

Acha, to już rozumiem dlaczego nie dostaliśmy schematu. Nie Kolego, to nie jest schemat elektryczny Twojego układu tylko jego zdjęcie. Nikt nie będzie szukał ładu (lub błędu) w plątaninie kolorowych kabelków - to po pierwsze. Po drugie darmowa porada: płytki stykowe nadają się do robienia najprostszych układzików gdzie nie chodzi o żadne szczegóły, strojenie i dokładności osiąganych parametrów tylko o wynik działa-nie-działa a i to nie zawsze (działa). Jeżeli drążysz temat próby zbliżenia się do parametrów podanych w danych katalogowych scalaka zmierzonych w warunkach laboratoryjnych przez gości znających się a swojej robocie to musisz spełniać wszystkie te warunki, tj. rozumieć co robisz, zbudować odpowiednio precyzyjny układ i rozumieć jego ograniczenia. Brak schematu i płytka stykowa niestety nie spełniają tych założeń. Czekamy na schemat lub będziesz dostawał opisowe odpowiedzi typu popraw masy, przemyśl przepływ prądów, spadki napięć, bla bla bla.. W ramach rozgrzewki możesz nanieść na zdjęcie w postaci kolorowych kresek drogi prądów, możesz ograniczyć się tylko do mas (ale za to wszystkich) i zastanów się co z tego wynika w świetle tego co już Ci napisałem.

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

EDIT: Twoje pomiary napięć nie mają sensu jeśli nie piszesz dokładnie między którymi punktami mierzyłeś. Nie, napisanie "no oczywiście, że między masą a Vref" nie wystarczy. W sytuacji gdy na rezystancji kabelka powiększonej o kiepskie złącza płytki masz spadki kilku mV musisz po prostu pokazać na schemacie gdzie przyłożyłeś jedną a gdzie drugą sondę multimetru. Na razie wiemy, że to Twój miernik widział różnice. Pytanie, czy to samo widział przetwornik. Zaczynasz rozumieć o co chodzi?

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.