#include "PWM.h"
//********************************************//
//占空比duty=OCRA/TOR2
//**********************************************//
void CCU_PWM_init(void)
{
P2M1 = 0x00; // Push Pull output
P2M2 = 0xFF;
P2=0;
OCA=1; // enable ports P2.1 and P2.6 as PWM outputs 、sbit OCA = P2^6;
OCD=1; //sbit OCD=P2^1;
TPCR2H=0x00; // set CCU Prescaler:
TPCR2L=0x18; // divide by 100 (99+1) ( //改为25(24+1); ccuclk=0.789M*32/25=1.011126MHZ)
//ccuclk=InpFrq*32/100=0.789*32/100= 252.78KHz
TCR21=0x06; // Prescaler for Phase Locked Loop:
// Input frequency must be in range of 0.5-1Mhz
// InpFrq=PCLK/(PLLDIV+1)=(CCLK/2)/(PLLDIV+1)
// using the internal RC oscillator: CCLK=7.373MHz
// PLLDiv=6, 6+1=7 => 0.526 MHz
// using Crystal 11.0592 MHz => 0.789 MHz
CCCRA=0x03; // Non-Inverted PWM output on channel A
CCCRD=0x03; // Non-Inverted PWM output on channel D
TCR20=0x80; // Start PLL, OutputMode: stop
OCA=1; // wait a machine cycle
while(PLLEN==0);// wait until PLL locked
TOR2H=0x13; // Reload Value 0x1388
TOR2L=0x88; // -> PWM period =1011126Hz/5000(1388H)*2 =101.1Hz
TCR21|=0x80; // update reload value
OCRAH=0x13; // initialize Duty-Cycle channel A 占空比=OCRA/TOR2
OCRAL=0x88;
TCR21|=0x80; // update duty cycle
OCRDH=0x13; // initialize Duty-Cycle channel D
OCRDL=0x88;
TCR21|=0x80; // update duty cycle
TCR20=0x83; // Set output mode: 对称PWM
}
void JDQ_init(void)
{
P0M1&=0xB7;
P0M2|=0x48; //P0.3 and P0.6设置推勉输出
JD1=0;
JD2=0;
}
void PWM_Duty(unsigned short duty1,unsigned short duty2) //设置占空比,占空比更新程序,要通过实验才能确定
{
unsigned char b,c;
b=duty1/256;
c=duty1%256;
OCRAH=b;
OCRAL=c;
TCR21|=0x80; //设置并更新PWM1占空比 ,初始化占空比为0,即输出一直为0
//for(i=0;i<0xff;i++) ;
b=duty2/256;
c=duty2%256;
OCRDH=b;
OCRDL=c;
TCR21|=0x80; //设置并更新PWM2占空比,只要在主程序中更新占空比量就可以
// for(i=0;i<0xff;i++) ;
}