A DS3231 chip egy nagy pontosságú RTC valós idejű óra, amely beépített hőmérséklet-kompenzált kvarcoszcillátorral rendelkezik, ami évente mindössze ±2 perces időeltolódást eredményez. Ezen kívül egy riasztási funkciót is megvalósítottak, és van egy megszakítási kimenet is. Az óra kész Arduino modulként vásárolható meg hevederes elemekkel és elemtartóval.
Itt rendeltem meg a modult. A diagram az alábbi képen látható:
A mikroáramkör a széles körben használt . Támogatja a szabványos (100 kHz) és a magas (400 kHz) adatátviteli sebességet. A mikroáramkör címe (7 bit) az I2C buszon 1101000. Ezenkívül a modulnak van I2C memóriája (24C32), amely nem látható az ábrán.
A mikroáramkör tápfeszültsége 2,3...5,5V tartományban lehet, két tápvezeték van, külső forráshoz (Vcc vonal), valamint az akkumulátorhoz (Vbat). A külső forrás feszültségét folyamatosan figyelik, és amikor a Vpf=2,5V küszöb alá csökken, átkapcsol az akkumulátor vezetékére. Az alábbi táblázat az elektromos vezetékek közötti váltás feltételeit mutatja be:
Az óra pontosságát a környezeti hőmérséklet figyelésével tartják fenn. A mikroáramkör elindít egy belső eljárást az óragenerátor frekvenciájának beállítására; a beállítás mértékét a frekvencia-hőmérséklet speciális grafikonja határozza meg. Az eljárás a tápfeszültség bekapcsolása után kezdődik, majd 64 másodpercenként lefut.
A töltés megtakarítása érdekében az akkumulátor csatlakoztatásakor (feszültség van a Vbat vezetékre) az óragenerátor addig nem indul el, amíg a Vcc vezeték feszültsége nem haladja meg a Vpf küszöbértéket, vagy a mikroáramkör helyes címét nem továbbítják az I2C interfész. Az óragenerátor indítási ideje kevesebb, mint egy másodperc. Körülbelül 2 másodperccel a tápfeszültség (Vcc) bekapcsolása vagy a cím I2C interfészen keresztüli fogadása után megkezdődik a frekvenciakorrekciós eljárás. Miután az óragenerátor elindult, tovább működik, amíg a Vcc vagy a Vbat jelen van. Az első bekapcsoláskor a dátum- és időregiszterek alaphelyzetbe állnak, és a következő értékeket kapják: 01/01/00 – 01 – 00/00/00 (nap/hónap/év/ – a hét napja – óra/perc /másodperc).
Az áramfelvétel 3,63 V-os akkumulátorral 3 µA, az I2C interfészen keresztüli adatátvitel hiányában. A maximális áramfelvétel elérheti a 300 µA-t külső 5,5 V-os tápegység és nagy I2C adatátviteli sebesség esetén.
Az RST vonal külső resetre használható, és alacsony feszültségű riasztási funkcióval is rendelkezik. A vezetéket egy belső ellenálláson keresztül magasra húzzák; nincs szükség külső felhúzásra. A külső reset funkció használatához egy gomb csatlakoztatható az RST vonal és a közös vezeték közé, a mikroáramkör érintés-visszapattanás elleni védelemmel rendelkezik. A riasztási funkció akkor aktiválódik, ha a Vcc tápfeszültség a Vpf küszöbérték alá esik, miközben az RST vonal alacsony logikai szintre van állítva.
Az alábbi táblázat a valós idejű óraregiszterek listáját mutatja:
Cím | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Funkció | Korlátok |
0x00 | 0 | 10 másodperc | Másodpercek | Másodpercek | 00-59 | |||||
0x01 | 0 | 10 perc | percek | percek | 00-59 | |||||
0x02 | 0 | 12/24 | DÉLELŐTT DÉLUTÁN | 10 óra | Óra | Néz | 1-12 + AM/PM vagy 00-23 | |||
10 óra | ||||||||||
0x03 | 0 | 0 | 0 | 0 | 0 | Nap | A hét napja | 1-7 | ||
0x04 | 0 | 0 | 10 | Szám | dátum | 01-31 | ||||
0x05 | Század | 0 | 0 | 10 hónap | Hónap | Hónapok/évszázadok | 01-12 + Század | |||
0x06 | 10 év | Év | Évek | 00-99 | ||||||
0x07 | A1M1 | 10 másodperc | Másodpercek | Másodpercek, 1. riasztás | 00-59 | |||||
0x08 | A1M2 | 10 perc | percek | Percek, 1. riasztás | 00-59 | |||||
0x09 | A1M3 | 12/24 | DÉLELŐTT DÉLUTÁN | 10 óra | Óra | Óra, 1. ébresztő | 1-12 + AM/PM vagy 00-23 | |||
10 óra | ||||||||||
0x0A | A1M4 | DY/DT | 10 | Nap | A hét napja, 1. riasztás | 1-7 | ||||
Szám | Dátum, 1. riasztás | 01-31 | ||||||||
0x0B | A2M2 | 10 perc | percek | Percek, 2. riasztás | 00-59 | |||||
0x0C | A2M3 | 12/24 | DÉLELŐTT DÉLUTÁN | 10 óra | Óra | Óra, 2. ébresztő | 1-12 + AM/PM vagy 00-23 | |||
10 óra | ||||||||||
0x0D | A2M4 | DY/DT | 10 | Nap | A hét napja, 2. riasztás | 1-7 | ||||
Szám | Dátum, 2. riasztás | 01-31 | ||||||||
0x0E | EOSC | BBSQW | CONV | RS2 | RS1 | INTCN | A2IE | A1IE | Beállítások regiszter (vezérlés) | |
0x0F | O.S.F. | 0 | 0 | 0 | EN32kHz | BSY | A2F | A1F | Állapotnyilvántartás | |
0x10 | JEL | ADAT | ADAT | ADAT | ADAT | ADAT | ADAT | ADAT | Aging Offset Register | |
0x11 | JEL | ADAT | ADAT | ADAT | ADAT | ADAT | ADAT | ADAT | Hőmérsékletregiszter, magas bájt | |
0x12 | ADAT | ADAT | 0 | 0 | 0 | 0 | 0 | 0 | Hőmérsékletregiszter, alacsony bájt |
Az időinformáció bináris decimális formátumban kerül tárolásra, vagyis egy decimális szám minden egyes számjegye (0-tól 9-ig) 4 bites csoportként van ábrázolva. Egy bájt esetén az alacsony nibble egyeseket, a magas nibble tízeseket, stb. Az időt 0x00-0x06 című regiszterekben számolja, az órák számlálásához 12 vagy 24 órás módot választhat. Az óraregiszter 6. bitjének beállítása (0x02 cím) beállítja a 12 órás üzemmódot, melyben az 5. bit a napszakot jelöli, az 1. érték a délutánt (PM), a 0 a délutánt (AM). A 6. bit nulla értéke a 24 órás módnak felel meg, itt az 5. bit vesz részt az órák számlálásában (20-23 értékek).
A hét napjai regiszter éjfélkor növekszik, 1-től 7-ig számolva, a hónap regiszter (0x05 cím) tartalmazza a Century bitet (7. bit), amely akkor vált át, ha az évszámláló regiszter (0x06 cím) túlcsordul, 99-ről 00-ra. .
A DS3231 chip két ébresztőórát valósít meg, az 1. ébresztőóra 0x07-0x0A címmel, a 2. ébresztőóra 0x0B-0x0D regiszterekkel van konfigurálva. Az A1Mx és A2Mx bitek különféle riasztási módok konfigurálására használhatók, a bit beállítása kizárja a megfelelő regisztert az összehasonlítási műveletből. Az alábbi táblázatok a különböző riasztási módokhoz tartozó bitkombinációkat mutatják be:
A táblázatokban nem szereplő bitkombinációk a riasztások hibás működéséhez vezetnek. Ha a DY/DT bit törlődik, akkor a dátumegyezést (a hónap napját) figyeli az ébresztőóra, a DY/DT bit beállításakor pedig a hét napjának egyezését ellenőrzi.
A legtöbb funkció a Control regiszterben van konfigurálva. Az EOSC bit vezérli az órajelgenerátor indítását, a bit alaphelyzetbe állítása elindítja az óragenerátort. A bit beállítása leállítja a generátort, csak akkumulátoros üzemmódban (Vbat). Ha külső forrásról (Vcc) táplálja, az oszcillátor mindig működik, függetlenül az EOSC bit állapotától. Ha engedélyezve van, az alapértelmezett bitérték 0.
A BBSQW bit beállítása lehetővé teszi, hogy az INT/SQW kimenet (3. érintkező) akkumulátoros üzemmódban működjön, külső tápellátás hiányában. Ha a bit nullára van állítva, az INT/SQW kimenet 3-as állapotba kerül (deaktiválva), ha a külső forrás Vcc feszültsége a Vpf küszöbérték alá esik. A tápfeszültség bekapcsolása után az alapértelmezett bitérték 0.
A CONV bit felelős a kényszerített hőmérsékletmérésért, a bit beállítása elindítja az átalakítási folyamatot, melynek során az órajelgenerátor frekvenciáját is beállítják, a mérési eredmény 0x11, 0x12 című regiszterekben található. Indítás csak akkor lehetséges, ha az előző konverzió befejeződött; indítás előtt ellenőrizni kell a BSY foglalt jelzőt. A kényszerített hőmérséklet-átalakítás nincs hatással a belső 64 másodperces frekvenciabeállítási ciklusra. A CONV bit beállítása nem befolyásolja a BSY jelzőt 2 ms-ig. A CONV és BSY bitek automatikusan törlődnek az átalakítás befejezése után.
Az RS2, RS1 bitek beállítják a téglalap alakú impulzusok (négyzethullám) frekvenciáját az INT/SQW kimeneten. Alapértelmezés szerint, ha engedélyezve van, a bitek 1-re vannak állítva. Az alábbi táblázat a bitek lehetséges kombinációit mutatja:
Az INTCN bit vezérli az INT/SQW kimenetet. Ha a bitet alaphelyzetbe állítjuk, a kimeneten téglalap alakú impulzusok (négyzethullámok) jelennek meg, melyek frekvenciáját az RS2, RS1 bitek állítják be. Ha az INTCN bit be van állítva, a kimenet riasztási megszakításokat generál. Alapértelmezésben a bit értéke 1. A kimenet típusa INT/SQW - nyitott lefolyó, ezért egy ellenálláson keresztül kell felhúzni egy magas logikai szintre, az aktív szint alacsony.
Az A1IE, A2IE beállítási bitek lehetővé teszik az 1. és 2. riasztási jel megszakítását. Reset bitek, letiltja a megszakításokat. Az alapértelmezett érték 0.
Az állapotregiszter eseményjelzőket tartalmaz, és vezérli a 32 kHz-es kimenetet. Az OSF zászló az óragenerátor állapotát tükrözi, az 1-es érték azt jelenti, hogy az óragenerátor leállt, ez az esemény a következő esetekben fordulhat elő:
Beállítás után a bit értéke nem változik, a bitet kézzel kell visszaállítani.
Az EN32kHz bit beállítása lehetővé teszi téglalap alakú impulzusok (négyzethullámok) generálását a 32 kHz-es kimeneten (1. tű), az impulzusfrekvencia rögzített és 32,768 kHz. A bit visszaállítása letiltja ezt a funkciót, és a kimenetet a 3. állapotba (nagy bemeneti impedancia) mozgatja. Alapértelmezés szerint a bit értéke 1; a tápfeszültség bekapcsolása után impulzusok jelennek meg a kimeneten. A kimenet típusa 32kHz-es nyitott lefolyó, tehát magas logikai szintre való felhúzást igényel.
A BSY foglalt jelző a hőmérséklet-átalakítás és az órabeállítás folyamata során kerül beállításra. A zászló alaphelyzetbe áll, amikor az átalakítás befejeződött.
Az A1F, A2F ébresztőóra zászlókat akkor állítjuk be, ha az időszámláló regiszterek és az ébresztőóra regiszterek értékei megegyeznek. Ha az A1IE, A2IE riasztási megszakítások engedélyezve vannak, és megszakítási kimenet van hozzárendelve (INTCN bit be van állítva), akkor megszakítási jel jelenik meg az INT/SQW kimeneten (átmenet magasról alacsony logikai szintre). A zászlókat kézzel kell visszaállítani a 0 érték beírásával.
Az Aging Offset regiszter az óragenerátor frekvenciájának beállítására szolgál. A regiszterérték hozzáadódik az oszcillátor frekvenciájához a belső beállítási eljárás során, ha hőmérsékletváltozást észlel, és akkor is, ha a CONV bit hőmérséklet-átalakítást vált ki. Az eltolási érték előjeles, azaz a pozitív értékek (1-127) csökkentik a frekvenciát, a negatív értékek (128-255) növelik. Ugyanazon eltolás esetén a frekvenciaváltozás a hőmérséklettől függően eltérő lesz. +25°C-on a frekvenciaváltozás 0,1 ppm/LSB lesz.
Az aktuális hőmérsékleti értéket a 0x11 és 0x12 című regiszterek tárolják, a magas és alacsony bájt, a regiszterekben lévő hőmérsékleti érték időszakosan frissül. Balra igazítás van beállítva, a felbontás 10 bit vagy 0,25°C/LSB, vagyis a magas bájt tartalmazza a hőmérséklet egész részét, az alsó regiszterek 6., 7. bitje pedig a tört részt. A magas bájtban a 7. bit a hőmérséklet előjelét jelzi, például a 00011011 01 érték +27,25 °C-os hőmérsékletnek, az 11111110 10 érték -2,5 °C-os hőmérsékletnek felel meg.
Az időregiszterek kiolvasásánál ajánlatos kiegészítő puffert használni, vagyis egyszerre több regisztert olvasni, és nem külön-külön, hiszen az egyes olvasási műveletek között az időregiszterek értékét változtathatják. Ezt a szabályt ajánlott betartani az új adatok számlanyilvántartásokba írásakor is. Új érték beírása a másodpercregiszterbe 1 másodpercre szünetelteti az órát, a fennmaradó regisztereket ez idő alatt újra kell írni.
Összekötöttem az órát egy PIC16F628A mikrokontrollerrel és használtam. A csatlakozási rajz az alábbiakban látható:
A tápfeszültség bekapcsolása után kötőjelek (– – – – – –) jelennek meg a kijelzőkön, majd az óra inicializálása megtörténik, az időérték 1 másodperces késleltetéssel jelenik meg a kijelzőkön, ami az óragenerátor indításához szükséges. Az indikátorok tizedesvesszővel elválasztva jelenítik meg az órát, percet és másodpercet, az idő formátuma pedig 24 órás. Az SB1 „Jelzés” gombbal módosítható a megjelenítési formátum, ahol a jelzők a hőmérsékletet, valamint az órák és percek értékét jelenítik meg, tizedesvesszővel elválasztva, amely 2 Hz-es frekvenciával villog. A hőmérséklet tört rész nélkül jelenik meg, a program csak a 0x11 címen lévő hőmérséklettároló magas bájtját olvassa be.
Az időértéket az óráról az SQW/INT vonal megszakítása olvassa ki, amelyet az 1. riasztási jel vezérel, az óra inicializálása során az ébresztőóra minden második jelzésre van állítva. A HL1 LED jelzőként szolgál, és másodpercenként villog a megszakítási jelnél. A HL2 LED kigyullad, ha az I2C interfészen keresztüli adatátvitel során hiba történik.
Ezenkívül hozzáadtam a programhoz az óra beállításának lehetőségét az SB2 „Beállítások”, az SB3 „Telepítés” gombokkal. A beállítási módba az SB2 gomb megnyomásával léphetünk be, a jelzőfények percek és másodpercek (00 – – – –) helyett 00 órát és kötőjeleket mutatnak. Az SB3 gombbal beállíthatja az óra értéket (minden megnyomással növelheti), majd az SB2 gomb megnyomásával átvált a percek szerkesztésére, kötőjel helyett 00 perc jelenik meg. Az SB3 gomb szintén beállítja a kívánt értéket és így tovább. A másodpercek szerkesztése és az SB2 gomb megnyomása után az óra átíródik, és a frissített idő megjelenik a kijelzőkön.
A részleges programkód alább található (a teljes verzió letölthető a cikk végén):
;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;;;; ; #beleértve
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #beleértve CONFIG H"3F10" ;Mikrovezérlő konfiguráció errorlevel -302 ;ne jelenítse meg a 302-es hibaüzeneteket a listában Sec equ 0020h ;kiegészítő számlanyilvántartások Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h ;a segédregiszter bitek számának számlálása perem equ 0025h ;kiegészítő bájt vételi/átviteli regiszter spi, i2c-n keresztül temp equ 0026h ;hőmérsékletregiszter perem_1 equ 0027h ;BCD segédregiszter eredmény equ 0028h ;bináris-decimális átalakító segédregiszter dat_ind equ 0029h ;adatregiszter spi protokollon keresztüli továbbításhoz adr_ind equ 002Ah ;címregiszter spi protokollon keresztüli továbbításhoz second equ 002Bh ;másodperces tárolóregiszter az idő beállításához perc equ 002Ch ;perc tárolási regiszter az idő beállításához óra equ 002Dh ;óra tárolási regiszter az idő beállításához adr_i2c equ 002Eh ;regiszterek az i2c interfész adatátviteli szubrutinjához tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h zászló equ 007Fh ;zászlóregiszter #DEFINE int PORTB,0 ;interrupt line INT/SQW DS3231 #DEFINE sda PORTB,1 ;SDA vonal a DS3231 csatlakoztatásához #DEFINE scl PORTB,2 ;SCL vonal a DS3231 csatlakoztatásához #DEFINE datai PORTB,5 ;a MAX7219 illesztőprogram adatbeviteli sora #DEFINE cs PORTB,6 ;illesztőprogram-választó sor MAX7219 #DEFINE clk PORTB,7 ;a MAX7219 illesztőprogram órajele #DEFINE led PORTB,4 ;i2c hibajelző LED #DEFINE led_sec PORTB,3 ;LED órajel előrehaladást jelző 1Hz #DEFINE regim PORTA,2 ;Jelzőgomb - megváltoztatja a megjelenítési módot #DEFINE nast PORTA,3 ;Beállítások gomb - belép az időbeállítás módba #DEFINE ust PORTA,4 ;Set gomb - az óra értékének beállítása ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;a program végrehajtásának indítása a 0000h címről goto Start ;lépjen a Start címkére ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Fő program Start movlw b"00000000" ;állítsa be az A port kimeneti reteszeinek értékeit movlw b"01000000" ;állítsa be a B port kimeneti reteszeinek értékeit movlw b"00000111" ;kapcsolja ki az összehasonlítókat bsf STATUS,RP0 ;válassza ki az 1. bankot movlw b"00000111" ;A B port bemeneti/kimeneti vonalainak konfigurálása movwf TRISB ;RB0-RB2 - a bemenetre, a többi a kimenetre movlw b"11111111" ;az A port bemeneti/kimeneti vonalainak beállítása movwf TRISA ;minden sor bemenetre bcf STATUS,RP0 ;válassza ki a 0 bankot clrf flag ;reset flag register init_lcd hívása ;hívja az illesztőprogram inicializálási rutinját (MAX7219) hívja a viv_not ;kimeneti kötőjel szimbólumokat " ------" az indikátorokhoz ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw b"11010000" ;eszköz címe (DS3231) ;Írjon 4 bájtot a vételi/átviteli regiszterekbe az i2c-n keresztül movlw data_i2c ;az első vételi/átviteli regiszter beállítása i2c-n keresztül movlw b"10000000" ;adatok az 1. riasztás másodpercregiszteréhez movlw b"10000000" ;adatok az 1. riasztás jegyzőkönyvéhez movlw b"10000000" ;adatok az 1. ébresztőóra-regiszterhez movlw b"10000000" ;adatok az 1. riasztás dátuma/hét napja nyilvántartásához movlw .4 ;4 bájt átvitele i2c-n keresztül movlw 0x07 ;az 1. ébresztőóra másodpercregiszterének címének beállítása |
Megkülönböztető jellegzetességek:
Alkalmazás:
A DS3231 tipikus csatlakozási rajza:
Általános leírása:
A DS3231 egy nagy pontosságú valós idejű óra (RTC) beépített I 2 C interfésszel, hőmérséklet-kompenzált kristályoszcillátorral (TCXO) és kvarc rezonátorral. A készülék rendelkezik egy tartalék autonóm áramforrás csatlakoztatására szolgáló bemenettel, amely lehetővé teszi az időzítést és a hőmérséklet mérést a fő tápfeszültség kikapcsolása esetén is. A beépített kvarc rezonátor növeli a készülék élettartamát és csökkenti a szükséges külső elemek számát. A DS3231 kereskedelmi és ipari hőmérsékletű változatban kapható, és egy 300 miles 16 tűs SO csomagba van csomagolva.
Az RTC biztosítja a másodpercek, percek, órák, a hét napjai, a hónap napjai és az év számlálását. A hónap záró dátuma automatikusan kerül meghatározásra a szökőévek figyelembevételével. A valós idejű óra 24 vagy 12 órás formátumban működik, és a nap aktuális felét (AM/PM) jelzi. A készülék napi két riasztással és programozható frekvenciájú négyszögletes kimenettel rendelkezik. Az adatcsere a készülékkel a beépített soros I 2 C kompatibilis interfészen keresztül történik.
". Ismerkedjünk meg a DS3231 valós idejű óra modullal. A cikk videós utasításokat, programlistákat, a DS családból származó modulok Arduinohoz való csatlakoztatásának célját és módszereit tartalmazza.
DS3231 valós idejű óra modul
Valós idejű óra modul- ez egy elektronikus áramkör, amelyet kronometrikus adatok rögzítésére terveztek (aktuális idő, dátum, a hét napja stb.), és egy autonóm áramforrásból és egy rögzítőeszközből álló rendszer.
DS3231 modul Lényegében egy közönséges óra. Az Arduino kártyákon már van beépített időérzékelő Millis azonban csak akkor működik, ha a tábla áram alá van kapcsolva. Ha kikapcsolja, majd bekapcsolja az Arduinót, a Millis-idő nullára áll vissza. A DS3231 fedélzetén pedig egy akkumulátor található, amely még az Arduino kártya leválasztása után is „táplálja” a modult, lehetővé téve az idő mérését.
A modul Arduino kártyákra épülő óraként vagy ébresztőóraként használható. Vagy riasztásként különböző rendszerekre, például egy okosotthonban.
DS3231 műszaki adatok:
32K— 12 V-nál nagyobb külső tápellátásra tervezett kimenet.
S.Q.W.- Programozható négyzethullámú jelkimenet.
SCL– Ezen a tűn keresztül történik az adatcsere az órával az I2C interfészen keresztül.
S.D.A.– Az óra adatai ezen a tűn keresztül kerülnek továbbításra.
VCC– Tápellátás a valós idejű órához, 5 volt szükséges. Ha ez a tű nem kap feszültséget, az óra alvó üzemmódba lép.
GND- Föld.
SDA és SCL érintkezők különböző Arduino kártyákon:
S.D.A. | SCL | |
UNO | A4 | A5 |
Mini | A4 | A5 |
Nano | A4 | A5 |
Mega2560 | 20 | 21 |
Leonardo | 2 | 3 |
Csatlakoztassuk a valós idejű óra modult az Arduino UNO-hoz. SDA - pin A4, SCL - tű A5.
A következő program alkalmas a modell működésére (egyszerűen átmásolhatja a programot az Arduino IDE-be):
#beleértve
void setup() (
késleltetés(300);
Serial.begin(9600);
time.begin();
}
void loop()
}
}
Ebben a vázlatban az idő egyszerűen visszaszámlál.
Először is az sktech-ben csatlakoztassa a könyvtárat iarduino_RTC.h.
Itt adja meg a modul pontos nevét, hogy megfelelően működjön.
Ennek eredményeként megkapjuk a DS3231 modul időkimenetét a portmonitorra. Órák, percek, másodpercek jelennek meg.
A következő vázlatban hozzáadunk egy függvényt beállítani az időt, amely lehetővé teszi a kezdeti visszaszámlálási idő beállítását.
#beleértve
iarduino_RTC time(RTC_DS3231);
void setup() (
késleltetés(300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 mp, 0 perc, 18 óra, 2017. április 24., hétfő
}
void loop()
if(millis()%1000==0)( // ha eltelt 1 másodperc
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // megjelenítési idő
késleltetés(1); // szünet 1 ms-ig, hogy ne jelenjen meg többször az idő 1 ms alatt
}
}
A példában az idő 2017. április 24-én, hétfőn 0 másodperctől 0 perctől 18 órától kezdődik.
Leckék bejegyzései:
Ma folytatjuk a keresést a tökéletes valós idejű óra (RTC) chip után. alapján fogunk órákat készíteni. A kijelző kényelmesebb lesz a fejlesztéshez - LCD kijelző, amely a beállításokon kívül minden információt egyszerre jelenít meg. Ebben a formában az óra kényelmesen használható asztali lehetőségként.
Tehát nézzük magát a DS3231 chipet. A DS3231 egy valós idejű óra, rendkívül precíz mozgással (a gyártók választották ezt a szót) a beépített kvarc rezonátornak köszönhetően hőmérséklet-kompenzációval. Az adatátviteli interfész I 2 C. Ennek a mikroáramkörnek van egy bemenete a tartalék akkumulátor feszültségére is, a fő tápellátás kikapcsolásakor a mikroáramkör automatikusan átkapcsol a tartalék akkumulátorról történő működésre, a tartalék akkumulátor működésének pontossága nem érintett. Nagyon kellemes, nem? A DS3231 támogatja a másodpercek, percek, órák, a hónap napjai (dátum), a hét napjai, a hónapok és az évek számlálását (beleértve a szökőévet is). Támogatja a 12 és 24 órás formátumú munkát. 2 ébresztőóra van, amelyek konfigurálhatók és állapotuk figyelhető. A hőmérséklet-kompenzáció pontosságának beállítása. És két kimenet is - 32 kHz-en (a kimenet 32,768 kHz) és egy programozható kimenet 1 Hz-től 8,192 kHz-ig. Van még egy reset pin - RST. A valós idejű óra chip SO-16 kiszerelésben kapható. A tok elég nagy, de ha figyelembe vesszük, hogy már van benne kvarc, és hőmérséklet-kompenzált is, akkor nekem úgy tűnik, hogy a méretekkel minden rendben van. A DS3231-nek van egy ikertestvére DS3232 formájában, aminek azonban van még 2 lába. Mindez nagyon emlékeztet az NXP termékekre - PCA2129 és PCF2129 óralapkák. Hasonló hőmérséklet-kompenzált beépített kvarc rezonátor, mindkettő ugyanaz az iker, csak különböző számú n.c. tűk és hasonló funkciók a DS3231-hez képest az időmérőn kívül.
Az RTC DS3231 modulok formájában, a szükséges bekötéssel, valamint EEPROM chippel kiegészítve kapható, amelyre legtöbbször nincs is szükség, csak növeli a súlyt:
A modullapon a szükséges alkatrészeken kívül egy LED is található, aminek a funkciója a kapcsok tápellátásának jelzése. Valószínűleg csak a szépség miatt szállították.
Amit fontos tudni, ha ilyen valós idejű órachippel dolgozunk, az az, hogy hogyan lehet belőle adatokat kinyerni vagy oda írni. Az óra I 2 C interfésszel rendelkezik. Az adatok írásához (és ez az adatok olvasásához is szükséges) át kell adni a start feltételt (ezek a parancsok hardveres vagy szoftveres I 2 C segítségével kerülnek végrehajtásra mikrokontroller), majd adja át a chip címét a bitrekorddal, majd adja át annak a regiszternek a címét, amelyhez hozzá fogunk férni, majd egy bájt adatot vigyen át ebbe a regiszterbe, ha ezután még egy bájt adatot visz át, akkor az a következő regiszterbe írva stb. Ha végzett, teljesítenie kell egy megállási feltételt. A fentiek grafikus ábrázolása az ábrán:
Adatrögzítés szükséges a kezdeti beállításhoz, valamint az aktuális idő beállításához. Ezután folyamatosan adatokat kell kapnunk az aktuális időről és dátumról. Ehhez ki kell olvasni az ezeket az információkat tároló regiszterekből. Az olvasás két eljárásból áll: egy mutatót állít a kívánt regiszterre, és beolvassa. A kívánt regiszter mutatójának beállításához át kell adni a start feltételt, majd át kell adni a chip címét az írási bittel és egy bájtot a regiszter címével. Ezután vagy egy leállási feltétel, majd egy indítási feltétel, vagy csak egy újraindítás. Most a második eljárás közvetlenül a regiszterekből történő olvasás. Az indítás átvitelre kerül, majd egy olvasási bittel el kell küldeni a mikroáramkör címét, majd ki kell olvasni a regisztereket a kívánt számban, és a befejezés után továbbítani kell a stop feltételt. Ha a regiszter információi beolvasásra kerültek, a mutató automatikusan a következő regiszterre lép, anélkül, hogy a mikrokontroller (device master) szükségtelenné válna. Az ábra mindazt szemlélteti, amit fentebb elmondtunk az I 2 C interfész segítségével történő regiszterek olvasásával kapcsolatban:
Chip címe:
A C kód így fog kinézni:
// függvények az órával ============================================= =============== ==================================== ================= ======== // kezdeti beállítások inicializálása void RTC_init(void)( i2c_start_cond(); // i2c indítása i2c_send_byte(RTC_adr_write); // az eszköz címének átvitele, rögzítési mód i2c_send_byte(0x0E); // a memóriacím átvitele i2c_send_byte(0b00100000); // a hőmérséklet-átalakítás és a kimenet 1 Hz-en indítása i2c_send_byte(0b00001000); // ztop kimenet engedélyezése _i2cond(0b00100000); // // stop i2c ) // idő és dátum lekérése void RTC_read_time(void)( i2c_start_cond() ; // start i2c i2c_send_byte(RTC_adr_write); // eszköz címének átvitele, írási mód i2c_send_byte(0x00 átvitele); // i2c_stop_cond(); // i2c leállítása i2c_start_cond(); // i2c indítása i2c_send_byte(RTC_adr_read); // átviteli eszköz címe, olvasási mód sec = bcd(i2c_get_byte(0)); // másodpercek olvasása, ACKi_byte2 =cgetd (0)); // percek olvasása, ACK óra = bcd(i2c_get_byte(0)); / / óra beolvasása, ACK wday = bcd(i2c_get_byte(0)); // a hét napjának kiolvasása, ACK day = bcd(i2c_get_byte(0)); // a szám beolvasása, ACK hónap = bcd(i2c_get_byte(0)); // hónap olvasása, ACK év = bcd(i2c_get_byte(1)); // év olvasása, NACK i2c_stop_cond(); // i2c stop 0x00) ; // memóriacím átvitele i2c_send_byte(bin(sec1)); // 0x00 másodperc (célszerű másodperceket is megadni?) i2c_send_byte(bin(min1)); // 0x01 perc i2c_send_byte)(bin(hour1)) ; // 0x02 óra i2c_stop_cond(); // i2c leállítás ); // eszközcímek átvitele, rögzítési mód i2c_send_byte(0x03); // memóriacím átvitele i2c_send_byte(bin(wday)); // 0x03 a hét napja (vasárnap - 1, hétfő 2, kedd 3, szerda 4, Cs 5, P 6, Szo 7 ) i2c_send_byte(bin(day)); // 0x04 nap hónap i2c_send_byte(bin(month)); // 0x05 hónap i2c_send_byte(bin(year)); // 0x06 év_cond(_stop); // stop i2c ) // a hőmérséklet olvasása void RTC_read_temper(void)( i2c_start_cond(); // start i2c i2c_send_byte(RTC_adr_write); // az eszköz címének átvitele, írási mód i2c_send_byte(0x11); // a memória átvitele (); // i2c leállítása i2c_start_cond(); // i2c indítása i2c_send_byte(RTC_adr_read); // eszköz címének továbbítása, olvasási mód t1 = i2c_get_byte(0); // MSB hőmérséklet olvasása t2 = i2c_get_byte(1); // olvasás LSB hőmérséklet i2c_stop_cond (); // i2c leállítása t2=(t2/128); // eltolás 6-tal - pontosság 0,25 (2 bit) // eltolás 7-tel - pontosság 0,5 (1 bit) t2=t2*5; )
Ez az összes forráskód, amely a mikroáramkörrel működött, az órajel beállítását ez nem befolyásolta, mivel az óra napok óta egy másodpercet sem veszített.
Igen - nagyszerű funkció A DS3231 az, hogy ugyanaz a chip látja el a hőmérő funkcióit (egyébként hogyan lehet hőmérséklet-kompenzációt végrehajtani) és képes leolvasni az aktuális hőmérsékletet. A maximális hőmérsékleti felbontás 0,25 Celsius fok. Ezenkívül a hőmérséklet-frissítési időszak meglehetősen hosszú - körülbelül 1 perc. Igen, nem kell gyorsan frissítenünk.
A teljes óraszerkezet diagramja így néz ki:
A mikrokontrollert az Atmega8 széles körű elérhetősége és alacsony ára miatt választotta. Ez a mikrokontroller DIP-28 csomagban és SMD változatban is TQFP-32 csomagban használható. Az R3 ellenállásra azért van szükség, hogy megakadályozzuk a mikrokontroller spontán újraindulását, ha véletlenszerű zajt észlel a PC6 érintkezőjén. Az R3 ellenállás ehhez a tűhöz húzza a plusz feszültséget, megbízható potenciált teremtve rajta. A megjelenítéshez folyadékkristályos kijelzőt (LCD) használnak. Én a 2004A kijelzőt használtam - a 4 soros 20 karakter inkább a szépség kedvéért, így egy ismerősebb kijelző használható - 2 sor 16 karakter. Az LCD-kijelző négybites rendszerrel csatlakozik a mikrokontrollerhez. Az R2 változó ellenállás szükséges a kijelzőn megjelenő karakterek kontrasztjának beállításához. Ennek az ellenállásnak a csúszkáját elforgatva érjük el számunkra a legtisztább leolvasást a képernyőn. Az LCD-kijelző háttérvilágítása a kijelzőpanel „A” és „K” érintkezőiből áll. A háttérvilágítást az R1 áramkorlátozó ellenálláson keresztül kapcsolják be. Minél magasabb ez az érték, annál gyengébb a kijelző háttérvilágítása. Ezt az ellenállást azonban nem szabad elhanyagolni a háttérvilágítás károsodásának elkerülése érdekében. Az S1 - S4 gombok szabályozzák az órabeállításokat. A LED azt jelzi, hogy a riasztás kikapcsolt. A LED helyettesíthető valamilyen hangáramkörrel. Az R5 - R8 ellenállások felhúzhatóak, és szükségesek a négyszögletes impulzusok kialakításához az óralapka kapcsain. Ez az I2C protokoll megfelelő működéséhez is szükséges. Az áramkör táplálására egy L7805 lineáris stabilizátor chipet használnak; helyettesíthető a KR142EN5A öt voltos lineáris stabilizátor hazai analógjával, vagy használhat egy másik feszültségstabilizátor chipet az áramkörben való csatlakozásának megfelelően (például LM317 vagy kapcsolóstabilizátorok LM2576, LM2596, MC34063 és így tovább). Ezután az 5 voltot egy másik mikroáramkör stabilizálja - az AMS1117 olyan változatban, amely 3,3 voltos kimenetet ad. Az órachip az adatlap szerint 3,3 voltos feszültségről táplálkozik. A maximális feszültség azonban 5,5 volt. Ezért ezt a stabilizátort saját belátása szerint használhatja vagy sem. Az AMS1117 feszültségstabilizátor az ADJ változatra (AMS1117ADJ) is cserélhető - vagyis állítható változat, ezzel a választással kell beállítani a kívánt feszültségetkét, a mikroáramkörre csatlakoztatott ellenállás használatával, annak adatlapja szerint.
Az áramkör összeállítása és hibakeresése az ATmega8 mikrokontroller fejlesztőkártyájával történt:
A gombok célja:
A 32 kHz-es tűvel a kristályfrekvencia szabályozható. Ehhez a tűhöz csatlakoztatunk egy frekvenciamérőt vagy oszcilloszkópot, és szabályozzuk a frekvenciát:
Amint az az oszcillogram képernyőképen látható, a frekvencia hozzávetőlegesen 32,768 kHz-nek felel meg (körülbelül a frekvencia mérések felbontásának korlátai miatt, és „szemmel” nehéz ilyen pontosan meghatározni).
Az eredmény egy óra a következő jellemzőkkel rendelkezik:
Foglaljuk össze. A DS3231 valós idejű óra chip kiváló megoldás. A pontosság néhány DS1307-hez vagy magasabbhoz hasonlítható, de a PCA/PCF2129 továbbra is versenyezhet vele. Az általam áttekintett valós idejű óra chipek között ez a példány jelenleg az első helyen áll a funkcionalitás és a pontosság tekintetében.
Az Atmega8 mikrokontroller programozásához ismernie kell a biztosíték bitek konfigurációját (a programban készült képernyőkép):
A cikket kíséri az Atmega8 mikrokontroller firmware-je, a program áramköri kialakítása, valamint egy videó az óra működéséről (a kezdetben a riasztás kialszik - a LED világít).
Kijelölés | típus | Megnevezés | Mennyiség | jegyzet | Üzlet | A jegyzettömböm |
---|---|---|---|---|---|---|
IC1 | MK AVR 8 bites | ATmega8 | 1 | Jegyzettömbhöz | ||
IC2 | Valós idejű óra (RTC) | DS3231 | 1 | Jegyzettömbhöz | ||
VR1 | Lineáris szabályozó | L7805AB | 1 | Jegyzettömbhöz | ||
VR2 | Lineáris szabályozó | AMS1117-3.3 | 1 | Jegyzettömbhöz | ||
VD1 | Egyenirányító dióda | 1N4148 | 1 | Jegyzettömbhöz | ||
C1 | 470 µF | 1 | Jegyzettömbhöz | |||
C2, C3, C5, C7 | Kondenzátor | 100 nF | 4 | Jegyzettömbhöz | ||
C4 | Elektrolit kondenzátor | 220 µF | 1 | Jegyzettömbhöz | ||
C6, C8 | Elektrolit kondenzátor | 10 µF | 2 | Jegyzettömbhöz | ||
R1 | Ellenállás | 22 Ohm | 1 | Jegyzettömbhöz | ||
R2 | Trimmer ellenállás | 10 kOhm | 1 | 3296W-1-103LF |
Sok készülék megköveteli a kronometrikus adatok (dátum, idő) folyamatos rögzítését, ezt a funkciót speciális elektronikus áramkörök, úgynevezett valós idejű órák látják el. Jelenleg egy valós idejű óra külön mikroáramkör formájában van megvalósítva, amelyhez hozzá kell adni egy kvarc rezonátort és egy autonóm tápegységet. Egyes mikroáramkörökben kvarc rezonátor van beépítve. Az egyik ilyen óra egy chipen DS3231SN az enyémnek vettem projektek . A példában egy valós idejű órát fogok csatlakoztatni egy kínai analóghoz Arduino UNO.
Ezek egy komplett ZS-042 modul, amely különféle eszközökhöz csatlakoztatható, nem csak az Arduino platformhoz.
A modul mikroáramkörre épül DS3231SN ami lényegében egy valós idejű óra. A régi óramodelltől eltérően, például a DS1307 chipen ez az óra belső kvarcrezonátort tartalmaz, aminek köszönhetően az óra pontos idővel rendelkezik.
Az Arduino órát a DS3231SN nélkül is megvalósíthatja, de ha az áramellátás megszakad, az időzítő értékei visszaállnak.Ugyanezek az órák tartalék tápellátással rendelkeznek, így ha az áram megszűnik, tovább működnek.
Az óra órákat, perceket, másodperceket, dátumokat, hónapokat, éveket tud számolni (2100-ig a szökőéveket veszik figyelembe). 12 vagy 24 órás üzemmódban működnek, két ébresztőórát tartalmaznak, és egy belső hőmérővel is rendelkeznek, amelynek tartománya -40 ° C és + 85 ° C között van. A különféle eszközökhöz való csatlakoztatáshoz az óra a I2C interfész.
A tűk elhelyezkedése és célja a ZS-042 modulon:
S.Q.W.- Programozható négyzethullámú jelkimenet.
SCL– Ezen a tűn keresztül adatcsere történik az órával az I2C interfészen keresztül.
S.D.A.– Az óra adatai ezen a tűn keresztül kerülnek továbbításra.
VCC– Tápfeszültség valós idejű órához, 5 volt szükséges. Ha ez a tű nem kap feszültséget, az óra alvó üzemmódba lép.
GND- Föld.
A csatlakozáshoz Arduino UNO, Az óra SDA érintkezőjét az A4-es érintkezőhöz, az SCL-tűjét pedig az A5-öshöz kötjük. A GND(-) és VCC(+5v) érintkezők tápellátást biztosítanak.
SDA és SCL érintkezők különböző Arduino kártyákon:
S.D.A. | SCL | |
UNO | A4 | A5 |
Mini | A4 | A5 |
Nano | A4 | A5 |
Mega2560 | 20 | 21 |
Leonardo | 2 | 3 |
Tegyünk az órába egy CR2032 elemet, ezek az elemek a számítógépek BIOS-ának táplálására szolgálnak.
Amikor az USB-kábelt az Arduino-hoz csatlakoztatja, az órán lévő LED-nek világítania kell ERŐ"(piros LED).
Az óra Arduino IDE-n keresztüli programozásához könyvtárakat kell telepítenie.
Könyvtár letöltése Idő és DS1307RTC.
Az utolsó könyvtár a DS1307 lapkán lévő órára íródott, de interakciós protokolljai kompatibilisek a DS3231-gyel, így a könyvtár a mi óránkba illeszkedik.
A könyvtárakat le kell tölteni, ki kell csomagolni és el kell helyezni a mappába "könyvtárak" Az Arduino IDE indításakor a példákkal együtt meg kell jelenniük a " Minták».
Állítsa be a dátumot és az időt.
Ehhez másolja ezt a kódot az Arduino IDE-be.
A helyes beállításokhoz módosítani kell a sorban lévő adatokat
setTime(13;35;0;22;12;2016);
Zárójelben, vesszővel elválasztva, állítsa be a helyes értékeket: óra, perc, másodperc, nap, hónap, év. Az én példámban 13 óra 35 perc 0 másodpercre van beállítva, 2016. december 22. Töltse fel a vázlatot Arduino-ba.
Most az óra leolvasásának leolvasásához használhatja a következő példát: " Fájl» - « Minták» - « DS1307RTC» - « ReadTest"És mögött töltsd fel az Arduino-ba.
A megnyíló ablakban megjelenik az aktuális dátum és idő. Ha kikapcsolja az Arduino óramoduljának áramellátását, az Arduino nem tudja követni az értékeket, és egy idő után megjelenik az üzenet " ...olvasási hiba!"(pirossal kiemelve). Az áramellátás visszaállítása után a dátum és az idő visszaszámlálása folytatódik. A dátum és az idő nem lett visszaállítva, mert az óra CR2032 elemmel működött.