Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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

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

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.

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

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

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

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

$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 🙂

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" 🙂 )

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