89C52 PWM输出程序
2013-02-21
标签: PWM


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


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号