CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Calculation of pulse rate

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Guest








Calculation of pulse rate
PostPosted: Tue Jan 19, 2010 11:18 pm     Reply with quote

Code:
for (x=5;x<128;x++)
{
      read1 = read_adc();
      newresult1 = (float)read1;
   if ( newresult1 > max_adc1 )
   {
      max_adc1 = newresult1;
      time1=x   ;

      for (time1;x<128;x++)
         {
               read2 = read_adc();
               newresult2= (float)read2;
         if ( newresult2 > max_adc2 )
            {
               max_adc2 = newresult2;
               time2=x   ;
            }
         else
            total_time = time2 - time1;
            pulse_rate = 60 / total_time;
         }
   }
}

sprintf(String_Buff,pulse_rate);
LCD_Print_String(YELLOW, BLACK, 75, 75,String_Buff);   



Hi, basically I want to calculate the pulse rate between 2 waveform and X is my time domain (between 5 to 128).

Why is it that when I display the value out onto my LCD (nokia6610) , they are in a funny code?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jan 19, 2010 11:33 pm     Reply with quote

Quote:
sprintf(String_Buff, pulse_rate);

You don't have a format string in your sprintf() statement.
Guest








PostPosted: Wed Jan 20, 2010 12:11 am     Reply with quote

Code:
          sprintf(String_Buff, "%d", pulse_rate);


ok thanks alot of on that. but why is it that my value is wrong, is there any errors in my code? i want to get the peaks of every waveform to calculate the pulse rate
Ttelmah
Guest







PostPosted: Wed Jan 20, 2010 4:25 am     Reply with quote

We can't tell.
The problem is that the results at every stage, depend on what values are in variables when you arrive at the code, and on the types of the variables. You show neither....
There are some comments.
Start with 'read1'. This needs to be an int16 or larger, assuming that you have the ADC set to return a 10 bit value. If not, it can bean 8bit integer.
Then you convert the value to a float (the cast is not needed, conversion is automatic when you pass a variable to a larger type).
You then waste a _lot_ of time. It'd be much better for maxadc1, to be an integer of the same type as read1, and to perform the comparison on integers, rather than float values.
Then the question is what you are actually trying to measure.
If you are looking for a 'peak', then your detection needs to be something like:
Code:

   int16 maxadc1=0;
   int16 maxadc2=0;
   int16 temp;
   int x, time1, time2;

   for (x=5;x<128;x++) {
      temp = read_adc();
      if ( temp < max_adc1 ) {
          //If the signal starts to _fall_,the highest point
          //was the last reading
          time1=x-1;
          for (;x<128;x++) {
            temp = read_adc();
            if (temp < max_adc2 ) {
                time2=x-1; //again the 'peak', is one count before the signal
                //falls.
                break;
                }
            else
                //Signal is rising
                maxadc2=temp;
          }
       }
       else
          //signal is rising
          maxadc1=temp;
   }
   total_time = time2 - time1;
   pulse_rate = 60 / total_time;

As you currently work, if the signal is rising, it'll be detected immediately, and drop straight through both tests....

Best Wishes
Guest








PostPosted: Thu Jan 21, 2010 9:38 am     Reply with quote

Ok, thanks for your reply. Somebody suggested to me using a timer to measure the time between the peak intervals instead of using the X - axis. The X axis are actually pixels on my LCD screen.

Code:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
set_timer0(0) ; //this sets timer0 register to 0

   int16 maxadc1=0;
   int16 maxadc2=0;
   int16 temp,time1, time2,total_time, pulse_rate;
   unsigned int x, axis1;

for (x=5;x<128;x++)
{
      temp = read_adc();
   if ( temp > max_adc1 ) // if the new result is higher than the current max adc value, it will overwrite the new result as the max adc. if the new result is smaller, it will go on the find the next peak

   {
      max_adc1 = temp; // overwrite the new result as the new max adc.
   }
   else
                axis1 = x;
      time1=get_timer0(); //this will read the timer0 register value, the time of the 1st peak value.

      for (axis1;x<128;x++) // repeating the same process the get the next peak, after the 1st peak .
         {
               temp = read_adc();
         if ( temp > max_adc2 ) // same as above
            {
               max_adc2 = temp;
            }
         else
            time2=get_timer0(); //this will read the timer0 register value , the time of the 2nd peak value.
            total_time = time2 - time1;
            pulse_rate = 60 / total_time;


Am i correct with my code? if i am wrong, please guide me. Thanks in advance
Guest








PostPosted: Sat Jan 23, 2010 12:11 am     Reply with quote

Can anybody help me with this, why am I unable to get the 2nd timer0 value? I tested it out by setting it to 100, but when I display it on my screen, it states -80.
Code:

for (x=5;x<128;x++)
    {
     temp = read_adc();
     while(max_adc1<(float)temp)
       {
        max_adc1 = temp; // overwrite the new result as the new max adc.
       }

     set_timer0(50);
     axis1 = x;
     time1=get_timer0(); //this will read the timer0 register value, the time of the 1st peak value.
    }

for (axis1;x<128;x++) // repeating the same process the get the next peak, after the 1st peak .
    {
     temp = read_adc();

     while(max_adc2<(float)temp)
       {
        max_adc2 = temp;
       }

    set_timer0(100);
    time2=get_timer0(); //this will read the timer0 register value , the time of the 2nd peak value.
    total_time = time2 - time1;
    pulse_rate = 6000 / total_time;
   }
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group