freedomhit

ADuC7026PWM波占空比的问题(原创)

0
阅读(2807)

ADuC7026有可编程的三相脉宽调制(PWM)波形发生器,他有六个PWM输出引脚,PWM0H, PWM0L, PWM1H, PWM1L, PWM2H, PWM2L,其中H、L为互补的高低电平,H定义为大于50%,L定义为小于50%,L和H为互补关系。下面主要说下PWM的占空比的设置。

根据公式:

                        T0HH=PWMDAT0+2*(PWMCH0-PWMDAT1)*tCORE

                         T0HL=PWMDAT0-2*(PWMCH0-PWMDAT1)* tCORE

则占空比为:

                          d0H=T0HH/TS=1/2+(PWMCH0-PWMDAT1)/ PWMDAT0

如果想要占空比的范围为从0到1,那么PWMCH0-PWMDAT1)/ PWMDAT0的取值范围就要为-1/2到1/2.

现在拿个程序来说明这个问题:      

PWMCON = 0x01;
       PWMDAT0 = 0x0810;   //PWM使能,频率10KHZ
       PWMDAT1 = 0x00;
       PWMCFG = 0x00;      
       ADCCON = 0x4A3;


       ADCCP = 0x01;       //ADC1使能,读取电压指令

        P_Value2 = ADC_Value2();
       i=1032-P_Value2*2064/255;   //1032--0%,-1032--100%,调速级别255级平滑调速。
       PWMCH0 =i;

说明之前先声明一下:

int ADC_Value2()

{

        while (!ADCSTA) {}

        input2 = (ADCDAT >> 16)/16;

        return input2;

}

这里我先把ADC的值赋给 P_Value2,插上一句,ADC控制寄存器的0到15位为空,为了把数据拿出来,所以

用了ADCDAT >> 16进行移位。因为ADC寄存器为12位转换数据,所以与他对应的信号位应该是2^12,即把

电压分为1/(2^12-1),因为定义的时候已经有了(ADCDAT >> 16)/16,所以输出最大值P_Value2为256,

又因为输出是跳动的,所以P_Value2的值为(0,256)之间跳动的,根据设定PWMDAT0 = 0x0810,转换成

十进制为:2064,PWMDAT1 = 0x00,下面计算一下:

                   d0H=T0HH/TS=1/2+(PWMCH0-PWMDAT1)/ PWMDAT0=1/2+PWMCH0/2064

                         =1/2+(1032-P_Value2*2064/255)/2064

可以看到两个极值,当P_Value2为0时,占空比  d0H=1,当 P_Value2=255时,   d0H =0。从而解决占空比的问题!这个东西好烦啊,我算来算去头都大了。。。。。

就是这样了,头算的有点晕,要是错了就提醒一下啊!