int main(void)
{
CSL_init();
Timer0_PWM(0xFFFF,0x0000,0x0000);
while(1)
{
OUTPUT_PWM = GetValue(); //计算过程返回值,此处略
while(!(TA0CTL & TAIFG)); //判断计时器到时
Timer0_PWM(0xFFFF,OUTPUT_PWM,0x0000); //更新输出结果
}
}
———————————————————————————————————-
void Timer0_PWM(unsigned int PWM,unsigned int PWM1,unsigned int PWM2)
{
TA0CCR0 = PWM;
//TA0CCTL1 = CM_0 + CCIS_0 + OUTMOD_6;
//TA0CCR1 = PWM2;
TA0CCTL2 = CM_0 + CCIS_0 + OUTMOD_6;
TA0CCR2 = PWM1;
TA0CTL = TASSEL_2 + ID_0 + MC_1 + TAIE;
}
———————————————————————————————————-
———————————————————————————————————-
1、我用通过计算的结果,更新PWM,以期实现输出随着输入值的变化而变化,但是输出会出现跳变。
2、稳定的输出,最长可持续48小时
3、稳定的输出,最短可持续12小时
4、信号源、计算过程均没有问题
我猜测是因为不断刷新PWM得志造成的。
———————————————————————————————————-
———————————————————————————————————-
问题一:TIMER_A的PWM是不是只用于定值输出?
问题二:不断的刷新PWM是不是会对输出的准确造成影响?
问题三:我上述代码有没有问题?
问题四:如果要用PWM来实现不断变化的输出,是不是有更好的办法,能否介绍一下?
问题五:如果我做精度比较高的信号输出,用Timer_A的PWM来实现,是否合适?
问题六:用MSP430G2553的TIMER_A进行PWM输出,能实现多高的精度?
Fuchong Wang:
输出会出现跳变
是指什么具体现象?
问题现在解决了么?
HaiTao Li:
回复 Fuchong Wang:
问题如上所述,没有解决,现象一直存在。我怀疑是我的供电设备有问题,如果不是的话,那就真的是PWM输出本身的问题了……..不知道你有什么思路没有
Hardy Zhou:
Timer_A做PWM输出控制时,PWM_Value的更新没有双缓冲的功能,是立即执行的,所以
while(!(TA0CTL & TAIFG));
Timer0_PWM(0xFFFF,OUTPUT_PWM,0x0000);
再来更新PWM的值,这段时间如果大于更新的PWM_Value需要的时间,那么就没有问题,如果是小于,那么比较翻转就不会执行,这时候就会导致占空比的跳变。
解决的办法是:根据你当前代码的执行时间来设定最小占空比
另外你的代码可以改进下,因为你只是希望改动PWM_Value,并不需要再设置寄存器,可以改成
while(!(TA0CTL & TAIFG));
TA0CCR2 = PWM1; //这可以降低你的PWM最小占空比要求
或者更合理就是判断下PWM1是否有变化,如果无变化,就不需要更新。
HaiTao Li:
回复 Hardy Zhou:
谢谢,我先测试一下
Xutong Han2:
回复 HaiTao Li:
PWM的占空比只有在需要改的时候才去修改CCRx的值,当配置好定时器PWM模式时,修改CCRx的值就可以改变PWM的占空比~
paul1:
楼主,你好!
你的问题解决了么?我现在也遇到这样的问题,我现在也是通过传感器采集值而改变PWM输出占空比,刷新率大概在100ms,现在发现会间隔一定时间出现跳变的问题。不知道你遇到的问题解决了没?