Skocz do zawartości

[C][avr]adc dziwne wartośći


alex_o

Pomocna odpowiedź

Witam,

posiadam płytkę. Oto jej schemat:

Napisałem program w C który ma za zadanie odczytywać wejście IN1(PC0) i na wyświetlaczu pokazywać zawartość rejestru ADCW.

Mam następujący problem gdy nie mam podłączonego zasilacza do IN1 to po podaniu zasilania na płytkę na wyświetlaczu zamiast wartości 0 pokazuje się różne liczby raz 575 innym razem 639, 704 itp.

Gdy podepnę zasilacz(jest wyłączony) do IN1 to pokazuje się 7.

Gdy włączam zasilacz wyskakuje 15 w momencie gdy na zasilaczu mam ustawione 0,1 V.

Czy mam jakiś błąd w kodzie?

#include <avr> 
#include <util> 
#include "hd44780.h" 
#include <stdlib> 
#include <avr> 


volatile uint16_t wartosc; 
char a[10]; 

ISR(ADC_vect) 
{ 

LCD_Clear(); 

wartosc = ADCW; 
itoa( wartosc, a, 10 ); 
LCD_WriteText(a); 
_delay_ms(1000); 
} 

int main(void) 
{ 
DDRB= 0x07; 
  PORTB=0x38; 
  DDRD=0x01; 
  DDRC= 0xff; 


ADCSR = _BV(ADEN)|_BV(ADIE)|_BV(ADFR)|_BV(ADSC);  // konfiguracja ADC 
ADMUX |= _BV(REFS0)|_BV(REFS1)&~_BV(MUX0); // kanal 0 PC0 


   /* Funkcja inicjalizuje wyświetlacz*/ 
LCD_Initalize(); 

sei(); 

while(1) 
{ 


} 
return 0; 
}
Link do komentarza
Share on other sites

1. Robiąc schematy korzystaj z jakiegoś programu do schematów, a nie męcz się w Paint-cie. Szybciej zrobisz i czytelność będzie większa, i później łatwo płytkę zaprojektujesz: http://mikrokontrolery.blogspot.com/2011/04/kicad-projektowanie-schematow-i-pytek.html

2. RESET nie może "nie być podłączony". To antenka zbierająca zakłócenia: http://mikrokontrolery.blogspot.com/2011/04/zakocenia-w-pracy-mikrokontrolerow.html

Są dwa wyjątki:

- wyłączasz reset poprzez odpowiedni fusebit (ale nie napisałeś, że tak robisz),
- włączasz wewnętrzny pull-up programowo, ale tego w programie nie robisz.

Ten drugi sposób, w środowisku z silnikami i/lub przekaźnikami niestety może zawodzić i mikrokontroler może się resetować z powodu indukowanych na pinie Reset zakłóceń, ponieważ wewnętrzny rezystor pull-up ma doś dużą wartość. Dlatego Atmel zaleca zewnętrzny 4,7-10k bez włączania pull-up.

Więcej na ten temat: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html

3. Na Vcc nie dałeś kondensatora filtrującego zasilanie. Podobnie na wyjściu stabilizatora.

To bardzo istotne: http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html

4. W drugim linku z pkt 2 jest także informacja jak postępować by przygotować ADC do stabilnych pomiarów.

5. Szczerze mówiąc przydałoby się dobrej rozdzielczości zdjęcie Twojego układu, ponieważ obawiam się (mam nadziej, że się mylę) że możesz mieć tam jakieś błędy.

Gdy uporasz się z tym co powyżej, będziemy mogli rozmawiać na temat Twojego programu, bo tam też są błędy i to katastrofalne.

Link do komentarza
Share on other sites

1. Robiąc schematy korzystaj z jakiegoś programu do schematów, a nie męcz się w Paint-cie. Szybciej zrobisz i czytelność będzie większa, i później łatwo płytkę zaprojektujesz: http://mikrokontrolery.blogspot.com/2011/04/kicad-projektowanie-schematow-i-pytek.html

Schemat dostałem razem z płytką którą kiedyś kupiłem

2. RESET nie może "nie być podłączony". To antenka zbierająca zakłócenia: http://mikrokontrolery.blogspot.com/2011/04/zakocenia-w-pracy-mikrokontrolerow.html

Są dwa wyjątki:

- wyłączasz reset poprzez odpowiedni fusebit (ale nie napisałeś, że tak robisz),
- włączasz wewnętrzny pull-up programowo, ale tego w programie nie robisz.

Ten drugi sposób, w środowisku z silnikami i/lub przekaźnikami niestety może zawodzić i mikrokontroler może się resetować z powodu indukowanych na pinie Reset zakłóceń, ponieważ wewnętrzny rezystor pull-up ma doś dużą wartość. Dlatego Atmel zaleca zewnętrzny 4,7-10k bez włączania pull-up.

Więcej na ten temat: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html

