Meranie pulzovej frekvencie.: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 149: | Riadok 149: | ||
int b=0; // | int b=0; //deklarovanie premennej b | ||
int i=0; // | int i=0; //deklarovanie premennej i | ||
int a=0; // | int a=0; //deklarovanie premennej a | ||
volatile unsigned int newTick = 0; // | volatile unsigned int newTick = 0; //deklarovanie premennej newTick - slúži na zachytenie aktuálnej hodnoty počítadla | ||
volatile unsigned int newTick1 = 0; // | volatile unsigned int newTick1 = 0; //deklarovanie premennej newTick1 - slúži na zachytenie aktuálnej hodnoty počítadla | ||
unsigned int vysledok = 0; //deklarovanie premennej | unsigned int vysledok = 0; //deklarovanie premennej výsledok - slúži na vyhodnotenie časového intervalu | ||
unsigned int priemer = 0; //deklarovanie premennej priemer | unsigned int priemer = 0; //deklarovanie premennej priemer | ||
ISR(TIMER1_CAPT_vect) //funkcia obslužného programu prerušenia od periférie Timer1 | ISR(TIMER1_CAPT_vect) //funkcia obslužného programu prerušenia od periférie Timer1 | ||
{ | { | ||
newTick=ICR1; //uloženie aktuálnej hodnoty zo záchytného registra do premennej newTick | newTick=ICR1; //uloženie aktuálnej hodnoty zo záchytného registra do premennej newTick | ||
TCNT1=0x0000; //nastavenie | TCNT1=0x0000; //nastavenie registru TCNT1 na hodnotu 0x0000 | ||
i=1; //nastavenie premennej i = 1 | i=1; //nastavenie premennej i = 1 | ||
} | } | ||
void delay_ms(int ms) //funkcia na vytvorenie | void delay_ms(int ms) //funkcia na vytvorenie čakacej slučky | ||
{ | { | ||
unsigned int index; //vytvorenie premennej index | unsigned int index; //vytvorenie premennej index | ||
while (ms) //while | while (ms) //while slučka, ktorá sa vykoná ms-krát | ||
{ | { | ||
index = 4*799; //while | index = 4*799; //while slučka ktorá nerobí nič index-krát | ||
while(index) | while(index) | ||
{ | { | ||
Riadok 187: | Riadok 187: | ||
TCCR1B = 0b01000010; // T1 clk = F_CPU : 64, rising edge pin ICP1, | TCCR1B = 0b01000010; // T1 clk = F_CPU : 64, rising edge pin ICP1, | ||
TCCR1A = 0b00000000; // T1 in timer mode !! Note: if You omit this, TCNT1 will be only 8-bit !! | TCCR1A = 0b00000000; // T1 in timer mode !! Note: if You omit this, TCNT1 will be only 8-bit !! | ||
TCNT1 = 0x0000; // | TCNT1 = 0x0000; // inicializácia počítadla (16-bit! Low+High bytes) | ||
TIFR1=0; | TIFR1=0; | ||
inituart(); // | inituart(); //inicializácia sériovej linky | ||
stdout = &uart_output; | stdout = &uart_output; | ||
stdin = &uart_input; | stdin = &uart_input; | ||
TIMSK1 = 0x20; // nastavenie TIMSK | TIMSK1 = 0x20; // nastavenie TIMSK na hodnotu 0x20 -> povolenie Input Capture Interrupt Enable | ||
sei(); | sei(); | ||
Riadok 200: | Riadok 200: | ||
while(1) // TODO: display measured value somewhere | while(1) // TODO: display measured value somewhere | ||
{ | { | ||
if (i == 1) //ak | if (i == 1) //ak bolo vyvolané prerušenie, tak vykonaj nasledovné príkazy vo vnútri podmienky | ||
{ | { | ||
newTick1=(newTick*51)/100; // | newTick1=(newTick*51)/100; //prepočet hodnoty z newTick na newTick1 | ||
i=0; //nastavenie premennej i=0 | i=0; //nastavenie premennej i=0 | ||
delay_ms(1); // | delay_ms(1); //čakacia slučka 1ms | ||
a=a+1; //inkrementovanie premennej "a" | a=a+1; //inkrementovanie premennej "a" | ||
priemer=priemer+newTick1; // | priemer=priemer+newTick1; //pripočítanie hodnoty newTick1 k premennej priemer | ||
if (a==20) //podmienka, ak je a = 20 | if (a==20) //podmienka, ak je a = 20 | ||
{ | { | ||
vysledok=priemer/20; //priemer z 20 | vysledok=priemer/20; //priemer z 20 nameraných hodnôt | ||
printf("%u\n",vysledok); // | printf("%u\n",vysledok); //vypísanie priemeru | ||
a=0; //vynulovanie premennej"a" | a=0; //vynulovanie premennej"a" | ||
priemer=0; //vynulovanie premennej priemer | priemer=0; //vynulovanie premennej priemer |
Verzia z 22:52, 12. január 2015
Autori: | Ján Lechvár, Bc., Stanislav Slaminka, Bc. | |
Študijný odbor: | Aplikovaná mechatronika | 2. Ing. (2014/2015) |
Zadanie
Pomocou senzoru TSL235 zmerajte pulzovú frekvenciu. Popíšte princíp merania a vyhodnotenia signálu, zmerajte ukážkové data a vyhodnoťte meranie.
Literatúra:
- Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
Analýza
Úlohou nášho zadania je meranie pulzovej frekvencie nášho srdca pomocou senzora TSL235. Dáta z tohto senzora sú sériovo prenášané po I2C zbernici. Výstup senzora je pripojený na pin D8 na portuB, ktorý je nastavený ako vstup mikrokontroléra Atmega 328P, ktorý je umiestnený na vývojovej doske Acrob. Pre lepšie výsledky sme meranie vykonávali v tme, kde sme ako svetelný zdroj použili LED.
Parametre senzora TSL235:
- Max. napájacie napätie: Vdd = 6V
- Napájací prúd: Idd = max 3 mA
- Odporúčanie napájanie: Vdd = 2,7V – 5,5V
- Prevádzková teplota: Ta = -25°C – 70°C
- Teplota uskladnenia: Tstg = -25 °C – 85°C
- Výstupná frekvencia: fo = 200-300kHz
Rozloženie pinov senzora TSL235:
Popis pinov senzora TSL235:
Charakteristiky senzora TSL235
Popis komunikačnej zbernice i2c:
I²C (anglicky Inter-Integrated Circuit, čítame I-squared-C, nesprávne I-two-C) je multi-masterová počítačová sériová zbernica vyvinutá firmou Philips, ktorá je používaná na pripájanie nízkorýchlostných periférií k základnej doske, vstavanému systému alebo mobilnému telefónu.
Charakteristika
Zbernica rozdeľuje pripojené zariadenia na riadiaci (master - zahajuje a ukončuje komunikáciu; generuje hodinový signál SCL) a riadené (slave - zariadenie adresované masterom). Podľa stavu k 1. októbru 2006 nie sú vyžadované žiadne licenčné poplatky pre implementáciu, avšak spoplatnené je prideľovanie adries pre slave zariadenia.
Zbernica I²C sa hojne používa v rôznych zariadeniach, vrátane IBM PC kompatibilných počítačov:
- čítanie konfiguračných dát z SPD EEPROM v pamäťových DIMM moduloch (SDRAM, DDR SDRAM, DDR2)
- správa PCI kariet pomocou spojenia SMBus 2.0
- prístup k NVRAM čipom obsahujúcich užívateľské nastavenia (na sieťovej karte, radičmi)
- prístup k nízkorýchlostným D / A a A / D prevodníkom
- zmena kontrastu, teploty farieb, vyváženie farieb v monitoroch (DDC)
- zmena hlasitosti inteligentných reproduktorov
- riadenie OLED a LCD displejov mobilných telefónov
- čítanie údajov o monitorovaných zariadeniach (teplota procesora, rýchlosť vetráčikov)
- čítanie hodín reálneho času
- zapínanie a vypínanie napájania systémových komponentov
Časový diagram
Prenos dát sa začína START bitom (S), keď je SDA nízka, zatiaľ čo SCL zostáva vysoká. Potom, SDA nastaví prenášané bit kým SCL je nízka (modrá) a sú odobraté vzorky dát (prijaté) pri SCL stúpa (zelená). Keď je prenos dokončený, je poslaný STOP bit (P) pre uvoľnenie dátovej linky, zmenou SDA na vysokú, zatiaľ čo SCL je trvalo vysoký. Aby sa zabránilo falošne detekciu, je úroveň na SDA zmenený na negatívne hrane a je zachytený na kladné hrany SCL.
Riadenie komunikácie
Pre riadenie komunikácie sa na I2C používa metóda s detekciou kolízie. Každá zo staníc môže začať vysielanie, ak je predtým zbernica v kľudovom stave. Počas vysielania musia neustále porovnávať vysielané bity sa skutočným stavom SDA. Ak je zistený rozdiel medzi očakávaným a skutočným stavom linky SDA, je to indikácia kolízie medzi niekoľkými stanicami. Vzhľadom k charakteru zbernice (otvorené kolektory) môže k tejto situácii dôjsť, ak určitá stanica vysiela úroveň H, zatiaľ čo iná stanica vysiela úroveň L. Stanica, ktorá na linke zistí úroveň L zatiaľ čo sama vysiela H musí vysielania okamžite ukončiť. K riadeniu komunikácia väčšinou dochádza počas vyslania niekoľkých prvých bitov, kedy je vysielaná adresa prijímacej stanice. Ak by sa napríklad. Dve stanice súčasne pokúsili o zápis do rovnakého obvodu, nastane kolízia až pri prenose vlastných zapisovaných dát. V krajnom prípade, keď viaceré staníc súčasne zapisuje rovnaké dáta na rovnakú adresu, nemusí byť kolízie vôbec detekovaná.
Adresovanie
Každá stanica pripojená na I2C má pridelenú 7 bitovú adresu. Po zachytení podmienky START porovnávajú všetky obvody svoju adresu s adresou, ktorá je vysielaná na zbernici. Ak zistí niektorý z obvodov zhodu, je vysielanie určené práve jemu a musí prijatie adresy potvrdiť bitom ACK. Potom prijíma alebo vysiela ďalšie dáta. Niekoľko adries je na I2C vyhradené pre špeciálne účely. Napríklad adresa 0000000 je určená pre vysielanie broadcast adresy 0000011, 00001XX a 11111XX sú rezervované pre ďalšie účely.
Potvrdzovanie
Každý vysielaný byte a vyslaná adresa je nasledovaná vyslaním jedného bitu ACK. Vysielajúca stanica ho vysiela v úrovni H. Prijímajúca stanica potvrdzuje prijatie tým, že v čase vysielania ACK pripojí SDA na úroveň L. Ak vysielajúca stanica nedostane potvrdenie príjmu, ukončí vysielanie podmienkou STOP.
Odkaz na katalógový list
- popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
- obrázok zapojenia vývodov použitej súčiastky
- odkaz na katalógový list
- priebehy dôležitých signálov
Popis riešenia
Pomocou senzora sme merali veľkosť periódy impulzov. Tieto hodnoty sme následne prepočítali vzhľadom na frekvenciu procesora a preddeličky. Kvôli veľkému šumu sme museli tieto hodnoty ešte spriemerovať, použili sme pritom klasický aritmetický priemer pre 20 meraní. Tieto hodnoty sme v reálnom čase zobrazovali pomocou softvéru SerialChart. Aby sme vedeli zmerať pulznú frekvenciu bolo potrebné vložiť medzi zdroj svetla a senzor prst, kvôli ktorému sa menila intenzita osvetlenia dopadajúca na senzor. Kvôli eliminácií rušivých vplyvov od iných svetelných zdrojov bol senzor zakrytý čiernou plachtou.
Bloková schéma senzora
Schéma zapojenia senzora
Algoritmus a program
Algoritmus je písaný v programovacom jazyku C v programovateľnom prostredí AVR Studio 4. Štruktúra algoritmu je vysvetlená na nižšie uvedenom vývojom diagrame.
Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdio.h>
#include "serial.h"
FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); //Priradenie filu pre vysielanie po sériovej linke
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ); //Priradenie filu pre vysielanie po sériovej linke
int b=0; //deklarovanie premennej b
int i=0; //deklarovanie premennej i
int a=0; //deklarovanie premennej a
volatile unsigned int newTick = 0; //deklarovanie premennej newTick - slúži na zachytenie aktuálnej hodnoty počítadla
volatile unsigned int newTick1 = 0; //deklarovanie premennej newTick1 - slúži na zachytenie aktuálnej hodnoty počítadla
unsigned int vysledok = 0; //deklarovanie premennej výsledok - slúži na vyhodnotenie časového intervalu
unsigned int priemer = 0; //deklarovanie premennej priemer
ISR(TIMER1_CAPT_vect) //funkcia obslužného programu prerušenia od periférie Timer1
{
newTick=ICR1; //uloženie aktuálnej hodnoty zo záchytného registra do premennej newTick
TCNT1=0x0000; //nastavenie registru TCNT1 na hodnotu 0x0000
i=1; //nastavenie premennej i = 1
}
void delay_ms(int ms) //funkcia na vytvorenie čakacej slučky
{
unsigned int index; //vytvorenie premennej index
while (ms) //while slučka, ktorá sa vykoná ms-krát
{
index = 4*799; //while slučka ktorá nerobí nič index-krát
while(index)
{
asm volatile ("nop");
index --;
}
ms--;
}
}
main() //hlavný program
{
DDRB = 0x00; // nastavenie všetkých pinov portu PB ako vstupné
TCCR1B = 0b01000010; // T1 clk = F_CPU : 64, rising edge pin ICP1,
TCCR1A = 0b00000000; // T1 in timer mode !! Note: if You omit this, TCNT1 will be only 8-bit !!
TCNT1 = 0x0000; // inicializácia počítadla (16-bit! Low+High bytes)
TIFR1=0;
inituart(); //inicializácia sériovej linky
stdout = &uart_output;
stdin = &uart_input;
TIMSK1 = 0x20; // nastavenie TIMSK na hodnotu 0x20 -> povolenie Input Capture Interrupt Enable
sei();
while(1) // TODO: display measured value somewhere
{
if (i == 1) //ak bolo vyvolané prerušenie, tak vykonaj nasledovné príkazy vo vnútri podmienky
{
newTick1=(newTick*51)/100; //prepočet hodnoty z newTick na newTick1
i=0; //nastavenie premennej i=0
delay_ms(1); //čakacia slučka 1ms
a=a+1; //inkrementovanie premennej "a"
priemer=priemer+newTick1; //pripočítanie hodnoty newTick1 k premennej priemer
if (a==20) //podmienka, ak je a = 20
{
vysledok=priemer/20; //priemer z 20 nameraných hodnôt
printf("%u\n",vysledok); //vypísanie priemeru
a=0; //vynulovanie premennej"a"
priemer=0; //vynulovanie premennej priemer
}
}
}
}
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
Zdrojový kód: serial.h a main.c
Overenie
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.