INTELIGENTNE PRZTWORNIKI POMIAROWE.doc

(768 KB) Pobierz
INTELIGENTNE PRZTWORNIKI POMIAROWE

 

 

 

INTELIGENTNE PRZETWORNIKI POMIAROWE

 

 

 

 

 

 

 

 

 

Dokumentacja projektu

 

 

 

 

 

Termometr cyfrowy z czujnikiem platynowym Pt100.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Wykonał: Łukasz Kipka

Promotor: dr inż. Józef Wiora

 

I Zakres projektu:

 

u    zaprojektowanie i zbudowanie układu

u    zaprogramowanie mikrokontrolera, tak by cały układ działał jako termometr cyfrowy

u    sporządzenie dokumentacji

 

 

 

 

II Charakterystyka wykorzystanych urządzeń:

 

 

1. Platynowy czujnik Pt100

 

Platynowy czujnik Pt100 jest typowym przykładem rezystancyjnego czujnika temperatury. Czujniki rezystancyjne są to przyrządy reagujące na zmianę temperatury zmianą rezystancji wbudowanego w nie rezystora.  Zasada działania czujników rezystancyjnych polega na wykorzystaniu zjawiska zmiany rezystancji metali wraz z temperaturą. Ze wzrostem temperatury wzrasta amplituda drgań jąder atomów oraz prawdopodobieństwo zderzeń elektronów swobodnych i jonów, co ze względu na hamowanie ruchu elektronów powoduje wzrost rezystancji.

 

Platynowe termorezystory są szeroko wykorzystywane w przemyśle ze względu na wysoką temperaturę topnienia, stałość własności fizycznych, ciągłość zależności rezystancji od temperatury bez wystąpienia histerezy. Równania określające zależność między temperaturą a rezystancją są następujące:

 

- w zakresie od –200 ˚C do 0 ˚C              Rt = R0 [1+At+Bt2+C (t-100 ˚C)t3]

 

- w zakresie od 0 ˚C do 850 ˚C              Rt = R0 (1+At+Bt2)

 

Dla platyny o jakości zwykle stosowanej w przemysłowych czujnikach rezystancyjnych wartości stałych w tych równaniach są następujące:

 

A = 3,9083 x 10-3 ˚C-1

B = -5,775 x 10-7 ˚C-2

C = -4,183 x 10-12 ˚C-4

 

 

Wg PN-EN 60751 przy temperaturze 0oC nominalna wartość rezystancji wynosi100.000Ω. Dostępne są również czujniki rezystancyjne o nominalnych wartościach 500Ω (Pt500) oraz 1000Ω (Pt1000) przy temperaturze 0oC. Charakteryzują się one znacznie większą dokładnością (większa rozdzielczość rezystancji w stosunku do temperatury).

 

 

 

 

 

 

Dopuszczalne tolerancje błędów dla platynowych czujników rezystancyjnych zostały dokładnie opisane w normie PN-EN 60751:1997+A2. Norma ta rozróżnia dwie klasy dokładności: A i B. Poniżej zostały podane wzory na obliczanie dopuszczalnej odchyłki.

 

Klasa A: t = ± (0.15 + 0.002 x |t|)

Klasa B: t = ± (0.30 + 0.005 x |t|)

 

t = temperatura w ˚C

 

Tolerancja klasy A dotyczy temperatur rzędu –200 do +600 ˚C. Tolerancja klasy B dotyczy temperatur rzędu –200 do +850 ˚C.

 

 

 

Rys. Charakterystyka czujnika Pt100 oraz tolerancja błędów.

 

2. Wyświetlacz alfanumeryczny ze sterownikiem HD44780

Obecnie, ze względu na swoją niską cenę, alfanumeryczne wyświetlacze LCD są bardzo często stosowane w układach zbudowanych w oparciu o mikrokontrolery. Wygląd typowego modułu wyświetlacza 2 linie po 16 znaków przedstawiają poniższe fotografie:


Rozmieszczenie wyprowadzeń typowego modułu LCD przedstawia poniższa fotografia:

 

Opis funkcji poszczególnych wyprowadzeń:

Po podłączeniu napięcia zasilającego (tylko) na wyświetlaczu powinna ukazać się jedna linia wypełniona czarnymi prostokątami :

Świadczy to o tym, że kontroler wyświetlacza nie został poprawnie zainicjowany oraz o tym, że napięcie regulacji kontrastu jest ustawione w przybliżeniu na właściwą wartość. Większość wyświetlaczy do poprawnego wyświetlenia znaków wymaga napięcia kontrastu zbliżonego do 0V. Mogą się jednak zdarzyć wyświetlacze wymagające ujemnego napięcia kontrastu.
 


