Meranie pulzovej frekvencie.

Z SensorWiki
Prejsť na: navigácia, hľadanie


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.

Parallax TSL235.jpgPulseMeter.jpg



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.

AcrobBoard.jpg


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:

Piny TSL235.png


Popis pinov senzora TSL235:

Popis pinov TSL235.png


Charakteristiky senzora TSL235

Charakteristiky TSL235.png

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

Časovy diagram.png

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:

Datasheet TSL235

  • 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

Blok.schema.png


Schéma zapojenia senzora

Zapojenie senzora.JPG


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.

Vyvojovy diagram pulz.jpg


#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
  		}
	}
  }  
}


Zdrojový kód: serial.h a serial.c

program.c

Overenie

Návod:

Overenie nášho programu sme vykonali pre tri rôzne stavy t.j kľudový stav, stav po záťaži a stav v odpočinku. Zariadenie funguje hneď pri pripojení napájacieho napätia. Nato aby sme vedeli zobraziť graf pulznej frekvencie potrebujeme spustiť program SerialChart, ktorý je voľne dostupný. Meranie sa spustí stlačením zeleného tlačidla (play). Poznámka: Ak by vykresľovanie grafu nefungovalo, je potrebné nastaviť správny rozsah zobrazovacej časti grafu na pravej strane okna programu. Po znovu spustení merania sa automaticky začína vykresľovať krivka pulznej frekvencie.

Výsledky merania:

1.Meranie - kľudový stav:

Pri tomto meraní bola osoba v kľude. Dĺžka merania bola 20 sekúnd, za tento čas si osoba namerala 19 pulzov čo je rovnaký počet pulzov koľko zaznamenal aj graf pri meraní.Z toho vyplýva že osoba mala pulz 57 úderov/min.

20 kludovy stav.png
20 kludovy stav osc.jpg


2.Meranie - stav po záťaži:

Pri tomto meraní bola osoba podrobená meraniu ihneď po fyzickej záťaži(beh, drepy atď). Dĺžka merania bola 20 sekúnd, za tento čas si osoba namerala 41 pulzov čo je rovnaký počet pulzov koľko zaznamenal aj graf pri meraní.Z toho vyplýva že osoba mala pulz 123 úderov/min.

20 zataž.png
]
20 zataž osc.jpg


3.Meranie - stav v odpočinku:

Pri tomto meraní bola osoba podrobená meraniu tri minúty po fyzickej záťaži(beh, drepy atď). Dĺžka merania bola 20 sekúnd, za tento čas si osoba namerala 33 pulzov čo je rovnaký počet pulzov koľko zaznamenal aj graf pri meraní.Z toho vyplýva že osoba mala pulz 99 úderov/min.

20 oddych.png
]
20 oddych osc.jpg