질문게시판 > 아두이노 소스 avr변환 질문입니다..

TODAY873 TOTAL2,160,884
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 아두이노 소스 avr변환 질문입니다..

페이지 정보

작성자 묵묵 작성일2018-01-16 13:04 조회55,066회 댓글7건

본문

	
질문 : 현재 atmega128, avr studio4를 이용하요 심박센서를 가지고 심박측정을 할려고 하는데 해당 센서 제품에 아두이노 예제 소스가 있는데 avr로 변환하는게 너무 어렵습니다... 도움좀 부탁드리겠습니다,,,
소스 설명이있는 페이지 입니다. 해당 자료를 다 한글로 번역해서 어떤 방식인지는 이해가 되는데 변환이 잘 안되네요... https://pulsesensor.com/pages/pulse-sensor-amped-arduino-v1dot1
제가 아무리 해봐도 계속 안되서 도움 좀 부탁드리겠습니다...

/*
>> Pulse Sensor Amped 1.1 <<
This code is for Pulse Sensor Amped by Joel Murphy and Yury Gitman
    www.pulsesensor.com
    >>> Pulse Sensor purple wire goes to Analog Pin 0 <<<
Pulse Sensor sample aquisition and processing happens in the background via Timer 2 interrupt. 2mS sample rate.
PWM on pins 3 and 11 will not work when using this code, because we are using Timer 2!
The following variables are automatically updated:
Signal :    int that holds the analog signal data straight from the sensor. updated every 2mS.
IBI  :      int that holds the time interval between beats. 2mS resolution.
BPM  :      int that holds the heart rate value, derived every beat, from averaging previous 10 IBI values.
QS  :       boolean that is made true whenever Pulse is found and BPM is updated. User must reset.
Pulse :     boolean that is true when a heartbeat is sensed then false in time with pin13 LED going out.
This code is designed with output serial data to Processing sketch "PulseSensorAmped_Processing-xx"
The Processing sketch is a simple data visualizer.
All the work to find the heartbeat and determine the heartrate happens in the code below.
Pin 13 LED will blink with heartbeat.
If you want to use pin 13 for something else, adjust the interrupt handler
It will also fade an LED on pin fadePin with every beat. Put an LED and series resistor from fadePin to GND.
Check here for detailed code walkthrough:
http://pulsesensor.myshopify.com/pages/pulse-sensor-amped-arduino-v1dot1
Code Version 02 by Joel Murphy & Yury Gitman  Fall 2012
This update changes the HRV variable name to IBI, which stands for Inter-Beat Interval, for clarity.
Switched the interrupt to Timer2.  500Hz sample rate, 2mS resolution IBI value.
Fade LED pin moved to pin 5 (use of Timer2 disables PWM on pins 3 & 11).
Tidied up inefficiencies since the last version.
*/

//  VARIABLES
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin

// these variables are volatile because they are used during the interrupt service routine!
volatile int BPM;                   // used to hold the pulse rate
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // holds the time between beats, the Inter-Beat Interval
volatile boolean Pulse = false;     // true when pulse wave is high, false when it's low
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS
   // UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
   // AND APPLY THAT VOLTAGE TO THE A-REF PIN
   //analogReference(EXTERNAL);  
}

void loop(){
  sendDataToProcessing('S', Signal);     // send Processing the raw Pulse Sensor data
  if (QS == true){                       // Quantified Self flag is true when arduino finds a heartbeat
        fadeRate = 255;                  // Set 'fadeRate' Variable to 255 to fade LED with pulse
        sendDataToProcessing('B',BPM);   // send heart rate with a 'B' prefix
        sendDataToProcessing('Q',IBI);   // send time between beats with a 'Q' prefix
        QS = false;                      // reset the Quantified Self flag for next time   
     }
 
  ledFadeToBeat();
 
  delay(20);                             //  take a break
}


/////////////////////////////////////////interrupt 부문

volatile int rate[10];                    // used to hold last ten IBI values
volatile unsigned long sampleCounter = 0;          // used to determine pulse timing
volatile unsigned long lastBeatTime = 0;           // used to find the inter beat interval
volatile int P =512;                      // used to find peak in pulse wave
volatile int T = 512;                     // used to find trough in pulse wave
volatile int thresh = 512;                // used to find instant moment of heart beat
volatile int amp = 100;                   // used to hold amplitude of pulse waveform
volatile boolean firstBeat = true;        // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = true;       // used to seed rate array so we startup with reasonable BPM

void interruptSetup(){    
  // Initializes Timer2 to throw an interrupt every 2mS.
  TCCR2A = 0x02;     // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
  TCCR2B = 0x06;     // DON'T FORCE COMPARE, 256 PRESCALER
  OCR2A = 0X7C;      // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
  TIMSK2 = 0x02;     // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
  sei();             // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED     
}

// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
// Timer 2 makes sure that we take a reading every 2 miliseconds
ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124
    cli();                                      // disable interrupts while we do this
    Signal = analogRead(pulsePin);              // read the Pulse Sensor
    sampleCounter += 2;                         // keep track of the time in mS with this variable
    int N = sampleCounter - lastBeatTime;       // monitor the time since the last beat to avoid noise
//  find the peak and trough of the pulse wave
    if(Signal < thresh && N > (IBI/5)*3){       // avoid dichrotic noise by waiting 3/5 of last IBI
        if (Signal < T){                        // T is the trough
            T = Signal;                         // keep track of lowest point in pulse wave
         }
       }
     
    if(Signal > thresh && Signal > P){          // thresh condition helps avoid noise
        P = Signal;                             // P is the peak
       }                                        // keep track of highest point in pulse wave
   
  //  NOW IT'S TIME TO LOOK FOR THE HEART BEAT
  // signal surges up in value every time there is a pulse
if (N > 250){                                   // avoid high frequency noise
  if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){       
    Pulse = true;                               // set the Pulse flag when we think there is a pulse
    digitalWrite(blinkPin,HIGH);                // turn on pin 13 LED
    IBI = sampleCounter - lastBeatTime;         // measure time between beats in mS
    lastBeatTime = sampleCounter;               // keep track of time for next pulse
        
         if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
             firstBeat = false;                 // clear firstBeat flag
             return;                            // IBI value is unreliable so discard it
            }  
         if(secondBeat){                        // if this is the second beat, if secondBeat == TRUE
            secondBeat = false;                 // clear secondBeat flag
               for(int i=0; i<=9; i++){         // seed the running total to get a realisitic BPM at startup
                    rate[i] = IBI;                     
                    }
            }
         
    // keep a running total of the last 10 IBI values
    word runningTotal = 0;                   // clear the runningTotal variable   
    for(int i=0; i<=8; i++){                // shift data in the rate array
          rate[i] = rate[i+1];              // and drop the oldest IBI value
          runningTotal += rate[i];          // add up the 9 oldest IBI values
        }
       
    rate[9] = IBI;                          // add the latest IBI to the rate array
    runningTotal += rate[9];                // add the latest IBI to runningTotal
    runningTotal /= 10;                     // average the last 10 IBI values
    BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!
    QS = true;                              // set Quantified Self flag
    // QS FLAG IS NOT CLEARED INSIDE THIS ISR
    }                      
}
  if (Signal < thresh && Pulse == true){     // when the values are going down, the beat is over
      digitalWrite(blinkPin,LOW);            // turn off pin 13 LED
      Pulse = false;                         // reset the Pulse flag so we can do it again
      amp = P - T;                           // get amplitude of the pulse wave
      thresh = amp/2 + T;                    // set thresh at 50% of the amplitude
      P = thresh;                            // reset these for next time
      T = thresh;
     }
 
  if (N > 2500){                             // if 2.5 seconds go by without a beat
      thresh = 512;                          // set thresh default
      P = 512;                               // set P default
      T = 512;                               // set T default
      lastBeatTime = sampleCounter;          // bring the lastBeatTime up to date       
      firstBeat = true;                      // set these to avoid noise
      secondBeat = true;                     // when we get the heartbeat back
     }
 
  sei();                                     // enable interrupts when youre done!
}// end isr

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 7

조회수 55,066

묵묵님의 댓글

묵묵 작성일

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL // 16 MHz

void Putch0(char data)
{
 while(!(UCSR1A & 0x20));
 UDR1 = data;
}

char Getch0(void)
{
 while(!(UCSR1A & 0x80));
 return UDR1;
}


volatile unsigned int adc_result=0;

volatile unsigned int read_adc(void)
{

ADMUX=0b01000000; //ADC0번 사용
ADCSRA=0b11000111; //AD 변환 인터럽트 disable
while((ADCSRA & 0x10)==0x00); //AD변환 레지스터 값 갱신되면 셋
ADCSRA=0b10000111;
return ADC;

}

int main(void)
{

 DDRA=0xFF;
 PORTA=0x00;

 UCSR1A = 0x00;
 UCSR1B = 0b00011000;
 UCSR1C = 0b00000110;
 UBRR1H = 0;
 UBRR1L = 8;

 DDRF = 0x00;

 sei();

 FILE *fp;
 fp = fdevopen(Putch0, Getch0);

 while(1)
 {

adc_result=read_adc();
printf("\n\r ADC Data=%d ", adc_result);


 }
}
//제가 adc값을 usart통신 한 소스입니다. 이 소스와 위에 올린 소스를 연동할려고 합니다.

master님의 댓글

master 작성일