Sterowanie wyświetlaczem alfanumerycznym ze sterownikiem HD44780 odbywa się na zasadzie wysyłania odpowiednich komend oraz zapisu danych do wewnętrznej pamięci wyświetlacza. Komendy i dane są rozróżniane na podstawie stanu linii RS (0 - komendy; 1 - dane). Kierunek transmisji jest określany stanem linii R/W. Sterownik HD44780 posiada dwa rodzaje pamięci : pamięć generatora znaków (CGROM) oraz pamięć danych (DD RAM). Pamięć generatora znaków zawiera graficzną postać znaków wyświetlanych na wyświetlaczu (można porównać do czcionki). Oprócz znaków zdefiniowanych na stałe przez producenta sterownika do dyspozycji użytkownika pozostaje 8-znakowa pamięć RAM, w której można zdefiniować własne znaki (np. polskie znaki diakrytyczne). Pamięć danych DD RAM ma pojemność 80 bajtów (jeden sterownik HD4478 może obsłużyć maksymalnie 80 znaków, czyli np. 2 linie po 40 znaków, lub 4 linie po 20 znaków).

 

Zestawienie rozkazów kontrolera HD44780 przedstawia tabela 3.

Tab. 3. Rozkazy kontrolera HD44780.

Display clear - (RS = 0, R/W = 0, dane = 00000001) -instrukcja ta powoduje wyczyszczenie wyświetlacza poprzez wypełnienie go spacjami, ustawienie trybu zapisu danych od pozycji w lewym górnym rogu wyświetlacza oraz wyłączenie trybu przesuwania okna; maksymalny czas trwania instrukcji - 1,64ms

Display/cursor home - (RS - 0, R/W = 0, dane = 0000001x) - instrukcja powoduje ustawienie kursora na pozycji pierwszego znaku w pierwszej linii; maksymalny czas trwania instrukcji 1,64ms

 

 

 

Entry mode set - (RS = 0; R/W = 0, dane = 000001IS) - określenie trybu pracy kursora/okna wyświetlacza :
- dla S = 1 po zapisaniu znaku do wyświetlacza kursor nie zmienia położenia, natomiast przesuwa się cała zawartość wyświetlacza
- dla S = 0 po zapisaniu znaku do wyświetlacza kursor zmienia położenie, a przesuwanie okna jest wyłączone
- dla I = 1 kursor lub okno wyświetlacza przesuwa się w prawo (inkrementacja adresu znaku)
- dla I = 0 kursor lub okno wyświetlacza przesuwa się w lewo (dekrementacja adresu znaku)
Maksymalny czas trwania instrukcji - 40us

Display ON/OFF - (RS = 0, R/W = 0, dane = 00001DCB)
- dla D = 1 - włączenie wyświetlacza
- dla D = 0 - wyłączenie wyświetlacza
- dla C = 1 - włączenie kursora
- dla C = 0 - wyłączenie kursora
- dla B = 1 - włączenie migania kursora
- dla B = 0 - wyłączenie migania kursora

Display cursor shift - (RS = 0, R/W = 0, dane = 0001SRxx)
- dla S = 1 - przesuwana jest zawartość okna
- dla S = 0 - przesuwany jest kursor
- dla R = 1 - kierunek przesuwu w prawo
- dla R = 0 - kierunek przesuwu w lewo

Function set (RS= 0,  R/W = 0, dane = 001DNFxx)
- dla D = 1 - interfejs 8-bitowy
- dla D = 0 - interfejs 4-bitowy
- dla N = 1 - wyświetlacz dwuwierszowy
- dla N = 0 - wyświetlacz jednowierszowy
- dla F = 1 - matryca znaków 5*10 punktów
- dla F = 0 - matryca znaków 5*7punktów

CG RAM set - (RS= 0, RW = 0, dane = 01AAALLL) - ustawia adres pamięci generatora znaków. AAA - 3-bitowy adres znaku, LLL - 3-bitowy numer linii składającej się na graficzne odwzorowanie znaku.

DD RAM set - (RS = 0, R/W = 0, dane = 1AAAAAAA) - ustawia adres pamięci wyświetlacza, pod który nastąpi zapis (bądź odczyt) danych operacją Data write lub Data read.

Busy flag read - (RS = 0, R/W = 1, dane = BAAAAAAA) - odczyt flagi zajętości i adresu pamięci wyświetlacza. B - flaga zajętości wyświetlacza, AAAAAAA - 7-bitowy adres pamięci.

Data read - (RS = 1, R/W= 1, dane = odczytywany bajt danych) - odczyt danych z pamięci wyświetlacza, bądź pamięci CG RAM (jeśli poprzednio wydano komendę CG RAM set)

Data write - (RS = 1, R/W = 0, dane = zapisywany bajt danych) - zapis danych do pamięci wyświetlacza, bądź pamięci CG RAM (jeśli poprzednio wydano komendę CG RAM set)

 

3. Mikrokontroler Atmega16

Schemat połączenia mikrokontrolera z wyświetlaczem LCD przedstawia - poniżej zamieszczony - uproszczony schemat:

 

III Zaprojektowane układy:

Rys. Schemat zaprojektowanego układu przy pomocy oprogramowania EAGLE

 

Rys. Schemat zaprojektowanego przetwornika analogowego

 

