Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA8] Cyfrowy termometr i kalkulator

bdfhjk 14 Jul 2008 20:45 13168 57
Renex
  • #1
    bdfhjk
    Level 11  
    Planuję wykonać cyfrowy termometr wykorzystujący mikrokontroler ATMEGA8:
    -odczyt temperatury będzie polegał na analizie wejścia przetwornika analogowo-cyfrowego do którego podłączony jest dzielnik napięcia zawierający termistor.
    -wynik prezentowany będzie na 2 wyświetlaczach LED multipleksowanych.

    Stworzyłem już schemat, ale nie jestem pewien, czy udało mi się uniknąć pomyłek, ponieważ jest to mój drugi układ zawierający mikroprocesor.

    [ATMEGA8] Cyfrowy termometr i kalkulator

    Mam więc kilka pytań do bardziej doświadczonych elektroników:
    1. Czy dobrze zastosowałem technikę multipleksowania, szczególnie w kwestii dobrania tranzystorów i rezystorów oraz ich parametrów (wyświetlacze są zielone, mam nadzieję że 1 KΩ to nie za dużo)
    2. Czy schemat dzielnika napięcia nie ma błędów
    3. Czy przełączniki nie wymagają rezystorów pomiędzy nimi a mikrokontrolerem
    4. Czy układ zasilania jest odpowiednio filtrowany (termometr będzie zasilany zasilaczem stabilizowanym lub bateriami)
    5. Czy projekt da się wykonać poniższą lutownicą

    [ATMEGA8] Cyfrowy termometr i kalkulator

    [ATMEGA8] Cyfrowy termometr i kalkulator

    6. Czy ogólnie nie popełniłem żadnych innych błędów



    Z góry dziękuje za każdą wskazówkę
  • Renex
  • #2
    Balu
    Level 38  
    No no:)
    1)Pnp z emiterem na masie:)
    2)Brak 100nF na zasilaniu
    3)aref nie odfiltrowany...
    4)led2 led3 bez rezystorów.
    5)Chyba tyle... zamieszany schemat, ja bym wyświetlacze puścił jakimś buforem..
    .Ale jak chcesz.

    Łukasz
  • #3
    bdfhjk
    Level 11  
    Opracowałem drugi schemat:

    [ATMEGA8] Cyfrowy termometr i kalkulator

    Poprawiłem podłączenie tranzystorów, oraz dołożyłem rezystory przy diodach. Nie wiem czy dobrze dołożyłem kondensator przy zasilaniu. Co do " 3)aref nie odfiltrowany... " nie wiem o co chodzi... czy mam podłączyć pin AREF do czegoś? Mam zamiar korzystać z napięcia odniesienia 5V, wiec chyba nie potrzebuje tego pinu, ale ciężko jest mi to wywnioskować z dokumentacji ATMEL-a . Nigdy nie korzystałem z buforów, proszę również o jakąś informacje jakie układy do tego służą i co to daje.
  • Renex
  • #5
    Balu
    Level 38  
    Czy wyświetlacze masz CC czy CA jak tak jak na rysunku, to nie będą świecić nigdy :)
    100nF przed 7805 za 7805 na nóżkach procka i między aref a masą (tak pisze to w dokumentacji).

    W sumie 4x100nF ceramik.
  • #6
    bdfhjk
    Level 11  
    Przed stabilizatorem, za, przy AREF, a czwarty gdzie ("na nóżkach procka")? Czy mogę użyć większych kondensatorów, jakie będą tego skutki? A wyświetlacze mam LED więc chyba emitują światło? CC czy CA - czym to się różni ? Poniżej zdjęcia moich wyświetlaczy :

    [ATMEGA8] Cyfrowy termometr i kalkulator

    [ATMEGA8] Cyfrowy termometr i kalkulator

    [ATMEGA8] Cyfrowy termometr i kalkulator
  • #7
    cyberdar
    Level 31  
    Witam

    CC- wspólna katoda, CA - wspólna anoda. Na kondensatorach 15pF (przy kwarcu) może być problem z generatorem. Może się nie wzbudzić. Proponowałbym operować w zakresie 20-30pF. Zdaję sobie sprawę iż zaraz pojawi się milion zarzutów, że "dawałem kondensatory 18pF i mniej i wszystko chodziło". Uważam, że układ projektuje się tak aby działał w każdych warunkach i w związku z tym stosuję wartości środkowe. Przy skrajnych wartościach elementów może się zdarzyć, że układ nie wystartuje. Jak zauważyli przedmówcy na zasilaniu - na wejściu i wyjściu stabilizatora powinny się znaleźć kondensatory filtrujące z przedziału 22 ÷ 470nF. Napięcie dla przetwornika powinno być filtrowane dławikiem 10µH i kondensatorem 100nF. Wartości zalecane przez producenta. Kondensator powinien być wpięty pomiędzy pin AVCC a masę oczywiście.
    Wyprowadzenie AREF formalnie też powinno być podpięte pod napięcie AVCC nawet jeśli napięcie referencyjne ma mieć wartość 5V. Wyjątek stanowi właśnie MEGA8, która ma coś sknocone w środku i układ wyjątkowo zadziała. Podpięcie zewnętrznego napięcia referencyjnego np. 2.5V będzie stanowiło problem. Dojdzie do sytuacji, w której napięcie 2.5V zostanie połączone z napięciem 5V rezystorem około 5Ω. No chyba, że ATMEL usunął problem. Kolejna sprawa to diody D2 i D3. Gdyby to na mnie trafiło to dałbym je odwrotnie i wpiął między port a plus zasilania. Sterowane byłyby masą. Uzyskujesz wtedy wydajność do 20 lub 40mA. Czyli sporo. Dalej. Rezystory (chyba R2÷R9) mają zbyt dużą wartość. Średni prąd świecenia wyniesie około 1.3mA. Czyli przy zielonych wyświetlaczach może się zdarzyć, że pomimo, że będą działać to tego nie zauważysz. Na koniec napiszę, że generalnie jak to wszystko to uda Ci się uruchomić to popłyniesz na termistorze. Nic nie piszesz na temat charakterystyki ale generalnie są to elementy nieliniowe, które należałoby najpierw zlinearyzować a uzyskany sygnał dopasować do dopuszczalnego zakresu. Kolejna sprawa to nie wiem jak by to wyglądało z ujemnymi temperaturami. Wyjściem z sytuacji jest albo użycie układu cyfrowego DS18B20 lub tańszy LM35.
    I już na sam koniec proponowałbym podciągnięcie klawiszy do plusa zasilania rezystorkami np. 10kΩ.

    --
    pozdrawiam
  • #8
    bdfhjk
    Level 11  
    Zgodnie z dokumentacją pisze 12-22 pF, tym kierowałem się przy zakupie i mam nadzieję że się uda bo innych nie mam. Jeżeli chodzi o kondensatory filtrujące to chyba nie zrobię błędu jeżeli będą dużo większe (100µF). Co do prądu wyświetlania to jaki powinien być minimalny, maksymalny?
  • #9
    Balu
    Level 38  
    Coś to kolego cyberdar pomiętoliliście o tym błędzie...
    Może po kolei...
    capy przy rezonatorze... 20...33pF

    W tym procku jest właśnie avcc i vcc zwarte, a nie aref z vcc...więc filtrowanie AVCC właśnie się mija z celem, a filtrowanie AREF jest KONIECZNOŚCIĄ, und, zwarcie AREF z 5V jest NIEDOPUSZCZALNE, chyba,że chcesz mieć takie napięcie odniesienia...(a nie 2,5V)...
    CA CK chodzi o to co podłączasz na wspólną nóżkę czy + (WA) czy - (WK) jak WK to podłączasz tranzystorem npn i emter na masę, jak WA to podłączasz pnp i emiter na +.

    Co do 100uF na filtrowaniu... nie zrobisz dużego błędu...a NIEDOPUSZCZALNY BŁĄD!!
    Kolega wyżej podał Ci zakres 22n...470n (w/g mnie nawet troszkę za szeroki ale ujdzie) a 100uF tożto 3 rzędy różnicy?:>
  • #10
    bdfhjk
    Level 11  
    Więc dam 2x 15pF równolegle, tylko czemu w dokumentacji pisze 12-22pF? Na co ma wpływ pojemność kondensatorów przy rezonatorze?
  • #12
    bdfhjk
    Level 11  
    A jakie rezystory przy wyświetlaczach?
  • Helpful post
    #14
    crazy_phisic
    VIP Meritorious for electroda.pl
    Przy multipleksowaniu ważny jest również Ifp ;)
  • #16
    cyberdar
    Level 31  
    Witam

    Mój poprzedni post był nieco przydługawy więc umknęło mi napisanie, że zgodnie z podanym schematem będą działać wyświetlacze ze wspólną anodą. Co do przetwornika mogę/mogłem się mylić. Czytałem kiedyś na ten temat i nie wykluczone, że coś poknociłem. Kondensatory. Przy stabilizatorze powinny się właściwie znaleźć i kondensatory elektrolityczne i stałe (ceramiczne, itd.) Wiadomo jedne służą do zabezpieczenia przed wzbudzaniem się układu i filtrują napięcie natomiast drugie (elektrolityczne) do tłumienia tętnień napięcia - żeby nie przysiadało. Zakres kondensatorów (stałych) to poprostu "zakres". Osobiście preferuję 100÷470nF. Rezystory do wyświetlaczy proponowałbym dać o wartości powiedzmy 120 lub 130Ω. Średni prąd wyniesie wtedy około 10mA. Prąd minimalny dla mnie to powiedzmy te 5mA choć są w sprzedaży wyświetlacze o podwyższonej jaskrawości i prąd ten można by zmniejszyć - nawet o 2-3mA. W tym wypadku ustalenie prądu na średnim poziomie 10mA na wyświetlacz jest w zupełności wystarczające. Procesor też nie powinien robić żadnych problemów. W razie czego pomiędzy rezystory możesz wpakować ULN2803. Wartości elementów zostają takie same.

    --
    pozdrawiam
  • #17
    bdfhjk
    Level 11  
    Opracowałem 3 wersje schematu która rozwiązuje powyższe problemy :

    a) kierując się "Rezystory do wyświetlaczy proponowałbym dać o wartości powiedzmy 120 lub 130Ω. Średni prąd wyniesie wtedy około 10mA. "

    [ATMEGA8] Cyfrowy termometr i kalkulator

    jednak zgodnie z moimi obliczeniami przez segment wyświetlacza będzie przechodziło jednak ok. 45mA (5V / (100 + 1k/100)Ω ) a w sumie przez port ok. 400mA więc może być to zbyt duże obciążenie dla mikrokontrolera.

    b) kierując się moimi obliczeniami

    [ATMEGA8] Cyfrowy termometr i kalkulator

    Ale zastanawiam się nad tym, że wtedy przez segment będzie płyną prąd o natężeniu od 25mA do ok. 45mA i nie wiem czy będzie to widać (nierówne świecenie) . Ew. mogę jeszcze zwiększyć rezystory przy tranzystorach. Noty katalogowej wyświetlaczy nie znalazłem, bo nie wiem jaki to jest typ (jeżeli ktoś powie który z ciągów znaków to jest nazwa serii to pewnie znajdę). Wiec który schemat wybrać ? A może źle to liczę?
  • #19
    bdfhjk
    Level 11  
    Niestety nie mam żadnych buforów, ani możliwości kupienia ich. Czyli na tym pierwszy schemacie w moim ostatnim poście kiedy wyświetlą się dwie "8" port się nie spali? Sprawdziłem, że przy 9mA i 9V na jeden segment wyświetlacz świeci bardzo jasno.

    Postanowiłem jednak zrobić tak:

    [ATMEGA8] Cyfrowy termometr i kalkulator

    Jak nie będzie działać to wymienię rezystory.
  • #20
    dawid512
    Level 32  
    Jakie 9V? Weź 5V ze stabilizatora. Ja ostatnio dawałem 470R na segment i świeci dobrze. Port się nie spali bo to multipleksacja chyba wiesz co to znaczy.
  • Helpful post
    #21
    cyberdar
    Level 31  
    Witam

    :arrow: bdfhjk skąd Ci się wzięło 45mA. Jak od napięcia zasilania 5V odejmiesz 2.4V spadku na diodzie w wyświetlaczu oraz odejmiesz 0.2V na tranzystorze w stanie nasycenia i olejesz spadek na porcie (zazwyczaj około 50mV) to wyjdzie Ci 2.4V. Jeśli podzielisz tą wartość przez 120Ω to jak nic wychodzi Ci 20mA. W rzeczywistości ten prąd będzie nieznacznie mniejszy. Wobec tego dla obciążenia procesora dwoma wyświetlaczami LED przy powyższych założeniach raczej nie ma ryzyka uszkodzenia. Moim zdaniem bufory można oczywiście dać ale ich obecność w tym szczególnym przypadku nie jest bezwzględnie konieczna. Pozwoliłem sobie właśnie zajrzeć do noty katalogowej układu i wynika jasno, że ów prąd wynosi 40mA na pin. A więc może zostać bez drivera. Nawet jeśli program napiszesz źle i będzie Ci z jakichś powodów świecił tylko jeden wyświetlacz to ani tenże nie ulegnie uszkodzeniu ani procesor. Rozsądnie zaprojektowany układ powinien wg mnie pociągnąć 4 wyświetlacze bez dodatkowego drivera.

    --
    pozdrawiam
  • #22
    dawid512
    Level 32  
    Moja mega8 obsługuje 8 wyświetlaczy i żadnego problemu nie ma, rezystory 470R na segment, zasilanie 5V ze stabilizatora przez PNP.
  • #24
    cyberdar
    Level 31  
    Witam

    Oczywistą oczywistością :D jest, że 200mA.

    --
    pozdrawiam
  • #25
    bdfhjk
    Level 11  
    Tak wygląda gotowy projekt:

    [ATMEGA8] Cyfrowy termometr i kalkulator

    [ATMEGA8] Cyfrowy termometr i kalkulator

    [ATMEGA8] Cyfrowy termometr i kalkulator

    Poziom świecenia wyświetlaczy jest dobry jak widać na zdjęciach, jednak mam pewny problem z mikrokontrolerem, który prawdopodobnie jest uszkodzony (czego efektem jest świecenie tylko dwóch segmentów oraz bardzo wolna praca ). Przyczyną tego chyba jest uszkodzony stabilizator, który dawał napięcie 6.2V zamiast 5V. Nie sprawdzałem ADC. AtMEGA8 powinna pracować na wewnętrznym oscylatorze 1Mhz (nic nie zmieniałem w fuse-bits), nie przestawiłem jej na 16Mhz ponieważ nie wiem czy nie zablokuje jej całkiem. Uszkodzony stabilizator wymieniłem, ale czy to prawdopodobne że akurat ISP działa, 2 segmenty też (na innym niż ISP porcie), a reszta segmentów oraz przyciski nie?
  • #26
    Balu
    Level 38  
    Fajnie, a w kodzie nie napisałeś przypadkiem $crystal=16000000?
    Poza tym... ekhem... dowiedz się co to folia (rurka) termokurczliwa... Bo ta taśma klejąca to aż woła o pomstę do nieba...
    Sprecyzuj reszta nie działa... bo to trudne dla mnie po tym co zaobaczyłem na PCB;p

    POKAŻ KOD!
  • #27
    bdfhjk
    Level 11  
    
    
    #include <inttypes.h>
    #include <avr/io.h>
    /*
    #include <alloca.h>
    #include <assert.h>
    #include <ctype.h>
    #include <errno.h>
    #include <inttypes.h>
    #include <math.h>
    #include <setjmp.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <avr/boot.h>
    #include <avr/eeprom.h>
    #include <avr/fuse.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    #include <avr/lock.h>
    #include <avr/pgmspace.h>
    #include <avr/power.h>
    */
    
    #define sbi(port, bit) (port) |= (1 << (bit))
    #define cbi(port, bit) (port) &= ~(1 << (bit))
    
    //PC5 - tranzystor od DIS1
    //PORTD - sterowanie wyświetlaczami
    //PB0 - tranzystor od DIS2
    //PB1 - PB2 - diody kontrolne
    //PC1 - PC4 - przyciski
    
    int main (void)
    {
    	sbi(DDRC, PC5);
    
    	sbi(DDRD, PD0);
    	sbi(DDRD, PD1);
    	sbi(DDRD, PD2);
    	sbi(DDRD, PD3);
    	sbi(DDRD, PD4);
    	sbi(DDRD, PD5);
    	sbi(DDRD, PD6);
    	sbi(DDRD, PD7);
    
    	sbi(DDRB, PB0);
    
    	sbi(DDRB, PB1);
    	sbi(DDRB, PB2);
    
    	sbi(PORTC, PC1);
    	sbi(PORTC, PC2);
    	sbi(PORTC, PC3);
    	sbi(PORTC, PC4);
    
    	cbi(PORTC, PC5);
    
    	cbi(PORTD, PD0);
    	cbi(PORTD, PD1);
    	cbi(PORTD, PD2);
    	cbi(PORTD, PD3);
    	cbi(PORTD, PD4);
    	cbi(PORTD, PD5);
    	cbi(PORTD, PD6);
    	cbi(PORTD, PD7);
    
    	cbi(PORTB, PB0);
    
    	sbi(PORTB, PB1);
    	sbi(PORTB, PB2);
    
    	int i = 0;
    	int j = 0;
    	int k = 0;
    	int zm = 10;
    
    	while(1)
    	{
    	cbi(PORTD, PD0);
    	cbi(PORTD, PD1);
    	cbi(PORTD, PD2);
    	cbi(PORTD, PD3);
    	cbi(PORTD, PD4);
    	cbi(PORTD, PD5);
    	cbi(PORTD, PD6);
    	cbi(PORTD, PD7);
    
    		for(i =0; i < 255; i++)
    		{
    			for(j =0; j < zm; j++)
    			{
    				for(k = 0; k < 10; k++)
    				{
    				    asm("nop");
    				}
    			}
    		}
    
    	sbi(PORTD, PD0);
    	sbi(PORTD, PD1);
    	sbi(PORTD, PD2);
    	sbi(PORTD, PD3);
    	sbi(PORTD, PD4);
    	sbi(PORTD, PD5);
    	sbi(PORTD, PD6);
    	sbi(PORTD, PD7);
    
    	if (bit_is_clear(PORTC, PC1) ) {zm = 100;}
    	if (bit_is_clear(PORTC, PC2) ) {zm = 100;}
    	if (bit_is_clear(PORTC, PC3) ) {zm = 100;}
    	if (bit_is_clear(PORTC, PC4) ) {zm = 100;}
    
    
    		for(i =0; i < 255; i++)
    		{
    			for(j =0; j < zm; j++)
    			{
    				for(k = 0; k < 10; k++)
    				{
    				    asm("nop");
    				}
    			}
    		}
    
    	}
    
    	sbi(PORTD, PD0);
    	sbi(PORTD, PD1);
    	sbi(PORTD, PD2);
    	sbi(PORTD, PD3);
    	sbi(PORTD, PD4);
    	sbi(PORTD, PD5);
    	sbi(PORTD, PD6);
    	sbi(PORTD, PD7);
    
    	while (1) { }
    	while (1) { asm("nop"); }
    	while (0) { }
    
    	return(0);
    }
    
    
    



    W ustawieniach AVRStudio ustawiłem 1Mhz.

    Segmenty zapalają się i gasną z częstotliwością 1Hz

    Reszta segmentów nie działa, mimo tego że są połączone z pinami (sprawdziłem miernikiem). Naciśnięcie przycisku nie daje zamierzonego efektu. Czy może to być spowodowane tym, że 100nF jest za daleko ?
  • #28
    Balu
    Level 38  
    A słyszałeś o czymś takim jak...
    PORTD=0xff;?
    Albo DDRD=0b111010101 albo coś?

    Poza tym, nie chcę być paskudny i niemiły... sprawdziłeś czy Twoje wyświetlacze mają nóżkę common tam, gdzie się jej spodziewał Eagle?
  • #29
    bdfhjk
    Level 11  
    Wyświetlacze są w porządku, a kod pisze taki żeby być pewnym że będzie działał i nie pomyliłem się w liczeniu