심박 센서의 아나로그 출력 파형을 PC의 시리얼 모니터 프로그램으로 출력하려는 건가요?

묵묵님의 댓글

묵묵 작성일

바로 위에 답글에 단 소스는 심박센서의 ADC 값을 하이퍼터미널에 띄운 소스입니다.
제가 하려는것은 BPM계산 값을  usart를 통해 하이퍼터미널에 띄우는것,  clcd에 띄우는 것, 따로따로해서 2가지 모두 해볼 예정입니다.
현재는 usart를 통해 심박수를 하이퍼 터미널에 띄우는거 먼저 하려 합니다.

master님의 댓글

master 댓글의 댓글 작성일

BPM을 출력하려는 것이 목적이군요
아래 답글에는 하이퍼 터미널에 아나로그 값을 출력하도록 작성되어 있습니다.

master님의 댓글

master 작성일

아래 두번째 답글의 예제 참고해서 만들어보세요

묵묵님의 댓글

묵묵 작성일

이 센서의 불안정함을 잡기위해서 저위에 아두이노 예제 소스를 avr studio4로 해석을 해야할거 같은데,,,,도움좀 주실 수 있나요,,?

master님의 댓글

master 댓글의 댓글 작성일

아래 답변3에서 아두이노 라이브러리 설명을 적어 놓았으니 참고하세요

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 9622
공지 사이트 이용 안내댓글[24] master 17-10-29 29601
질문 atmega128 서보모터와 초음파센서댓글[4] 새글 tmiae 12:53 7
질문 avr compiler 종류 질문입니다!댓글[3] 새글 민준싸 01:16 21
질문 컴퓨터 usb연결시 정상 작동하나 9V건전지 외부전원 연결 시 작동하지 않는 문제댓글[3] 이미지새글첨부파일 보겐을운용 22-05-19 77
질문 아두이노 dac 연결댓글[3] 이미지새글첨부파일 kodory 22-05-19 24
질문 아두이노 millis ->atmega128에서 사용하고 싶습니다. 새글 akmong413 22-05-19 23
답변 답변글 답변 : 아두이노 millis ->atmega128에서 사용하고 싶습니다. 새글 master 22-05-19 26
질문 아트메가 모터드라이브와 초음파 센서 연동 질문입니다댓글[1] 새글 123424135123q 22-05-19 25
질문 스텝모터 드라이버 선정 질문드립니다. 새글 아흐흑 22-05-18 26
답변 답변글 답변 : 스텝모터 드라이버 선정 질문드립니다.댓글[1] 이미지새글 master 22-05-19 22
질문 아두이노로 모터+드라이버 제어댓글[6] 새글 모토 22-05-18 40
질문 온도센서로 서보모터 제어 코딩댓글[1] 새글 진수네1조 22-05-18 43
질문 라즈베리파이 웹캠 데이터 아두이노 전송 (초보)댓글[1] 전자과 22-05-17 45
질문 아두이노 코딩 도와주세요 (초음파센서와 금속감지센서로 서보모터 제어하기) 이현주 22-05-17 72
답변 답변글 답변 : 아두이노 코딩 도와주세요 (초음파센서와 금속감지센서로 서보모터 제어하기) master 22-05-18 121
질문 아두이노 우노 2개와 앱인벤터끼리의 블루투스 통신 방법댓글[3] 이미지첨부파일 pyoleo 22-05-17 92
질문 졸업작품 첨부파일 ejdog 22-05-16 87
질문 PCB의 커넥터 연결관련 이슈같은데.. 원인을 정확히 모르겠습니다.댓글[2] 이미지 설계못해서개털림 22-05-16 72
질문 STM32F767 사용중인데 발열이 발생합니다.댓글[5] 존클라프 22-05-16 69
질문 리니어 레일 거리 조절댓글[1] 면수 22-05-16 59
질문 아두이노 심전도 센서 BPM 계산댓글[3] 쥬쥬 22-05-16 82
질문 아두이노 서로 다른 전압을 가진 부품 제어 이미지 chovo 22-05-16 54
질문 앱인벤터 질문입니다.댓글[2] 이미지 귀끠우유 22-05-16 66
질문 아두이노 우노끼리 블루투스 통신댓글[1] 첨부파일 pyoleo 22-05-16 70
질문 마이크로 받은 입력을 주파수로 변경댓글[3] 생늧판출 22-05-16 44
질문 while문 안 if문 빠져나오는 방법 kyho3855 22-05-15 39
답변 답변글 답변 : while문 안 if문 빠져나오는 방법댓글[1] master 22-05-16 47
질문 초음파센서로 속도구하기(코드 합치는법) 쥰니 22-05-15 70
답변 답변글 답변 : 초음파센서로 속도구하기(코드 합치는법)댓글[1] master 22-05-16 69
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기