Zaprojektowany przetwornik analogowy przetwarza zmiany rezystancji platynowego czujnika pt100 z założonego zakresu pomiarowego tj. od -100 ˚C do 300 ˚C (odpowiednio od 60,28 Ω do 212,00 Ω) na napięcie w zakresie od 0V do 5V. Układ pierwszego wzmacniacza jest typowym układem stosowanym w tego typu zastosowaniach, dobrany kondensator w torze sprzężenia zwrotnego pełni rolę filtru dolnoprzepustowego. Napięcie wyjściowe z układu pierwszego wzmacniacza zmienia się w granicach od 6V do 8,5V. Układ drugiego wzmacniacza obniża wartość napięcia podanego na wyjście nieodwracające o wartość zastosowanego źródła napięcia w tym układzie (czyli o 6V). Wartości rezystorów w układzie drugiego wzmacniacza dobrano tak, aby układ miał wzmocnienie wne 2, co w efekcie umożliwia uzyskanie na wyjściu z przetwornika żądanych zmian napięcia, czyli od 0V do 5V. Wzmacniacze operacyjne są zasilane zasilaczem 12V 100 mA. Aby możliwa była poprawna praca układu w okolicach dolnej granicy zakresu pomiarowego zastosowano podwójny wzmacniacz operacyjny typu Rail-to-Rail (MC33202P). Napięcie z przetwornika jest zamieniane na postać cyfrową przez znajdujący się w mikrokontrolerze 10-bitowy przetwornik analogowo/cyfrowy z sukcesywną aproksymacją. Wykorzystanie w projekcie takiego przetwornika a/c pozwala na osiągnięcie dokładności rzędu 0,5 ˚C w zakresie 400˚C. Schemat połączeń wraz z częścią cyfrową termometru wygenerowano przy pomocy oprogramowania EAGLE, naniesiono na pokryty miedzią jednostronny laminat epoksydowy (LAM100X160E1.5) oraz wytrawiono. Kolejnym etapem było odpowiednie umieszczenie elementów elektronicznych na przygotowanej płytce oraz przylutowanie ich do niej. Następnie należało zaprogramować mikrokontroler tak, aby cały układ pracował poprawnie.

 

W pamięci flash mikrokontrolera został zapisany program realizowany przez mikroprocesor. W programie zadeklarowano tablicę struktur zawierającą punkty kalibracji (co 10 ˚C) w oparciu o którą urządzenie pomiarowe zostało zlinearyzowane.

 

 

 

 

 

Listing programu:

 

// Definicja oscylatora

#define F_OSC 1000000

#include <avr/io.h>

#include <avr/pgmspace.h>

#include <stdio.h>

#include <stdlib.h>

#include "hd44780.h"

 

 

 

 

// Petla opozniajaca

static inline void delayloop16(uint16_t count)

{

              asm volatile (  "cp  %A0,__zero_reg__ \n\t"  \

                     "cpc %B0,__zero_reg__ \n\t"  \

                     "breq L_Exit_%=       \n\t"  \

                     "L_LOOP_%=:           \n\t"  \

                     "sbiw %0,1            \n\t"  \

                     "brne L_LOOP_%=       \n\t"  \

                     "L_Exit_%=:           \n\t"  \

                     : "=w" (count)

                                                                      : "0"  (count)

                   );                           

}

 

void delayloop32(uint32_t loops)

{

  __asm__ volatile ( "cp  %A0,__zero_reg__ \n\t"  \

                     "cpc %B0,__zero_reg__ \n\t"  \

                     "cpc %C0,__zero_reg__ \n\t"  \

                     "cpc %D0,__zero_reg__ \n\t"  \

                     "breq L_Exit_%=       \n\t"  \

                     "L_LOOP_%=:           \n\t"  \

                     "subi %A0,1           \n\t"  \

                     "sbci %B0,0           \n\t"  \

                     "sbci %C0,0           \n\t"  \

                     "sbci %D0,0           \n\t"  \

                     "brne L_LOOP_%=            \n\t"  \

                     "L_Exit_%=:           \n\t"  \

                     : "=w" (loops)              \

                                                                      : "0"  (loops)              \

                   );                             \

   

              return;

}

 

//  Deklaracje podstawowe

#define cbi(PORT, BIT) (_SFR_BYTE(PORT) &= ~_BV(BIT))

#define sbi(PORT, BIT) (_SFR_BYTE(PORT) |= _BV(BIT))

#define tbi(PORT, BIT)              (_SFR_BYTE(PORT) ^= _BV(BIT))

 

// Definicje opoznien

 

#define DELAY_MS_CONV(ms) ( (uint32_t) (ms*( (F_OSC)/6000L)) )

#define delay_ms(ms)  delayloop32(DELAY_MS_CONV(ms))

#define DELAY_US_CONV(us) ((uint16_t)(((((us)*1000L)/(1000000000/(F_OSC)))-1)/4))

#define delay_us(us)                delayloop16(DELAY_US_CONV(us))

#define delayms delay_ms

#define false              0x00

#define true              0x01

 

typedef struct {

  float rezys;

  int temper;

} CHARAKTERYSTYKA;

 

int main(void)

{

...

Zgłoś jeśli naruszono regulamin