ADuC7026PWM波占空比的问题(原创)
0赞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。从而解决占空比的问题!这个东西好烦啊,我算来算去头都大了。。。。。
就是这样了,头算的有点晕,要是错了就提醒一下啊!
