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

Reading the tacho values in PIC18F47Q43

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Guru Narasimha V S



Joined: 05 Aug 2022
Posts: 5

View user's profile Send private message

Reading the tacho values in PIC18F47Q43
PostPosted: Wed Aug 24, 2022 1:17 am     Reply with quote

Hello,
I am using PIC18F47Q43 for generating the 4 PWM signals.
The clock used is 32Mhz.
I had used 3 CCP modules and PWM slicing.
I have used timer 2 for generating PWM's.
I have referred this from the forum : https://www.ccsinfo.com/forum/viewtopic.php?t=59832
The fan which is connected has tacho pins. I have connected the tacho pins to PIN_B0, PIN_B1, PIN_B2 and PIN_D7.

I could not get how to read the pulses from the those pins.
And how to calculate the rpm of the FAN.
According to datasheet the MAX RPM of the FAN is 2000.

It would be really helpful if I get this issue solved.
Need to know how to read the pulses from those 4 pins.
Ttelmah



Joined: 11 Mar 2010
Posts: 19561

View user's profile Send private message

PostPosted: Wed Aug 24, 2022 5:29 am     Reply with quote

You read a tacho by just timing the period between the pulses. So if
the two rising edges are 60mSec apart, then (assuming the unit gives
one pulse per rev), the unit is doing 1000RPM

60/period -> revs

60/0.06 = 1000

Now the easiest tool to read the period with is one of the CCP's.

Your big problem is just that you are using all your CCP's. Don't. Save
one by using the second slice on the sliced PWM, so you have a CCP left
to use for the tacho.
Then assuming you don't need to measure all the speeds all the time,
take advantage of PPS, and route the first input to this CCP. Wait for two
triggers, so the time is then 'genuine', and read the count. Reciprocate
this and you have the revs. You can save maths, by having a constant
giving how many clocks should occur in 60 seconds, and just dividing this
by the count. You then attach your second input, (by reselecting the
PPS), and repeat the measurement for this. Then the third, then the fourth.
Onviously the fuses have to b set to allow multiple PPS settings
(NOPPS1WAY), and use the inline PPS setting (read the sticky about
this at the top of the forum).
Guru Narasimha V S



Joined: 05 Aug 2022
Posts: 5

View user's profile Send private message

PostPosted: Sat Aug 27, 2022 12:39 am     Reply with quote

Hi Ttelmah, Thank you for the reply.
I was able to free the ccp modules and tried to capture it.
I got confused how to implement the timers for 60ms.
With the help of the example program I captured in CCP module.

Here is the code which I implemented:
Code:


long rise,fall,pulse_width;
#fuses  NOPPS1WAY

#pin_select CCP3  = PIN_B0

#int_ccp3
void isr()
{
   rise = get_capture(1);
   fall = get_capture(3);
   pulse_width = fall - rise;     



void main()
{
 
   setup_ccp1(CCP_CAPTURE_RE);    // Configure CCP1 to capture rise
   setup_ccp3(CCP_CAPTURE_FE);    // Configure CCP2 to capture fall
   setup_timer_1(T1_INTERNAL| T1_DIV_BY_8);    // Start timer 1

   enable_interrupts(INT_CCP3);   // Setup interrupt on falling edge
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      // printed the value obtained from the capture
   }
}


But the values were too fluctating . I could not get how to reselect the pps.
Could please let me know to how go further with it.
Ttelmah



Joined: 11 Mar 2010
Posts: 19561

View user's profile Send private message

PostPosted: Sat Aug 27, 2022 1:04 am     Reply with quote

You only need one CCP.

You have to ignore the value on the first interrupt (since the value
then will be 'from' when the reading started), then take a reading at the
second interrupt. Then take a third reading at the third interrupt.
The time is then the third reading minus the second to get the time
between the interrupts.
You want the time between too successive rising edges. Not the rising and
falling.
The pulse frequency is what you are after, not the pulse width.
Guru Narasimha V S



Joined: 05 Aug 2022
Posts: 5

View user's profile Send private message

PostPosted: Thu Sep 01, 2022 2:10 am     Reply with quote

Hi Ttelmah,
Sorry for the late reply as there was problem with my machine.

I tried to incorporate the things by setting 1 CCP and reading the data after 1 first interrupt.

Code:


#fuses  NOPPS1WAY

#pin_select CCP1  = PIN_B0


int counter =0 ;
#int_ccp1
void ccp1_isr()
{   
   counter++;

   if(counter == 2)
   {
         FirstCapture = get_capture(1);
   }
   if(counter == 3)
   {
         SecondCapture = get_capture(1);
         pulse_frequency = FirstCapture - SecondCapture;
         counter = 1;
   }
}


void main()
{
 
   setup_ccp1(CCP_CAPTURE_RE);    // Configure CCP1 to capture rise
   setup_timer_1(T1_INTERNAL| T1_DIV_BY_8);    // Start timer 1

   enable_interrupts(INT_CCP1);   // Setup interrupt on falling edge
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      // printed the value obtained from the capture
   }
}

The values keeps on fluctuating as earlier.
but when the fans are off the values keeps a constant recent value.

I am not getting where its going wrong. Could you please help me through it.
Ttelmah



Joined: 11 Mar 2010
Posts: 19561

View user's profile Send private message

PostPosted: Thu Sep 01, 2022 5:36 am     Reply with quote

Understand that the full count will be a large number, and will fluctuate at the
least significant digits. You are clocking off 1MHz (32MHz/4 /8).
Now if the thing is doing perhaps 1000RPM, a typical count will be perhaps
60000. You should set your timer up to maintain a LSB count (incrementing
when the timer wraps), and be including this in your count. I'd expect the
count to be fluctuating by several tens of counts, since motors are not
that stable. However if you include the extra bits from the potential wrap,
and then perform the division so:

RPM = 60000000/count

You should probably see a value fluctuating by only a couple of RPM.

You will need to handle the timer wrap, since otherwise at this count rate
you won't be able to handle anything below about 1000RPM without the
timer overflowing (915RPM will be where a wrap _will_ occur).
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Sep 01, 2022 12:24 pm     Reply with quote

Couldn't he temporarily reduce his CPU clock speed to 16 MHz ?
This would clock Timer1 at half the speed, so he wouldn't have Timer1
potentially overflowing. Then he could ignore the overflow problem
at least for now.
Ttelmah



Joined: 11 Mar 2010
Posts: 19561

View user's profile Send private message

PostPosted: Thu Sep 01, 2022 10:28 pm     Reply with quote

Yes, but he needs to handle the wrap, or it won't work when the motor
is starting etc..
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