3. Na Vcc nie dałeś kondensatora filtrującego zasilanie. Podobnie na wyjściu stabilizatora.

To bardzo istotne: http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html

Gotową płytkę kiedyś kupiłem i wszystko było na niej już podłączone.

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

pytanie czy płytka bbyła fabryczna czy moze zakupiona na allegro badzi w inny sposob odkupiona od kogos byc moze masz gdzies zwarcie na płytce zle polutowana ewentualnie zle masa jest połozona masa analogowa i cyfrowa musi byc połonczona tylko w jednym miejscu najlepiej w miejscu badania takie zeczy wyczytałem na elektrodzie 🙂 bez zdj ciesko powiedziec co dokładnie dolega aa i najwazniejsze z tego co widze to w programie to albo kod nie jest pełny albo wogole nie przetwarzasz danych to co ci daje przetwornik to ty to wyswietlasz w ten sposob bd miał dane z adc a napiecei to kto z tego wyliczy? 🙂

Link do komentarza
Share on other sites

pytanie czy płytka bbyła fabryczna czy moze zakupiona na allegro badzi w inny sposob odkupiona od kogos byc moze masz gdzies zwarcie na płytce zle polutowana ewentualnie zle masa jest połozona masa analogowa i cyfrowa musi byc połonczona tylko w jednym miejscu najlepiej w miejscu badania takie zeczy wyczytałem na elektrodzie 🙂 bez zdj ciesko powiedziec co dokładnie dolega aa i najwazniejsze z tego co widze to w programie to albo kod nie jest pełny albo wogole nie przetwarzasz danych to co ci daje przetwornik to ty to wyswietlasz w ten sposob bd miał dane z adc a napiecei to kto z tego wyliczy? 🙂

Płytka jest fabryczna została zakupiona w sklepie internetowym jako sterownik do pieca ale od jakiegoś czasu leżała nieużywana. Niedawno zainteresowałem się programowaniem mikrokontrolerów więc postanowiłem że się na niej trochę pouczę skoro wszystko jest podłączone już. Razem z płytką dostałem płytę z różnymi programami ale wszystkie są w bascomie tak samo wszyscy na forum tego sklepu chyba tylko w tym piszą więc nie uzyskałem tam żadnego zainteresowania.

Na początek chciałbym odczytać dane a że mam wyżej opisane problemy to się na takim poziomie zatrzymałem. A wyliczenie napięcia to nie będzie już chyba większym problemem.

Postaram się jutro zrobić zdjęcie jak tego jak to wszytko podłączyłem.

Link do komentarza
Share on other sites

No właśnie zrób to o co prosiłem:

posprawdzaj wszystko z tym co napisałem i ewentualnie popraw, oraz pokaż zdjęcie.

... i wtedy zajmiemy się programem, bo jak już pisałem jest co poprawiać 🙂

Link do komentarza
Share on other sites

Czemu nie piszesz, że wiesz kto jest producentem (adres www na płytce). Zawsze można go zapytać o dokumentację płytki. Takie informacje dużo dają. Inne uwagi dostałbyś gdybyśmy to wiedzieli wcześniej.

To zdaje się ta płytka: http://nestor-electronic.pl/strona.php?sterowniki

Ale do rzeczy:

1. Pobieżnie patrząc na płytkę (przydałby się oryginalny schemat) moja uwaga dot. braku kondensatora (link podałem) na wyjściu stabilizatora napięcia jest nadal aktualna. Resztę przyjmuję, że producent dołożył starań i zrobił płytkę zgodnie z datasheet mikrokontrolera.

2. Zajmijmy się więc programem.

Na początek najważniejszy problem. Ustawiasz ADC w tryb free-running. Czy jesteś świadomy, jak często (przy takich ustawieniach ADC) wywoływane jest przerwanie?

Policz to i napisz. To będzie podstawą do zrozumienia przez Ciebie najważniejszego błędu jaki popełniasz.

Dodatkowo podaj jaki masz kwarc bo na schemacie brak info, a na zdjęciu nie widać.

Link do komentarza
Share on other sites

To teraz się zastanów jak się to ma do Twojej funkcji przerwania:

ISR(ADC_vect) 
{ 

  LCD_Clear(); 

  wartosc = ADCW; 
  itoa( wartosc, a, 10 ); 
  LCD_WriteText(a); 

  _delay_ms(1000); 

} 

A swoją drogą tak szybko ADC pracować nie może:

By default, the successive approximation circuitry requires an input clock frequency between 50 kHz and 200 kHz to get maximum resolution.

If a lower resolution than 10 bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate.

Link do komentarza
Share on other sites

Wyrzuciłem z przerwania kasowanie LCD, zapis do niego, konwersje i delaya oraz go zmniejszyłem.

Dorzuciłem także preskaler i coś zaczęło działać.

Wielki dzięki za pomoc.

Będę musiał zapoznać się szerzej z zawartością podanej przez Ciebie strony.

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.