Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

PWM code help for full bridge PIC18F4550 xC8

Status
Not open for further replies.

usama14

Member level 5
Joined
Oct 31, 2015
Messages
90
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
756
Hello everyone. Ive written this code for the PWM control of the full bridge dc-dc converter. My switching freq is 100kHz(10us period) and I'm using PIC18F4550 and "xC8" compiler. I have made various cases for the selection depending upon the A/D conversion from the feedback resistive network, as I want to maintain 330Vdc at the output. I am also using the PLL functionality to make use of the 48MHz from the 4MHz crystal. I hope you all will understand the code as it is clearly written in a very easy possible way.
The problem is that during the simulation and debugging, I found that the program is taking about 39 cycles i.e., about 17us for the A/D conversion and I am reading this after every cycle. By the methodology I used, this much delay is causing my switching frequency to change a lot. I want a constant switching frequency of 100kHz, i.e, the time period must remain 10us that I've ensured in each case statement.
Any effective ideas to solve this problem?
Thankyou!

Code:
#include<xc.h>
#define _XTAL_FREQ   4000000
unsigned int answer=0;
unsigned int x=0;

void main()
{
	TRISC = 0;
	PORTC = 0;
	TRISB=0;
	PORTB=0;
	RB0=0;
	RC1=0;
	RC2=0;
	ADCON0=0b00000001;
	ADCON1=0b00000000;
	ADCON2=0b10000100;
	
while (1)
	{
	unsigned int temp=0;
	GODONE=1;
	while(GODONE==1);
	temp=ADRESH;
	temp=ADRESH<<2;
	temp=temp|ADRESL;
	answer= 4.883*temp;
	RC1=0;
	if(answer>3771)
	 {
		 x=x+1;
	} 
	else x=x-1;
	
 switch (x)
{
    case 1 : 
 	{
	 	RC1 = 1;
       __delay_us(18);
	RC1 = 0;
	__delay_us(42);
	RC2=1;
	__delay_us(18);
	RC2=0;
	__delay_us(42);
       break;
  }     
           case 2 : 
 	{
	 	RC1 = 1;
       __delay_us(19.5);
	RC1 = 0;
	__delay_us(41.5);
	RC2=1;
	__delay_us(19.5);
	RC2=0;
	__delay_us(41.5);
       break;
  }     
           case 3 : 
 	{
 	RC1 = 1;
       __delay_us(21);
	RC1 = 0;
	__delay_us(39);
	RC2=1;
	__delay_us(21);
	RC2=0;
	__delay_us(39);
       break;
  }     
           case 4 : 
 	{
	 RC1 = 1;
       __delay_us(22.5);
	RC1 = 0;
	__delay_us(38.5);
	RC2=1;
	__delay_us(22.5);
	RC2=0;
	__delay_us(38.5);
       break;
  }     
           case 5 : 
 	{
	 	RC1 = 1;
       __delay_us(24);
	RC1 = 0;
	__delay_us(36);
	RC2=1;
	__delay_us(24);
	RC2=0;
	__delay_us(36);
       break;
  }     
           case 6 : 
 	{
	 	RC1 = 1;
       __delay_us(25.5);
	RC1 = 0;
	__delay_us(35.5);
	RC2=1;
	__delay_us(25.5);
	RC2=0;
	__delay_us(35.5);
       break;
  }     
           case 7 : 
 	{
	 	RC1 = 1;
       __delay_us(27);
	RC1 = 0;
	__delay_us(33);
	RC2=1;
	__delay_us(27);
	RC2=0;
	__delay_us(33);
       break;
  }     
           case 8 : 
 	{
	 	RC1 = 1;
       __delay_us(28.5);
	RC1 = 0;
	__delay_us(32.5);
	RC2=1;
	__delay_us(28.5);
	RC2=0;
	__delay_us(32.5);
       break;
  }     
           case 9 : 
 	{
	 	RC1 = 1;
       __delay_us(30);
	RC1 = 0;
	__delay_us(30);
	RC2=1;
	__delay_us(30);
	RC2=0;
	__delay_us(30);
       break;
  }     
           case 10 : 
 	{
	 	RC1 = 1;
       __delay_us(31.5);
	RC1 = 0;
	__delay_us(29.5);
	RC2=1;
	__delay_us(31.5);
	RC2=0;
	__delay_us(29.5);
       break;
  }     
           case 11 : 
 	{
	 	RC1 = 1;
       __delay_us(33);
	RC1 = 0;
	__delay_us(27);
	RC2=1;
	__delay_us(33);
	RC2=0;
	__delay_us(27);
       break;
  }     
           case 12 : 
 	{
	 	RC1 = 1;
       __delay_us(34.5);
	RC1 = 0;
	__delay_us(26.5);
	RC2=1;
	__delay_us(34.5);
	RC2=0;
	__delay_us(26.5);
       break;
  }     
           case 13 : 
 	{
	 	RC1 = 1;
       __delay_us(36);
	RC1 = 0;
	__delay_us(24);
	RC2=1;
	__delay_us(36);
	RC2=0;
	__delay_us(24);
       break;
  }     
           case 14 : 
 	{
	 	RC1 = 1;
       __delay_us(37.5);
	RC1 = 0;
	__delay_us(23.5);
	RC2=1;
	__delay_us(37.5);
	RC2=0;
	__delay_us(23.5);
       break;
  }     
           case 15 : 
 	{
	 	RC1 = 1;
       __delay_us(39);
	RC1 = 0;
	__delay_us(21);
	RC2=1;
	__delay_us(39);
	RC2=0;
	__delay_us(21);
       break;
  }     
           case 16 : 
 	{
	 	RC1 = 1;
       __delay_us(40.5);
	RC1 = 0;
	__delay_us(20.5);
	RC2=1;
	__delay_us(40.5);
	RC2=0;
	__delay_us(20.5);
       break;
  }     
           case 17 : 
 	{
	 	RC1 = 1;
       __delay_us(42);
	RC1 = 0;
	__delay_us(18);
	RC2=1;
	__delay_us(42);
	RC2=0;
	__delay_us(18);
       break;
  }     
           case 18 : 
 	{
	 	RC1 = 1;
       __delay_us(43.5);
	RC1 = 0;
	__delay_us(17.5);
	RC2=1;
	__delay_us(43.5);
	RC2=0;
	__delay_us(17.5);
       break;
  }     
           case 19 : 
 	{
	 	RC1 = 1;
       __delay_us(45);
	RC1 = 0;
	__delay_us(15);
	RC2=1;
	__delay_us(45);
	RC2=0;
	__delay_us(15);
       break;
  }     
           case 20 : 
 	{
	 	RC1 = 1;
       __delay_us(46.5);
	RC1 = 0;
	__delay_us(14.5);
	RC2=1;
	__delay_us(46.5);
	RC2=0;
	__delay_us(14.5);
       break;
  }     
           case 21 : 
 	{
	 	RC1 = 1;
       __delay_us(48);
	RC1 = 0;
	__delay_us(12);
	RC2=1;
	__delay_us(48);
	RC2=0;
	__delay_us(12);
       break;
  }     
       default :
       {
	       RC1=0;
	       RC2=0;
	      } 
}	
	
}
}
 

Microchip provides excellent manuals; but lengthy and boring but everything is there.
 

Microchip provides excellent manuals; but lengthy and boring but everything is there.

Yes Indeed.. I found the Full Bridge functionality too..in the ECCP module of PIC18F4550. :) Will share it with you all soon.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top