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 support@ccsinfo.com

How to read duty cycle with PIC ?

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



Joined: 16 Jun 2010
Posts: 31

View user's profile Send private message

How to read duty cycle with PIC ?
PostPosted: Sun Jun 03, 2012 2:51 am     Reply with quote

I want to read duty cycle with PIC. I try to use frequency counter code to read duty cycle but I don't know how to use it. This is my code
Is this true or false to read and calculate duty cycle.

Code:
#include <16F648A.h>
#use delay(clock=4000000)
#fuses XT,PUT,BROWNOUT,MCLR,NOWDT,NOPROTECT,NOLVP
#define  TxD         PIN_B2   
#define  RxD         PIN_B1   
#use rs232(baud=9600, xmit=TxD,rcv=RxD)

float time1,time2;
BOOLEAN hook_cpp1, HookRise;

#int_ccp1
void capture_isr()
{
   if(HookRise)
   {
    time1 = get_timer1();
    HookRise = FALSE;
    printf("X");
   }
   else
   {
    time2 = get_timer1();
    HookRise = TRUE;
    hook_cpp1 = FALSE;                          //done
    printf("Y\r\n");
   }
}
void InitialChip(void)
{
   setup_comparator(NC_NC_NC_NC);               //Input Digital
   set_tris_a(0B11111110);
   set_tris_b(0B11111111);
}

float T;
void main(void)
{
   InitialChip();
   printf("Frequency Counter\r\n");
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      // Setup timer 1

   while(1)
   {
      HookRise=TRUE;
      hook_cpp1=TRUE;
      printf("Frequency Counter\r\n");
      setup_ccp1(CCP_CAPTURE_RE);
      enable_interrupts(INT_CCP1);              // Enable interrupt CCP1
      enable_interrupts(GLOBAL);                // All interrupts ON

      set_timer1(0);
      while(hook_cpp1==TRUE);
     
      setup_ccp1(CCP_OFF);
      disable_interrupts (GLOBAL);
       
      T = (time2-time1)*8*1000*0.000000001;;                // Td=cycle*(4/fosc)*PR
      printf("Time1 = %f\r\n",time1);
      printf("Time2 = %f\r\n",time2);
      printf("Time = %f\r\n",time2-time1);
      float t_all;
      t_all = time1/(time1+time2);
      printf("t_all = %f\r\n",t_all);
      //printf("Duty cycle = %f\r\n",time1/(time1+time2));
      printf("Frequency:%f Hz   %9.3e ms\r\n",1/T,T);
 
 delay_ms(500);
   }

}


The results of this code is.

Quote:

time1 = 73.00
time2 = 198.00
time2-time1 = 125.00
time1/(time1+time2) = 0.26
Frequency:1000.00 Hz 9.999E-04 ms

time1 = 78.00
time2 = 203.00
time2-time1 = 125.00
time1/(time1+time2) = 0.27
Frequency:1000.00 Hz 9.999E-04 ms


How to read duty cycle?
temtronic



Joined: 01 Jul 2010
Posts: 9174
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Jun 03, 2012 5:28 am     Reply with quote

hmm... you could just grab the example that CCS supplies in the examples folder.....
or...
search the 'code library' or this forum for 'measuring pulse width' for complete code
Ttelmah



Joined: 11 Mar 2010
Posts: 19369

View user's profile Send private message

PostPosted: Sun Jun 03, 2012 7:11 am     Reply with quote

And, as a comment, you have 'no hope', with the printf's there. Even if the UART buffer is empty, over 1mSec 'jammed' in the interrupt handler in the second case, waiting for the data to send. Invalidates everything.
As it stands though, the interrupt is always triggering on the rising edges, so all you are measuring is subsequent rising edge times, not the pulse width/duty cycle...

Best Wishes
mmc01



Joined: 16 Jun 2010
Posts: 31

View user's profile Send private message

PostPosted: Fri Jun 08, 2012 1:11 am     Reply with quote

temtronic wrote:
hmm... you could just grab the example that CCS supplies in the examples folder.....
or...
search the 'code library' or this forum for 'measuring pulse width' for complete code


Thanks... Idea
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