Strona Główna
FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy RegulaminRegulamin  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj




mikrosterowniki.pl

Przyszłość jest w naszych rękach...
...bo przyszłość to robotyka.





Poprzedni temat «» Następny temat
Czujniki napięciowe (ciśnienia, temperatury itd) i ATmega
Autor Wiadomość
adamkoc 


Posty: 5
Skąd: Łapy
Wysłany: 16 Lis 08 09:02   Czujniki napięciowe (ciśnienia, temperatury itd) i ATmega

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
Postaw piwo autorowi tego posta
 
 
Decado 



Pomógł: 6 razy
Posty: 160
Otrzymał 6 piw(a)
Skąd: Bełk
Wysłany: 16 Lis 08 09:17   

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
_________________
"Niema ludzi niewinnych, są tylko źle przesłuchiwani" Feliks "Krwawy Feliks" Dzierżyński
Postaw piwo autorowi tego posta
 
 
 
adamkoc 


Posty: 5
Skąd: Łapy
Wysłany: 16 Lis 08 10:07   

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.
Postaw piwo autorowi tego posta
 
 
Decado 



Pomógł: 6 razy
Posty: 160
Otrzymał 6 piw(a)
Skąd: Bełk
Wysłany: 16 Lis 08 10:44   

Dobra a więc tak:
niewiem jak to wygląda w C, w bascomie pobierasz dane z ADC za pomocą komendy
Kod:
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
_________________
"Niema ludzi niewinnych, są tylko źle przesłuchiwani" Feliks "Krwawy Feliks" Dzierżyński
Postaw piwo autorowi tego posta
 
 
 
adamkoc 


Posty: 5
Skąd: Łapy
Wysłany: 17 Lis 08 02:59   

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
Ostatnio zmieniony przez adamkoc 17 Lis 08 04:27, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Decado 



Pomógł: 6 razy
Posty: 160
Otrzymał 6 piw(a)
Skąd: Bełk
Wysłany: 17 Lis 08 04:41   

Ogólnie piszesz dosyć dobrze podam ci taki kawałek programu:
Kod:
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

Kod:
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
_________________
"Niema ludzi niewinnych, są tylko źle przesłuchiwani" Feliks "Krwawy Feliks" Dzierżyński
Postaw piwo autorowi tego posta
 
 
 
adamkoc 


Posty: 5
Skąd: Łapy
Wysłany: 17 Lis 08 05:39   

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
Postaw piwo autorowi tego posta
 
 
treker 
www.dioda.com.pl



Pomógł: 13 razy
Posty: 528
Otrzymał 30 piw(a)
Skąd: Gdynia
Wysłany: 17 Lis 08 05:48   

$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 :)
Postaw piwo autorowi tego posta
 
 
adamkoc 


Posty: 5
Skąd: Łapy
Wysłany: 17 Lis 08 07:20   

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" :-) )
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


website uptime

Powered by phpBB modified by Przemo © 2003 phpBB Group
REKLAMAPorównywarka cen elektronikiLove and Lighttaniec z gwiazdamitaniec nowoczesny Warszawakredyt przez internetneroBearShare