#include "use.h" #include "Ver.h" //extern void LedOut(unsigned char *pLed); #define Pmax 55000 //55000 //42666(18.4320) #define Ki 2.2//i=2 //---------------------------- sbit PwinPin = P3 ^ 5; //---------------------------- typedef union { unsigned int Pwm;//pwm的数据 unsigned char PwmUse[2]; //[0]=H;[1]=L } PWM; //---------------------------- PWMPwmData; unsigned int PwmBak; //---------------------------- unsigned char PwmF = 0; //输出的1,0的标志 /***************************************** PWM计算,输出 t0=T50ms(b0/[fs-fo]+Sgn(U)*20%+a1 ;T50ms=Pwm50+Ah ;B0 *******************************************/ void PwmOut(void) { float Pwm, i, k, j; k = Pmax + (Mp1.AH + OminH) * Ki; i = (PminL + Mp1.AL) * Ki; //---------------------------- //LedOut(LedBuf);//LED显示输出 //---------------------------- j = (LedMenu.B - Mp1.Fo) / (Mp1.Fs - Mp1.Fo); if (j < 0) { j = 0; } if (j > 1) { j = 1; } Pwm = j * k; //Bo/(Fs-Fo)*Pk j = Pwm * 0.8 + k * 0.2 + i; //先计算 if (Mp1.U == 1) { Pwm = j; } else { Pwm = Pwm + i; } TR0 = 0; PwmBak = (unsigned int)Pwm; //更新数据 TR0 = 1; } //------------------------------- void Init_Pwm(void) { PwmData.Pwm = 0; PwmPin = 0; //输出0 (地点平) // PwmOut(); } //定时器0 中断处理 pwmout() void T0_Do(void) interrupt 1 { TR0 = 0; if (PwmF == 0) { //输出高电平 PwmData.Pwm = -PwmBak; TH0 = PwmData.PwmUse[0]; TL0 = PwmData.PwmUse[1]; PwmPin = 1; //0 输出 PwmF = 1; } else { PwmData.Pwm = -PwmData.Pwm; TH0 = PwmData.PwmUse[0]; TL0 = PwmData.PwmUse[1]; PwmPin = 0; //1 输出 PwmF = 0; } TR0 = 1; }