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

PIC18F46K20 PWM not working
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PIC18F46K20 PWM not working
PostPosted: Sat Jan 24, 2015 8:57 am     Reply with quote

Hi everyone!
I'm building a speed regulator for a fan on my desk, with a pic and a display.
For the speed, I want to use PWM over a transistor.
So, I built this circuit (ignore the display and all the switch...), and (after testing the display, that works) I tried to figure out how I can do the PWM... I never done that...
5 minutes on google, and I wrote this:
Code:
#include <18F46K20.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)

main()
{

output_low(PIN_C2);   // Set CCP1 output low

setup_ccp1(CCP_PWM);  // Configure CCP1 as a PWM


setup_timer_2(T2_DIV_BY_16, 124, 1);  // 500 Hz     
set_pwm2_duty(62);                    // 50% duty cycle on pin C1

while(1);  // Prevent PIC from going to sleep
}


and the led is not powered...
WHY?
help pls
Ttelmah



Joined: 11 Mar 2010
Posts: 19370

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 9:11 am     Reply with quote

You seem to have some pin confusion.

You are half setting up CCP1, then trying to use CCP2....
You haven't setup CCP2 as a PWM.
Also CCP2, needs to be told which pin it is to use (CCP2C1 fuse).

You need to decide which CCP you are using, and set the right one up.
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 9:27 am     Reply with quote

Ttelmah wrote:
You seem to have some pin confusion.

You are half setting up CCP1, then trying to use CCP2....
You haven't setup CCP2 as a PWM.
Also CCP2, needs to be told which pin it is to use (CCP2C1 fuse).

You need to decide which CCP you are using, and set the right one up.

so, now I've got this:
Code:
#include <18F46K20.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP, CCP2C1,
#use delay(clock = 4000000)

main()
{

output_low(PIN_C1); 

setup_ccp2(CCP_PWM); 

setup_timer_2(T2_DIV_BY_16, 124, 1); 
set_pwm2_duty(62);                   

while(1);
}

and the led still not lighting up...
Ttelmah



Joined: 11 Mar 2010
Posts: 19370

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 9:34 am     Reply with quote

So, have you first verified the chip actually works?.
Flashed an LED just using output_high/output_low?.
MCLR pulled high?.
What current limiting resistor have you got on the LED?.
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 9:37 am     Reply with quote

Ttelmah wrote:
So, have you first verified the chip actually works?.
Flashed an LED just using output_high/output_low?.
MCLR pulled high?.
What current limiting resistor have you got on the LED?.

the lcd works, and if turn on the led with output_high it works.
mclr is pulled up on a 10k resistor, and I removed the resistor on the led.
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 10:01 am     Reply with quote

Code:
#include <18F46K20.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP,
#use delay(clock = 4000000)

main()
{
setup_oscillator(OSC_8MHZ);
output_c(0);
setup_timer_2(T2_DIV_BY_16, 124, 1); 
setup_ccp1(CCP_PWM);
set_pwm1_duty(32);
while(1);
}

THAT WORKS!

now, I have a rotary encoder on the board, for changing the duty... How can I use it?
And, what's the number in "set_pwm1_duty()" for 100% duty?
Ttelmah



Joined: 11 Mar 2010
Posts: 19370

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 10:19 am     Reply with quote

The reason it is failing, is you are overloading the PIC.

No current limiting resistor = PIC port shorted to LED forward voltage max. Result overload. As you turn up the duty, the overload gets bad enough to stop the PIC running.
I wondered if this was what was happening.....

You need to limit the current to the LED to no more than about 20mA max. So if (for instance) you have a LED with a quoted Vf of 2.2v, and are driving from a PIC running off 3.3v, so the pin will want to go up to about 2.6v, you need a resistor of about 20R. The figure needed will depend on the Vf of your LED, and the supply you are using for your chip.

The number for set_pwm_duty, depends whether you feed it with an int16, or an int8. Currently int8, so PR2+1 (125) = 100%. If you feed it with an int16, multiply this by 4, and subtract 1.
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 10:59 am     Reply with quote

