Skocz do zawartości

Czujniki napięciowe (ciśnienia, temperatury itd) i ATmega


adamkoc

Pomocna odpowiedź

Witam wszystkich!!!

Mam zamiar do Atmegi32 (może 16 lub 8.) podłączyć napięciowy czujnik

ciśnienia o czułości 20mV/kPa.

Jako że jestem poczatkujący w zabawach z mikrokontrolerami nie wiem w jaki sposób napisać program mierzący napięcie, jak mają być zapisane warunki,
które mają być spełnione aby zostały wykonane jakieś instrukcje np.:

- jeśli ciśnienie jest z przedziału 100-110kPa (czyli napięcie jest

z przedziału 2000-2200mV), to włącz pin;

lub

- jeśli ciśnienie jest z przedziału 100-110kPa, to wcześniej ustalona zmienna np. "x"=1;

itp.

Rozumiem że podłączenie czujnika jest proste i wymaga tylko połączenia

wyjścia czujnika z pinem (ADC) mikrokontrolera.

Dane czujnika:

MPX4250DP

http://www.audiworld.com/tech/pix/mpx4250.pdf

Tak wogóle to piszę w języku C++ i najlepiej aby ktoś, kto chciałby pomóc, napisał w C lub C++, ale jeśli napisałby ktoś w basicu, może potrafiłbym to przełożyć, albo troszkę poczytam i może spróbuję napisać program w basicu.

Serdeczne dzięki i pozdrawiam

Link do komentarza
Share on other sites

A więc poczytaj w datasheet jakie właściwości ma PortA w atmega16/32.

W bascomie zrobienie takiego programu było by banalne, ale dopuki nie zobacze twoich wypocin w C albo Bascomie to nienapisze ci tego 😉

Pozdrawiam

Link do komentarza
Share on other sites

Moich wypocin? A na co Ci one, chyba, że chodzi o sprawdzenie czy nie czekam na gotowca.

W pewnym sense czekam, bo czujników analogowych jeszcze nigdy nie podłączałem. Napisałem natomiast program do programatora włączającego i wyłączającego jakieś urządzenie o trzech różnych godzinach.

Napisałem też program do starej zmywarki do naczyń. Program miał umożliwiać regulację czasu zmywania, dawać sygnał dźwiękowy, że zmywanie zakończone, sterował grzałkami (ale termostaty były na zasadzie 0/1). Nie bedę zamieszczał programu, żeby po pierwwsze nie zaśmiecać, a po drugie, od strony estetycznej (zapewne też składniowej) nie są najlepsze, bo dopiero zaczynam przygodę z mikrokontrolerami.

Teraz chcę zrobić swego rodzaju miernik ciśnienia, ale że potrzebuję więcej pinów niż 23, jakie ma Atmega8, dlatego zamierzam użyć 16 lub 32. W sumie cena niewiele je różni, a program, wrazie nienajlepszej składni (wtedy może zajmować więcej pamięci) na pewno się zmieści.

A co do właściwości portu A, przynajmniej w ATmedze32 to ma on m.in funkcję umożliwiającą podłączenia czujnika napięciowego.

Link do komentarza
Share on other sites

Dobra a więc tak:

niewiem jak to wygląda w C, w bascomie pobierasz dane z ADC za pomocą komendy

getadc(nrkanału)

Musisz tą wartość zapisać do zmiennej myśle że zmienna WORD albo SINGLE.

Potem zależnie od stopnia podziału sygnału dobierasz przelicznik.

Dla podziału 10bitowego i napięcia odniesienia 5V przelicznik wynosi 0.0049

Poczytaj helpa i sam sie dowiesz co i jak 🙂

Pozdrawiam

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

Czy to oznacza, że mam zapisać coś w stylu:

- na początku programu konfiguracja ADC, włączenie przetwornika, deklaracja zmiennych:

Config Adc = Single , Prescaler = Auto, Reference = AVCC

Start Adc

Dim W As Word

Dim cisnienie As Single ‘cisnienie w kPa

- dalej gdzies w programie, w miejscu gdzie potrzebuję:

W = Getadc(0) ‘0 jeśli chcę zczytywać z pinu A0?

Cisnienie = W*0.00488/.02 ‘czułość czujnika była 20mV/kPa

End

lub

Config Adc = Single , Prescaler = Auto, Reference = AVCC

Start Adc

Dim W As Word

Dim glebokosc As Single ‘chodzi o głębokość w wodzie, zakładam, że 1 cm słupa wody powoduje wzrost ciśnienia o 1 hPa

- dalej:

