22
ELEKTRONIKA PRAKTYCZNA 12/2014
PROJEKTY
Data Logger jest uniwersalnym
bankiem danych zasilanym
z baterii. Pozwala
na zapisywanie na karcie
SD informacji z czujnika
temperatury oraz z dwóch
napięciowych wejść analogowych.
Ma wbudowany układ ładowania
baterii za pomocą USB.
Dodatkowo, wyposażono go
w zegar czasu rzeczywistego.
Pełna konfiguracja urządzenia
odbywa się za pomocą zmian
w pliku konfiguracyjnym
zapisanym na karcie SD.
Rekomendacje: urządzenie
przyda się do monitorowania
temperatury lub innych
parametrów środowiskowych
zamienionych na napięcie (albo
samego napięcia w zakresie
0…15 V lub 0…40 V).
Data Logger – rejestrator
temperatury lub napięcia
peratury pełni DS18B20 firmy Maxim-Dallas
dołączany do mikrokontrolera poprzez inter-
fejs 1-Wire.
Algorytm działania programu pokazano
na
rysunku 2.
Do wejścia przetwornika A/C doprowadzo-
no napięcie zasilające. Gdy jego wartość osiąg-
nie wartość 3,1 V, rejestrator wyłącza się (mi-
krokontroler jest wprowadzany w tryb Power
Down
). Ten mechanizm ma na celu ochronę
akumulatora zasilającego przed zbyt głębokim
rozładowaniem. Jeśli dojdzie do wyłączenia
zasilania, to należy po prostu naładować aku-
mulator oraz wyłączyć i włączyć zasilanie za
pomocą wyłącznika, co spowoduje restart mi-
krokontrolera.
Na pinie zasilającym część analogową mi-
krokontrolera (AVCC) zastosowano filtr LC. Dla
poprawienia dokładności pomiarów zastosowa-
no zewnętrze źródło napięcia odniesienia – jego
rolę pełni układ U5. Jego napięcie wyjściowe
wynosi 2,5 V z dokładnością 1%. Pomiar napię-
cia baterii zasilającej odbywa się poprzez dziel-
nik napięcia z dwóch rezystorów 10 kV/1%,
dzięki czemu w skrajnym wypadku (4,2 V) na-
pięcie na wejściu przetwornika nie przekracza
2,5 V, tj. napięcia maksymalnego. Pozostałe dwa
kanały, do których można dołączyć napięcia
Schemat ideowy rejestratora pokazano na
ry-
sunku 1. Urządzenie jest zasilane za pomocą
baterii litowo-jonowej o pojemności 1800 mAh
z telefonu komórkowego. Napięcie zasila-
nia płytki rejestratora mieści się w zakresie
3,1…4,2 V. Dla uproszczenia budowy rejestra-
tora i ze względu na charakter zasilania dostar-
czanego przez akumulator, nie zastosowano
stabilizatora scalonego. Po dołączeniu baterii
na stałe jest zasilany tylko układ zegara RTC
– U6 (PCF8583T), dzięki czemu nie trzeba
po każdym włączeniu urządzenia ustawiać
daty i godziny. Pobór prądu przez ten układ
jest znikomy i wynosi jedynie 50 mA. Reszta
urządzenia jest zasilana za pośrednictwem wy-
łącznika.
Sercem rejestratora jest mikrokontroler
ATmega32A taktowany za pomocą wewnętrz-
nego oscylatora RC o częstotliwości 1 MHz.
Do sygnalizowania jego statusu służą dwie
diody LED przyłączone do mikrokontrolera.
Trzecią diodę dołączono do wyjścia PROG
układu scalonej ładowarki akumulatorów Li-
Ion – MCP73831. Służy ona do sygnalizowania
stanu ładowania baterii (dioda świeci się pod-
czas ładowania baterii, a po jej naładowaniu
gaśnie). Ładowarka jest zasilana za pośredni-
ctwem gniazda mini USB. Rolę czujnika tem-
AVT
5479
W ofercie AVT*
AVT-5479 A
AVT-5479 B
AVT-5479 UK
Podstawowe informacje:
•Rejestrowanie temperatury, napięcia zasilają-
cego i dwóch napięć wejściowych w pliku
CSV na karcie SD.
•Napięcie wejściowe z zakresu 0…15 V lub
0…40 V.
•Napięcie zasilające 3,1…4,2 V (akumulator
Li-Ion), maksymalny pobór prądu ok.
20 mA.
•Nieprzerwana praca przez ok. 3 doby
przy zasilaniu z akumulatora o pojemności
1200 mAh.
•Mikrokontroler ATmega32, oprogramowanie
w języku C.
Dodatkowe materiały na FTP:
ftp://ep.com.pl
, user:
63172
, pass:
428ofq53
•wzory płytek PCB
Projekty pokrewne na FTP:
(wymienione artykuły są w całości dostępne na FTP)
AVT-5458 Wielokanałowy woltomierz-
-rejestrator (EP 9/2014)
AVT-5420 Wielopunktowy termometr
z rejestracją (EP 10/2013)
AVT-5373 Tlogger – rejestrator temperatury
(EP 12/2012)
* Uwaga:
Zestawy AVT mogą występować w następujących wersjach:
AVT xxxx UK to zaprogramowany układ. Tylko i wyłącznie. Bez elementów
dodatkowych.
AVT xxxx A
płytka drukowana PCB (lub płytki drukowane, jeśli w opisie
wyraźnie zaznaczono), bez elementów dodatkowych.
AVT xxxx A+ płytka drukowana i zaprogramowany układ (czyli połączenie
wersji A i wersji UK) bez elementów dodatkowych.
AVT xxxx B
płytka drukowana (lub płytki) oraz komplet elementów wymienio-
ny w załączniku pdf
AVT xxxx C
to nic innego jak zmontowany zestaw B, czyli elementy wluto-
wane w PCB. Należy mieć na uwadze, że o ile nie zaznaczono
wyraźnie w opisie, zestaw ten nie ma obudowy ani elementów
dodatkowych, które nie zostały wymienione w załączniku pdf
AVT xxxx CD oprogramowanie (nieczęsto spotykana wersja, lecz jeśli występuje,
to niezbędne oprogramowanie można ściągnąć, klikając w link
umieszczony w opisie kitu)
Nie każdy zestaw AVT występuje we wszystkich wersjach! Każda wersja ma
załączony ten sam plik pdf! Podczas składania zamówienia upewnij się, którą
wersję zamawiasz! (UK, A, A+, B lub C).
http://sklep.avt.pl
23
ELEKTRONIKA PRAKTYCZNA 12/2014
DataLogger– rejestratortemperaturylubnapięcia
IC1
4
7
8
29 27 28
17 5 38
18 6 39
30 31 32 33 34 35 36 37
3 2 1 44 43 42 41 40
26 25 24 23 22 21 20 19
16 15 14 13 12 11 10 9
AT
mega32
RESE
T
XT
AL2
XT
AL1
AREF AV
CC
AGND
VCC
GND
(ADC7)P
A7
(ADC6)P
A6
(ADC5)P
A5
(ADC4)P
A4
(ADC3)P
A3
(ADC2)P
A2
(ADC1)P
A1
(ADC0)P
A0
(SCK
)PB7
(MISO
)PB6
(MOSI)PB5
(SS)PB4
(AIN1/OC0)PB3 (AIN0/INT2)PB2
(T1)PB1
(T0/X
CK
)PB0
(T
OSC2)PC7
(T
OSC1)PC6 (
TDI)PC5
(TDO
)PC4
(TMS)PC3 (T
CK
)PC2
PC1(SD
A
)
PC0(SCL)
(OC2)PD7 (ICP)PD6
(OC1A
)PD5
(OC1B)PD4 (INT1)PD3 (INT0)PD2 (
TXD
)PD1
(R
XD
)PD0
SD_ON
R16 100
R9 10k
+3V3
T1 BSS84
C4 100n
10
11
4
3
6
7 8 9 1 2
5
12 13 14 15
D
AT
0
D
AT
1
D
AT
2
CD/D
AT3
CMD/DI
CLK/SCLK
GND1 GND2 GND3 GND4
WP
CDI#
VDD
VSS1
VSS2
+3V3
1W U
CC
CH2 CH1
+3V3
R1 100k
RST
L1 10uH
AREF
C3
100n
C7
100n
C1 100n
C2 100n
SDA SCL
R11 820
R4 130
D2
D3
INT SD_ON
1
2
8
U4
4
PCF8583T
C10 22p
Y1
32,768kH
z
+
C9 10u
C8 22p
6
5
7
3
VDD
OSCI
OSC
O
VSS
SCL
SDA
INT
A0
VCC
+3V3
R14 100k
R15 100k
SCL
SDA
INT
+3V3
+
AREF
C11 10u
MCP1525
U3
1
3
2
IN
GND
OUT
+3V3
VCC
ON/OFF
3
2
1
VCC
VCC
GND
GND
Zasilanie
èrÛd≥o napiÍcia odniesienia
+3V3
1W
1W
2
3
1
GND
VDD
R10 100k
IC
U5A DS18B20
Czujnik t
emper
atur
y
+3V3
CH1
CH2
UCC
J2-1
J2-2
J2-3
R12 10k
R8 10k
R6 150k
R5 10k
R7 2k
R13 10k
Pomiar
y analogo
w
e
M
ik
rokon
tr
oler i k
ar
ta SD
1 2 3 4 5
+
+
D1
R2 820
1
4
J1
C5 4u7
MINI USB
MCP73831
U2
VCC
3 5 2
C6 4u7
R3 2k
VBA
T
PR
OG VSS
VIN
ST
AT
Łado
w
anie ba
ter
ii
Rysunek 1. Schemat ideowy Data Loggera
z zakresu 0…40 V i 0…15 V również dołączone
są przez dzielniki, ale o innym stopniu podzia-
łu (150 kV/10 kV oraz 10 kV/2 kV). Dla kanału
pierwszego współczynnik podziału wynosi 15,
natomiast dla drugiego 5. Są to liczby całkowite,
dzięki czemu łatwo je zaimplementować przy
przeliczaniu wartości z przetwornika na rzeczy-
wiste napięcie (
listing 1).
W pętli głównej mikrokontroler odczytuje
reprezentację napięcia z przetwornika, nato-
miast jej zamiana na napięcie odbywa się przed
zapisem na karcie SD.
Do rejestrowania danych zastosowano kartę
SD. Do obsługi programowej wykorzystano bi-
bliotekę FATFs dostępną na stronie internetowej
http://elm-chan.org/
. Wszystkie informacje są za-
pisywane w pliku DATA.CSV. Dzięki zachowa-
niu formatu CSV plik można otworzyć np. za
Listing 1. Konwersja wartości
odczytanej z przetwornika
na napięcie
while(1)
{
.
.
.
//pomiar napięcia CH1
u1_adc = pomiar(2);
//pomiar napięcia CH2
u2_adc = pomiar(3);
.
.
.
}
//obliczenie napięcia zasilania
u = u_adc * 244 * 2;
cz_d_u = u / 100000;
cz_u_u = (u/1000) % 100;
//obliczenie napięcia CH1
u1 = u1_adc * 244 * 15;
cz_d_u1 = u1 / 100000;
cz_u_u1 = (u1/1000) % 100;
//obliczenie napięcia CH2
u2 = u2_adc * 244 * 6;
cz_d_u2 = u2 / 100000;
cz_u_u2 = (u2/1000) % 100;
Listing 2. Procedura odczytu pliku konfiguracyjnego
if (CD_ON) // sprawdzenie czy włożono kartę
{
disk_initialize(0);
_delay_ms(10);
f_mount(0, &FATFS_Obj);
//inicjalizacja karty oraz otwarcie pliku w katalogu głównym
//o nazwie config.txt
f_err_code = f_open(&fil_obj, „config.txt”, FA_READ);
_delay_ms(10);
//sprawdzanie czy plik istnieje
if(f_err_code == FR_OK)
{
//ustawienie kursora na początku pliku
f_lseek(&fil_obj, 0);
//odczyt do zmiennej znakowej całej lini pilku (aż do znaku CR LF)
f_gets(rok, sizeof rok, &fil_obj);
//przesunięcie kursora o dwa bajty
f_lseek(&fil_obj, f_tell(&fil_obj) + 2);
f_gets(miesiac, sizeof miesiac, &fil_obj);
f_lseek(&fil_obj, f_tell(&fil_obj) + 2);
f_gets(dzien, sizeof dzien, &fil_obj);
f_lseek(&fil_obj, f_tell(&fil_obj) + 2);
f_gets(godzina, sizeof godzina, &fil_obj);
f_lseek(&fil_obj, f_tell(&fil_obj) + 2);
f_gets(minuta, sizeof minuta, &fil_obj);
f_lseek(&fil_obj, f_tell(&fil_obj) + 2);
f_gets(s1, sizeof s1, &fil_obj);
f_lseek(&fil_obj, f_tell(&fil_obj) + 2);
f_gets(s2, sizeof s2, &fil_obj);
_delay_ms(10);
f_close(&fil_obj); //zamknięcie pliku
set_godziny = atoi(godzina); //konwersja zmiennych z string na int
set_minuty = atoi(minuta);
ram_dane.set_rok = atoi(rok);
set_miesiac = atoi(miesiac);
set_dzien = atoi(dzien);
ram_dane.s1_d = atoi(s1);
ram_dane.s2_d = atoi(s2);
//warunki zabezpieczające przed sczytaniem błędnych
//danych wprowadzonych przez użytkownika
if(ram_dane.s1_d >= 10) ram_dane.s1_d = 9;
if(ram_dane.s2_d >= 7) ram_dane.s2_d = 6;
if (set_godziny >= 24) set_godziny = 0;
if (set_minuty >= 60) set_minuty = 0;
if (ram_dane.set_rok >=100) ram_dane.set_rok = 0;
if (set_miesiac >= 13) set_miesiac = 1;
if (set_dzien >=32) set_dzien = 1;
//po ustawieniu danych skopiowanie ich do eepromu
copy_ram_to_eem();
//ustawienie czasu
set_time(set_godziny, set_minuty, 0);
//ustawienie daty (rok liczony przez program a nie przez pcf8583)
set_date(set_dzien, set_miesiac);
}
//jeśli wykryto brak pliku, program sczytuje dane z eeprom
//(rok, częstotliwość zapisu, typ danych do zapisu)
else copy_eem_to_ram();
flaga_start = 1;
}
//jeśli wykryto brak karty SD, program sczytuje dane z eeprom
//(rok, częstotliwość zapisu, typ danych do zapisu)
else
{
copy_eem_to_ram();
flaga_start = 1;
}
//instrukcja ustawia wartość częstotliwości zapisu danych na SD
//w zależności od wprowadzonej liczby
switch(ram_dane.s1_d)
{
case 0:
{
f_zapisu = 1; //dla 0 zapis co 1 sekundę
break;
}
.
.
.
case 9:
{
f_zapisu = 7200; //dla 9 zapis co 2 godziny
break;
}
}
Listing 3. Struktura zmiennej z konfiguracją
typedef struct { //deklaracja struktury zapisywanej w eepromie oraz w pamieci
ram
uint8_t set_rok;
uint8_t s1_d;
uint8_t s2_d;
} LDATA;
LDATA ram_dane;
LDATA eem_dane __attribute__((section(„.eeprom”))); // dane w pamięci EEPROM
PROJEKTY
Rysunek 2. Nagłówki dodawane w pliku
CSV
pomocą arkusza kalkulacyjnego i w prosty spo-
sób dokonać ich interpretacji.
W związku z tym, że w urządzeniu nie zo-
stały zastosowane żadne elementy interfejsu
użytkownika umożliwiające jego skonfigurowa-
nie, odbywa się ono za pomocą pliku zapisywa-
nego na karcie SD. W ten sposób można usta-
wić: datę, godzinę, częstotliwość wykonywania
pomiarów, wykorzystywane kanały pomiarowe.
Aby dokonać konfiguracji, należy na karcie SD
utworzyć plik config.txt. Jego odczyt jest wy-
konywany tylko raz, przy włączeniu urządze-
nia. Na
listingu 2 przedstawiono procedurę
odczytu pliku konfiguracyjnego. Rozpoczyna
się ona od sprawdzenia, czy włożono kartę
SD do gniazda. Jeśli tak (warunek CD_ON jest
spełniony), to rozpoczyna się inicjalizacja karty.
Następnie polecenie f_open otwiera plik config.
txt
, jeśli ten istnieje. Gdy wszystkie warunki
zostaną spełnione, parametr f_err_code zwraca
wartość FR_OK. Jeżeli ten warunek nie zostanie
spełniony, czyli użytkownik nie wgra pliku kon-
figuracyjnego na kartę, program pobierze dane
konfiguracyjne z pamięci EEPROM. Jeśli jednak
taki plik istnieje, zaczyna się odczyt danych.
Polecenie f_lseek ustawia kursor odczytu na sa-
mym początku pliku. Polecenie f_gets do zmien-
nej znakowej rok odczytuje całą linię, aż do zna-
ków CR+LF, czyli dwa bajty danych (np: 14
oznaczający rok 2014) oraz bajt końca linii.
Następnie polecenie f_lseek przesuwa kursor
o dwa bajty, na kolejną linię, w której podano
miesiąc. W ten sam sposób odczytywane są pa-
rametry: dzień, godzina, minuta, częstotliwość
zapisu (s1) oraz wybrane kanały (s2). Następnie
plik jest zamykany.
W związku z faktem, że wykorzystane dane
mają być m.in. przesłane do układu RTC, mu-
szą zostać przekonwertowane na liczbę. Do tego
celu wykorzystano funkcję atoi() zawartą w bi-
bliotece stdlib.h. Wszystkie dane są konwerto-
25
ELEKTRONIKA PRAKTYCZNA 12/2014
wane na typ uint8_t. Informacje, takie jak: rok,
częstotliwość zapisu, wybrane kanały są zapisy-
wane w pamięci EEPROM. Aby łatwo zapamię-
tać te dane w pamięci EEPROM, zdefiniowano
strukturę pokazaną na
listingu 3. Ta sama struk-
tura służy do utworzenia zmiennej w pamięci
RAM, dzięki czemu można po prostu skopio-
wać konfigurację z EEPROM do RAM.
Po konwersji zmiennych odbywa się spraw-
dzenie, czy użytkownik wprowadził poprawne
dane. Jeśli nie, program samodzielnie ustawia
wartości domyślne. Kolejnym krokiem jest za-
pisanie danych w pamięci EEPROM oraz prze-
słanie nastaw do zegara RTC. Następnie w in-
strukcji switch odbywa się ustawienie częstotli-
Listing 4. Procedura wprowadzania mikrokontrolera w stan głębokiego uśpienia
Power Down
void uspienie_low_bat(void)
{
sd_pwr(0); //wyłączenie zasilania karty SD
//wprowadź mikrokontroler w tryb Power Down
flaga = 1;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //tryb Power Down Mode
sleep_enable();
sleep_cpu();
}
void sd_pwr( uint8_t OnOff ) { //wyłączenie karty SD
if(OnOff) {
SPCR |= (1<<SPE);
SD_ON;
_delay_ms(50);
} else {
SPCR &= ~ (1<<SPE);
DDRB &= ~ (1<<PB4);
DDRB |= (1<<PB5);
DDRB |= (1<<PB7);
PORTB &= ~ (1<<PB4);
PORTB &= ~ (1<<PB5);
PORTB &= ~ (1<<PB7);
SD_OFF;
_delay_ms(50);
}
}
Wykaz elementów
Rezystory: (SMD 0805)
R1: 10 kV
R2: 820 V
R3: 2 kV
R7: 2 kV/1%
R4: 470 V
R6: 150 kV/1%
R5, R8, R12, R13: 10 kV/1%
R11: 820 V
R10, R14, R15: 100 kV
Kondensatory:
C1, C2: 33 mF/16 V (SMD)
C3…C5: 100 nF (SMD 0805)
C6: 10 mF/16 V
C7, C9: 22 pF (SMD 0805)
C8: 10 m/16V (SMD)
Półprzewodniki:
U1: ATmega32A (SMD)
U2: MCP73831
U4: DS18B20
U5: MCP1525
U6: PCF8583T
LED1: dioda LED SMD, czerwona
LED2: dioda LED SMD, zielona
LED3: dioda LED SMD, niebieska
Inne:
L1: dławik 10 mH
Y1: kwarc 32,768 kHz
X1: gniazdo MINI-USB, SMD
X2: złącze ARK3
U3: złącze karty SD
Przełącznik HSS1260R
DataLogger– rejestratortemperaturylubnapięcia
wości zapisu danych na kartę SD. W zależności
od wprowadzonej wartości zmiennej ram_
dane.s1_d
jest ustawiana wartość zmiennej f_
zapisu
, która to jest porównywana ze zmienną
flaga_licznik
. Ta zmienna jest zwiększana co 1
sekundę przez procedurę obsługi przerwania
zewnętrznego INT1. Źródłem przerwania jest
wyjście INT układu zegara RTC.
Jak wspomniano, na początku pętli głów-
nej programu jest mierzone napięcie zasilania
i jest podejmowana decyzja o wyłączeniu urzą-
dzenia lub dalszej pracy. Na
listingu 4 poka-
zano procedurę wprowadzania mikrokontro-
lera w stan głębokiego uśpienia Power Down.
Funkcja sd_pwr() wyłącza zasilanie karty SD.
Najpierw linie SPI są ustawiane, a następnie
jest wyłączane zasilanie poprzez wyzerowanie
pinu PD2 sterującego tranzystorem T1 pełnią-
cego rolę włącznika zasilania karty (zależnie
od argumentu funkcji można kartę włączyć
– argument 1, lub wyłączyć – argument 0).
Następnie funkcja uspienie_low_bat wprowa-
dza procesor w stan uśpienia.
Kolejnym krokiem w pętli głównej jest po-
równywanie wartości zmiennych flaga_licznik
i f_zapisu. Jeśli te zmienne są równe, to rozpo-
czyna się procedura zapisu danych na karcie
SD. Po pierwszym uruchomieniu program two-
rzy lub otwiera plik DATA.csv, a następnie doda-
je w nim nagłówki, co pokazano na
rysunku 2.
W kolejnych liniach pliku program zapisuje
rekordy. To, jakie dane zostaną zapamiętane za-
leży od wybranego trybu pracy. Użytkownik ma
SD
C
ard
C
4
R
16
C
1
T1
R
9
PC
B:
V3
PROS
D
ata
L
og
ge
r v
1.0
1
1
2
3
U
1
R
1
U
2
R
2
D
1
J1
R
3
VC
C
G
N
D
D
2
R
4
C
5
C
6
R
5
R
6
R
7
R
8
C
3
L1
U
5
R
10
D
3
R
11
R
12
R
13
U
3
C
11
R
14
R
15
Y1
U
4
C
8
C
9
C
10
C
2
R
ST
ON/OF F
J2
C
7
Rysunek 3. Schemat montażowy Data
Loggera
do wyboru 7 trybów zapisu danych. Na
listin-
gu 5 pokazano jeden z nich. Na początku wywo-
łana jest funkcja card_init(), która zapisuje aktu-
alną godzinę oraz inicjalizuję kartę. Tu również
zostaje włączona na czas zapisu dioda LED2.
Następnie, kolejną zapisywane są:
• wartość napięcia zasilającego,
• wartość napięcia na wejściu kanału pierw-
szego,
Konfiguracja urządzenia
Na karcieSDnależyutworzyćpliktekstowyo nazwie
config.txti wprowadzićnastępującedane:
Linie1…3zawierajądatęw kolejności:rok,miesiąc,
dzień.
Linie4…5zawierajągodzinęw kolejności:godzina,
minuty.
Linia6zawieraczęstotliwośćzapisu.
1 s
5 s
10 s
30 s
1 min
5 min
10min
30 min
1 h
2h
0
1
2
3
4
5
6
7
8
9
Np.dlaokresuzapisurównego10minut,w szóstejliniiplikuwpisujemyliczbę„6”.
Linia7zawierawybranekanałypomiarowe.
0
1
2
3
4
5
6
Wszyst-
kie dane:
temperatura,
napięcia
na CH1
i CH2,
napięcie
zasilające
Napięcia
na CH1
i CH2, tem-
peratura
Napięcie
na CH1,
temperatura
Napięcie
na CH2,
temperatura
Napięcia
na CH1
i CH2
Temperatura Temperatura
i napięcie
zasilające
26
ELEKTRONIKA PRAKTYCZNA 12/2014
Rysunek 5. Wyprowadzenia interfejsu
karty SD
Listing 5. Zapis danych na karcie SD w jednym z trybów pracy
LEDW_ON; //zaświecenie zielonej diody LED
card_init();
.
.
f_printf(&fil_obj, „%d”, cz_d_u);
f_printf(&fil_obj, „%s”, „,”);
if (cz_u_u < 10) f_printf(&fil_obj, „%s”, „0”);
if (cz_u_u == 0) f_printf(&fil_obj, „%s”, „00”);
f_printf(&fil_obj, „%d”, cz_u_u);
f_printf(&fil_obj, „%s”, „;”);
f_printf(&fil_obj, „%d”, cz_d_u1);
f_printf(&fil_obj, „%s”, „,”);
if (cz_u_u1 < 10) f_printf(&fil_obj, „%s”, „0”);
if (cz_u_u1 == 0) f_printf(&fil_obj, „%s”, „00”);
f_printf(&fil_obj, „%d”, cz_u_u1);
f_printf(&fil_obj, „%s”, „;”);
f_printf(&fil_obj, „%d”, cz_d_u2);
f_printf(&fil_obj, „%s”, „,”);
if (cz_u_u2 < 10) f_printf(&fil_obj, „%s”, „0”);
if (cz_u_u2 == 0) f_printf(&fil_obj, „%s”, „00”);
f_printf(&fil_obj, „%d”, cz_u_u2);
f_printf(&fil_obj, „%s”, „;”);
if(subzero) f_printf(&fil_obj, „%s”, „-”);
else f_printf(&fil_obj, „%s”, „ „);
f_printf(&fil_obj, „%d”, cel);
f_printf(&fil_obj, „%s”, „,”);
if (cel_fract_bits == 0) f_printf(&fil_obj, „%s”, „0”);
f_printf(&fil_obj, „%d”, cel_fract_bits);
f_printf(&fil_obj, „%s”, „\r\n”);
.
.
f_close(&fil_obj); //zamknięcie pliku
LEDW_OFF; //zgaszenie zielonej diody LED (świeci w trakcie zapisu)
Fotografia 4. Kabel używany do programowania
waż EEPROM jest czysty. Bez tych ustawień
układ nie zadziała. Aby dokładnie ustawić
czas układu PCF8583, należy po zapisaniu
pliku na karcie włączyć zasilanie 1 sekundę
przed ustawioną godziną i minutą. Ta proce-
dura jest konsekwencją początkowego opóź-
nienia przy starcie programu. Dla przykła-
du, gdy ustawimy godzinę 18:34, włączamy
układ o godzinie 18:33:59. Program zaczyna
pracę po ok. 4 sekundach od uruchomienia.
Sekwencja startowa wygląda następująco:
Po przełączeniu przełącznika ON/OFF na se-
kundę zapali się dioda LED2, następnie zapa-
li się na 3 sekundy dioda LED3. Gdy zgaśnie
układ zaczyna rejestrowanie.
Układ w trybie czuwania pobiera prąd
o natężeniu ok. 2,5 mA, natomiast w trakcie
zapisu ok. 20 mA. Zapis danych na karcie
trwa mniej niż 100 ms. Przy pojemności aku-
mulatora wynoszącej 1200 mAh układ pra-
cuje w sposób ciągły przez ok. 3 doby. Przy
włączniku ustawionym w pozycji OFF układ
pobiera prąd o natężeniu ok. 50 mA. Wtedy
działa tylko układ RTC PCF8583. Po wejściu
w tryb Power Down rejestrator pobiera ok 0,7
mA, ponieważ wszystkie rezystory podciąga-
jące są podłączone do baterii poprzez włącz-
nik. Na
rysunku 6 przedstawiono wykres
napięcia zasilania w funkcji czasu w przecią-
gu 12 godzin, przy włączonym trybie zapisu
wszystkich danych co 1 sekundę.
Piotr Rosenbaum
piotr.rosenbaum@gmail.com
SD
SPI
Pin
1
2
3
4
5
6
7
8
9
CD/DAT3
CMD
VSS1
VDD
CLK
VSS2
DAT0
DAT1
DAT2
X
MOSI
GND
VDD
SCK
GND
MISO
X
X
9
1 2 3 4 5 6
7 8
SD
4,05
4
3,95
3,9
3,85
3,8
Vcc [V]
23:32:00 23:42:15 23:52:31 00:02:47 00:13:03 00:23:19 00:33:35 00:43:51 00:54:07 01:04:23 01:14:39 01:24:55 01:35:11 01:45:27 01:55:43 02:05:59 02:16:15 02:26:31 02:36:47 02:47:03 02:57:19 03:07:35 03:17:51 03:28:07 03:38:23 03:48:39 03:58:55 04:09:11 04:19:27 04:29:43 04:39:59 04:50:15 05:00:31 05:10:47 05:21:03 05:31:19 05:41:35 05:51:51 06:02:07 06:12:23 06:22:39 06:32:55 06:43:11 06:53:27 07:03:43 07:13:59 07:24:15 07:34:31 07:44:47 07:55:03 08:05:19 08:15:35
Rysunek 6. Wykres napięcia zasilania w funkcji czasu
RESET
i dlatego na płytce drukowanej utwo-
rzono pole nazwie RST. Na
rysunku 6 pokaza-
no wyprowadzenia karty SD wykorzystywane
do programowania mikrokontrolera.
Po zaprogramowaniu mikrokontrolera,
po załączeniu zasilania powinna zaświecić
się dioda LED2. Jeśli tak się jest, to układ jest
gotowy do pracy. Przy pierwszym uruchomie-
niu należy wgrać na SD plik config.txt, ponie-
• wartość napięcia na wejściu kanału drugie-
go
• temperatura otoczenia.
Na końcu jest zapisywany znak nowej linii.
Krótkie, naprzemienne błyskanie diod
LED2 i LED3 oznacza brak możliwości zapisu
na karcie.
Montaż i uruchomienie
Schemat montażowy rejestratora pokazano
na
rysunku 3. Jego montaż jest typowy i nie wy-
maga szczegółowego omawiania.
Po zamontowaniu wszystkich komponen-
tów należy sprawdzić czy działa układ łado-
wania. W tym celu do gniazda USB należy do-
prowadzić napięcie z interfejsu USB kompu-
tera PC lub dołączyć do niego ładowarkę te-
lefonu komórkowego. Jeśli zaświeci się dioda
LED1, to bateria ładuje się i układ ładowania
działa poprawnie. Następnym krokiem jest
zaprogramowanie mikrokontrolera. Jeśli nie
dysponujemy podstawką do programowania
układów w obudowie TQFP44, należy wyko-
nać kabel do programowania. Jego przykłado-
wy wygląd pokazano na
fotografii 4.
Karta SD jest połączona z mikrokontro-
lerem za pomocą sprzętowego interfejsu SPI.
Dzięki temu na złączu karty są wyprowadzo-
ne linie do programowania. Jedyną linią nie-
wykorzystywaną w interfejsie karty SD jest
PROJEKTY