Ttelmah wrote:
The reason it is failing, is you are overloading the PIC.

No current limiting resistor = PIC port shorted to LED forward voltage max. Result overload. As you turn up the duty, the overload gets bad enough to stop the PIC running.
I wondered if this was what was happening.....
.


if I set the duty to 125 it works.
I just added "output_c(0); " and it works.
Ttelmah



Joined: 11 Mar 2010
Posts: 19370

View user's profile Send private message

PostPosted: Sat Jan 24, 2015 1:04 pm     Reply with quote

However you are almost certainly overloading the PIC. You need to actually work out what current is driven from the pin in this state. 25mA is the max rating of any pin and there is also a maximum total rating on the chip.
One of the key things in design is to always keep inside _all_ ratings for the chip.
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sun Jan 25, 2015 7:16 am     Reply with quote

on the pwm output I've connected a transistor, and removed the led.
The pwm signal enables the transistor on a 5v line, so I get a 5v pwm signal on the output.
on the program, if I set C2 (pwm) high I should have constant 5v on the output, and that work, but if I hook up an usb fan (5v 500mA, and the power supply is 5v 2A) the voltage drops at 2v and the fan doesn't spin.
why? the transistor is a bc327
Ttelmah



Joined: 11 Mar 2010
Posts: 19370

View user's profile Send private message

PostPosted: Sun Jan 25, 2015 8:31 am     Reply with quote

Post a schematic of what you are doing. Either put a picture up on a site (free or otherwise), and post a link to this, or do an ASCII text schematic.
temtronic



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

View user's profile Send private message

PostPosted: Sun Jan 25, 2015 8:53 am     Reply with quote

Without seeing your schematic this is what I think.....

Had a quick look at the transistor datasheet,,
First it's a PNP device, so a 'high' from the PIC will turn it off. the inverse of what I think you really want..and how the PWM is normally thought of..

2nd, at 500ma Ic, hfe is about 40, so you need +-12ma of current from the PIC to drive the fan (500ma). Might be possible, though I doubt it..... PIC will 'overload' try to 'selfprotect'( ie...fail...)

Normally these days you use a 'logic level FET' to drive fans. PIC I/O pin to gate, FET source to ground, drain tied to fan -ve, fan+ to +5V.


You should 'breadboard' the 'fan drive circuit' without a PIC , just use 0 and +5 as the 'control' input. Measure currents/voltages, etc. to see how it works.


Jay
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sun Jan 25, 2015 9:35 am     Reply with quote

Ttelmah wrote:
Post a schematic of what you are doing. Either put a picture up on a site (free or otherwise), and post a link to this, or do an ASCII text schematic.

https://dl.dropboxusercontent.com/u/53376851/Immagini/schema_PWM.PNG
Ellest96



Joined: 15 Nov 2013
Posts: 17

View user's profile Send private message

PostPosted: Sun Jan 25, 2015 9:58 am     Reply with quote

temtronic wrote:

Normally these days you use a 'logic level FET' to drive fans. PIC I/O pin to gate, FET source to ground, drain tied to fan -ve, fan+ to +5V.


I know, but I don't have one of them, can I use a transistor?
temtronic



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

View user's profile Send private message

PostPosted: Sun Jan 25, 2015 10:47 am     Reply with quote

Yes BUT you MUST use a resistor to connect PIC to base of transistor !!
I'd suggest a 470r or 1K to start.
Typically you use an NPN transistor, with emitter connected to ground, 1K resistor from base to PIC I/O pin, collector to fan -ve lead, fan +ve lead to +5 volts.
This is all basic Electronics101 , tons of info on the web, be sure to get/read the datasheet for the NPN transistor you've chosen.

NOTE!!! I had a look at your schematic.
NOTE!!!! The 2N706 will NOT work for you!!! It is only rated for 50ma of collector current. Your fan needs 500 ma. You'll need to choose another transistor. It should be 'ok' for the backlight LED drive but NEEDS a base resistor(say 470r ).


hth
jay
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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