View previous topic :: View next topic |
Author |
Message |
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
PWM generation using PIC 16F877A MCU |
Posted: Mon Mar 31, 2014 11:21 am |
|
|
Hey,
I wanted to trigger four mosfet to create a DC-DC converter circuit. The pulses must be 10 micro seconds apart and the frequency must be 50Khz. However, when i tried it showed only around 42Khz in the proteus simulation. I have programmed it in such a way as to draw four PWM sgnals from the pins 19 to 22. Please suggest any way to make the PWM osciilate at 50Khz with 50% duty cycle. I am attaching the code:
Code: |
#if defined(__PCB__)
#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#elif defined(__PCM__)
#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
void main()
{
while(1)
{
output_d(0x55);
delay_us(10);
output_d(0x00);
delay_us(2);
output_d(0xaa);
delay_us(10);
output_d(0x00);
delay_us(2);
}
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Mon Mar 31, 2014 12:52 pm |
|
|
You have to understand that everything takes time.
The output instructions themselves take several instructions (4). The jump back to the start of the loop takes a couple of instruction times(3). Result, the loop time will be longer than your delays.
It is possible to do what you want by shortening the delays (use 'delay_cycles', rather than delay_us), but as soon as your code wants to do anything else, times will vary again. Each delay_cycle, takes 0.2uSec. |
|
|
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
|
Posted: Mon Mar 31, 2014 1:03 pm |
|
|
Ttelmah wrote: | You have to understand that everything takes time.
The output instructions themselves take several instructions (4). The jump back to the start of the loop takes a couple of instruction times(3). Result, the loop time will be longer than your delays.
It is possible to do what you want by shortening the delays (use 'delay_cycles', rather than delay_us), but as soon as your code wants to do anything else, times will vary again. Each delay_cycle, takes 0.2uSec. |
Thank you for your reply, now i can change the switching frequency to the desired value. However, how could i vary the duty cycle of the pulse too ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Mon Mar 31, 2014 1:19 pm |
|
|
I've already told you what to do. Use delay_cycles. Multiply the times you want by 5. Subtract the times for the instructions you want between the delays. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Mon Mar 31, 2014 2:27 pm |
|
|
Your chosen PIC has a hardware PWM generator. You could use that instead of messing about with delays.
Once set the PWM continues to run whilst main() does something else.
It's all in the manuals and example code library.
Mike
PS Throw Proteus/ISIS away, use real hardware. |
|
|
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
|
Posted: Mon Mar 31, 2014 9:55 pm |
|
|
Hi,
I am not sure about the PWM module built in or how to use the delay_cycle() to reach the desired freq,since this is my first attempt at PIC programming and i am really running short of time .Could you tell me how to achieve the required pulses freq and duty cycle by modifying the delay_us() function from the existing code |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Tue Apr 01, 2014 12:22 am |
|
|
I'll give you one example:
Code: |
output_d(0x55);
delay_us(10);
//Will take 10.8uSec (since the output takes 4 machine cycles)
//Each machine cycle is 4 clock cycles = 0.2uSec
//delay_cycles counts in machine cycles
output_d(0x55);
delay_cycles(46);
//will now take 10uSec, since the delay is now 4 cycles shorter
|
Remember that the last delay before the loop, has to correct both for the output time, and the loop time.
The point about the PWM, is that it will generate accurate timings, even if the processor is doing other things. In your case if you start adding code, to change pulse widths etc., then the loop times will go completely wrong.... |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Tue Apr 01, 2014 4:50 am |
|
|
thebenman wrote: | Hi,
I am not sure about the PWM module built in ............
| The CCS example EX_PWM.C even shows how to use the module for an '877!!!!
Mike |
|
|
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
|
Posted: Tue Apr 01, 2014 8:05 am |
|
|
Mike Walne wrote: | thebenman wrote: | Hi,
I am not sure about the PWM module built in ............
| The CCS example EX_PWM.C even shows how to use the module for an '877!!!!
Mike |
I did look into that example code. However, my circuit is designed to draw the PWM pulses from the pin 19 to 26 to drive the eight mosfets. When i use the CCP module i get the output only from CCP1 and CCP2 pins of the PIC MCU. |
|
|
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
|
Posted: Tue Apr 01, 2014 8:10 am |
|
|
Ttelmah wrote: | I'll give you one example:
Code: |
output_d(0x55);
delay_us(10);
//Will take 10.8uSec (since the output takes 4 machine cycles)
//Each machine cycle is 4 clock cycles = 0.2uSec
//delay_cycles counts in machine cycles
output_d(0x55);
delay_cycles(46);
//will now take 10uSec, since the delay is now 4 cycles shorter
|
Remember that the last delay before the loop, has to correct both for the output time, and the loop time.
The point about the PWM, is that it will generate accurate timings, even if the processor is doing other things. In your case if you start adding code, to change pulse widths etc., then the loop times will go completely wrong.... |
Thanks for the example, it certainly made it easier. Just to be sure if i needed a delay of 2 microseconds then i would have to use delay_cycles(6). 0.8 micro seconds for the output_d instruction and the rest from delay_cycles(6)....Am i correct ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Tue Apr 01, 2014 8:56 am |
|
|
Yes.
However I'd have to say since you are turning half the MOSFETs all on at once, why not just drive them all from the CCP pins.
Remember that if this is a power switching circuit, logic outputs on the PIC are not suitable to directly drive MOSFETs. The typical gate capacitance of a power MOSFET, is over 1000pF. As such they need significant current to switch them quickly. This is why MOSFET driver IC's have 'instantaneous' ratings like 1.5A. The slow switching you will get directly driving from a PIC, doesn't matter terribly at a low frequency like a couple of KHz, but at 50KHz, losses will shoot up.... |
|
|
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
|
Posted: Tue Apr 01, 2014 9:17 am |
|
|
Ttelmah wrote: | Yes.
However I'd have to say since you are turning half the MOSFETs all on at once, why not just drive them all from the CCP pins.
Remember that if this is a power switching circuit, logic outputs on the PIC are not suitable to directly drive MOSFETs. The typical gate capacitance of a power MOSFET, is over 1000pF. As such they need significant current to switch them quickly. This is why MOSFET driver IC's have 'instantaneous' ratings like 1.5A. The slow switching you will get directly driving from a PIC, doesn't matter terribly at a low frequency like a couple of KHz, but at 50KHz, losses will shoot up.... |
I do not drive the MOS Gate from the PIC output directly, i use a optocoupler IC MCT2e. Wish i could attach the schematic but i don't see such a opinion here...btw is there such an option ? Anyway i was wondering if it would be possible to drive any number of MOSFET from a single CCP1 pin of the PIC ? unlike what i have done here |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Tue Apr 01, 2014 10:16 am |
|
|
thebenman wrote: |
I do not drive the MOS Gate from the PIC output directly, i use a optocoupler IC MCT2e. Wish i could attach the schematic but i don't see such a opinion here...btw is there such an option ? Anyway i was wondering if it would be possible to drive any number of MOSFET from a single CCP1 pin of the PIC ? unlike what i have done here |
You've only just got round to telling us you're driving a power circuit.
Would you care to provide more detail so we don't have to second guess exactly what you're doing.
(Simple ASCII art will suffice.)
Also, in what way will you eventually be wanting to modulate the PWM?
Mike |
|
|
thebenman
Joined: 31 Mar 2014 Posts: 9 Location: India
|
|
Posted: Tue Apr 01, 2014 10:27 am |
|
|
Hey,
I have actually build (that is almost !!) a multiple input multiple output DC-DC converter. What it does is it basically takes the two voltage sources and converts them to a different level such as addition, subtraction of the two circuits etc. Each seprate circuit (addition, subtraction) has two mosfets each in them. The mosfets needs to be switched on/off alternatively at a switching frequency of 50Khz.
I sorry i do not know much about ASCII charts, although i only have a .doc file of the circuit schematic :( |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Tue Apr 01, 2014 2:45 pm |
|
|
No, I said ASCII art not chart.
You can do a schematic / block-diagram with text:- Code: | -----WWW----
--------
| |
| |
-------- |
Some sort of picture of what you're doing will avoid further confusion.
Mike |
|
|
|