Operácie

Meranie pulzovej frekvencie.: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
StudentDVPS (diskusia | príspevky)
Riadok 139: Riadok 139:


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
#include <avr/interrupt.h> 
   
#include <avr/io.h>
    printf("Hello, World!\n");
#include <stdio.h>
    return(0);   
#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;                                                                //deklarovenie premennej b
int i=0;                                                                //deklarovenie premennej i
int a=0;                                                                //deklarovenie premennej a
volatile  unsigned int newTick = 0;                    //deklarovenie premennej newTick - slúži na zachytenie aktuálnej hodnoty pocítadla
volatile unsigned int newTick1 = 0;                    //deklarovenie premennej newTick1 - slúži na zachytenie aktuálnej hodnoty pocítadla
unsigned int vysledok = 0;                            //deklarovanie premennej vysledok - slúži na vyhodnotenie casové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 registu TCNT1 na hodnotu 0x0000
  i=1; //nastavenie premennej i = 1
 
}
 
void delay_ms(int ms) //funkcia na vytvorenie cakacej slucky
{
unsigned int index; //vytvorenie premennej index
while (ms) //while slucka, ktorá sa vykoná ms-krát
{
index = 4*799; //while slucka ktorá nerobí nic 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;          // initialize the counter (16-bit! Low+High bytes)
  TIFR1=0; 
                       
  inituart();                                                            //Inicializacia seriovej linky
  stdout = &uart_output;
  stdin = &uart_input;
 
TIMSK1 = 0x20;                // nastavenie TIMSK an hodnotu 0x20 -> povolenie Input Capture Interrupt Enable
  sei(); 
 
  while(1)                         // TODO: display measured value somewhere
  {
  if (i == 1)                                    //ak bol ovyvolané prerušenie, tak vykonaj nasledovné príkazy vo vnútry podmienky
  {
 
  newTick1=(newTick*51)/100;                              //prepocet hodnoty z newTick na newTick1
i=0;                                                    //nastavenie premennej i=0
delay_ms(1);                                            //cakacia slucka 1ms
a=a+1;                                                  //inkrementovanie premennej "a"
priemer=priemer+newTick1;                                //pripocítanie hodnoty newTick1 k premennej priemer
 
if (a==20)                                              //podmienka, ak je a = 20
{
vysledok=priemer/20;                                    //priemer z 20 nameranych hodnot
printf("%u\n",vysledok);                                 //vypisanie priemeru
a=0;                                                    //vynulovanie premennej"a"
priemer=0;                                               //vynulovanie premennej priemer
  }
}
  }  
}
}
</source>
</source>

Verzia z 22:47, 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

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


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;                                                                 //deklarovenie premennej b
int i=0;                                                                 //deklarovenie premennej i
int a=0;                                                                 //deklarovenie premennej a
volatile  unsigned int newTick = 0;                    //deklarovenie premennej newTick - slúži na zachytenie aktuálnej hodnoty pocítadla
volatile unsigned int newTick1 = 0;                    //deklarovenie premennej newTick1 - slúži na zachytenie aktuálnej hodnoty pocítadla
unsigned int vysledok = 0;                             //deklarovanie premennej vysledok - slúži na vyhodnotenie casové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 registu TCNT1 na hodnotu 0x0000
  i=1;									 //nastavenie premennej i = 1
  
}

void delay_ms(int ms)							 //funkcia na vytvorenie cakacej slucky
{
	unsigned int index;						 //vytvorenie premennej index
	
	while (ms)							 //while slucka, ktorá sa vykoná ms-krát
	{
	index = 4*799;							 //while slucka ktorá nerobí nic 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;           						 // initialize the counter (16-bit! Low+High bytes)
  TIFR1=0;  
	                         						
  inituart();                                                            //Inicializacia seriovej linky 
  stdout = &uart_output;
  stdin = &uart_input;

 TIMSK1 = 0x20;                				// nastavenie TIMSK an hodnotu 0x20 -> povolenie Input Capture Interrupt Enable
  sei();  
  
 
  while(1)					                         // TODO: display measured value somewhere
  {
  	if (i == 1)                                     //ak bol ovyvolané prerušenie, tak vykonaj nasledovné príkazy vo vnútry podmienky
  	{
  
  		newTick1=(newTick*51)/100;                               //prepocet hodnoty z newTick na newTick1
		i=0;                                                     //nastavenie premennej i=0
		delay_ms(1);                                             //cakacia slucka 1ms
		a=a+1;                                                   //inkrementovanie premennej "a"
		priemer=priemer+newTick1;                                //pripocítanie hodnoty newTick1 k premennej priemer

		if (a==20)                                               //podmienka, ak je a = 20
		{
		vysledok=priemer/20;                                     //priemer z 20 nameranych hodnot
		printf("%u\n",vysledok);                                 //vypisanie 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

program.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.