W = Getadc(0) 'lub Getadc(0, 204.8), bo 1024/5=204,8=1/0,00488 - tyle, że wówczas wartość zmienej W jest równa wsrtości napięcia na Pinie A0

glebokosc = W*.00488/.002 'czułość czujnika to 20mV/kPa, czyli 2mV/hPa, co daje w przybliżeniu 2mV na każdy dodatkowy centymetr zanurzenia, mnożenie przez 0,00488 można chyba pominąć jeśli w linii o jedną wyżej zastosujemy zapis Getadc(0, 204.8), bo jak podaje manual, można wpisać wzmocnienie

Do

If glebokosc>10 And glebokosc<=15 Then PortB1 = 1

Else PortB1 = 0

End If

Loop

End

Pytanie co do prescalera, dlaczego w manualu piszą, że dozwolone są dzielniki 2, 4, ..., 128, skoro jest 10 bitowy, czyli do 1024? Czy jeśli dam Auto, tak jak w przykładzie, automatycznie zostanie wybrane 1024?

Ważne, abym podłączył AVCC pod VCC, czyli 5V i między AREF I GND kond. 100uF.

Proszę o poprwaki

Link do komentarza
Share on other sites

Ogólnie piszesz dosyć dobrze podam ci taki kawałek programu:

Config Adc = Single , Prescaler = Auto, Reference = AVCC 
Start Adc 
Dim W As Word
Dim Cis as single

do
W = getadc() 
Cis = W * 0.0049
If cis > xxx then set portb.1
if cis < xxx then reset portb.1

loop
end

Majac napięcie referencyjne 5V i prescaler 10bitowy czyli 1024 mamy przelicznik 0.0049 bo 5/1024 = 0.0049

w = getadc()

Dla napięcia 2V na jednym z kanałów przetwornika A/C W będzie równe 409. Bo 2V/0.0049 = 409

  • Pomogłeś! 1
Link do komentarza
Share on other sites

no ok.

Ale podana przez Ciebie zmienna Cis oznacza wartość napięcia jaką podaje czujnik. Jeśli chcę mieć wartość ciśnienia, to muszęją podzielić przez 20 (czułość czujnika to 20mV/kPa), chyba dobrze kombinuję?

Co do komendy

W = getadc()

to w nawiazach muszę podać wartość "0" jeśli chcę czytać z pinu A0, lub "3" jeżeli z pinu A3?

co do 0,0049 to zgadzam się pod warunkiem że trzeba zaokrąglać do dziesięciotysięcznych, bo 5/1024=0,004882...

I jeszcze co to za zapisy w przykładowych programach w manualu:

$regfile = "m48def.dat"

$baud = 19200

$hwstack = 40

$swstack = 8

$framsize = 40

Ten pierwszy to pewnie podanie pod jaki mikrokontroler jest program, ale reszta to "czarna magia". Co to jest tak mówiąc po polsku?

Pozdrawiam i serdeczne dzięki za pomoc

Link do komentarza
Share on other sites

$baud - prędkość komunikacji po rs-232

$hwstack = 40 'wartosc stosu

$swstack = 80 'wartosc stosu

$framesize = 40 'wartosc ramki

Powyższe, wydaje mi się, że możesz spokojnie usunąć, dodaj:

$crystal = 8000000 'czestotliwosc zegara w Hz

bo to ważne 🙂

Link do komentarza
Share on other sites

Ok.

Ale co to oznacza:

prędkość komunikacji po rs-232

wartosc stosu

wartosc stosu

wartosc ramki

Co do zapisu:

$crystal = 8000000, to nie pisałem bo rozumiem ten zapis.

Wcześniej pisałem w C++ w synedicie. Tam ustawiało sięmikrokontroler i kwarc w makefile w WinAVR i wtedy chodziło mi na zewnętrznym. Czy jeśli w basicu użyję komendy:

$crystal = 8000000

to też będzie chodziło na zewnętrznym, czy będę musiał coś konfigurować w BASIC-AVR?

I co mi jeszcze napiszecie w sprawie moich pytań i przemyśleń z poprzedniego posta (tych dotyczących "0,0049", "W = getadc() ", zmiennej Cis i sposobu wyliczenia faktycznego ciśnienia, zeby dalej przekształcić na cyfry tysięcy, setek, dziesiątek i cyfr hPa)?

Serdeczne dzięki i pozdrawiam

[ Dodano: 19 Lis 08 09:09 ]

Jeszcze raz serdeczne dzięki za pomoc Trekerowi i Decado.

Myślę, że temat można uznać za zamknięty (dopóki ktoś go nie "otworzy" 🙂 )

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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