#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;
}