This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
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输出,能实现多高的精度?
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是否有变化,如果无变化,就不需要更新。