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.
您好,e2e:
MSP430F5324中TimerB的计时器输出存在问题。
如果更改频率,第一个脉冲不是我们预期的。 该值大于预期值,且脉冲比预期值长;
以下是一个示例。
功能要求:
输出PWM定义。 (更改步长为25毫秒。)
计时器和模式选择:
CCR0正在对频率工作。
CCR2正在运行占空比。
代码:
初始化函数:
void enable_timerB_tone(){
TB0CCR0 = 0;
TB0CCR2 = 0;
TB0CCTL2 = CLLD_1 | OUTMOD_6;
TB0CTL = TBSSEL__SMCLK + MC__UP + ID__2 + TBCLR;
}
每25毫秒更改参数以更改频率:
void set_parameters_timerB (uint16_t period,uint16_t pulse_width_counter){
TB0CCR0 =周期;
TB0CCTL0 = CLLD_3;
TB0CCR2 =脉冲宽度计数器;
}
结果:
使用OSC检查输出:
紫色线标记参数更改时间(GPIO切换用于调试,它表示MCU中的值更改)。
绿线是CCR2的输出。
紫色箭头是调用“set_parameters_timerB()”函数的时间(也已完成)。
绿色箭头表示问题脉冲。
(改变脉冲之前为90US,问题之后为100us。 两侧都是正确的参数。)
(从问题脉冲的上升沿到脉冲的下一上升沿,周期也大于预期值。)
您对此问题有什么建议吗?
提前感谢。
Leon
您好,Leon:
如果我理解您的代码正确,您使用的是由DCO提供的SMCLK,这意味着您正在同步运行时钟定时器 和CPU 吗?
在初始化功能中,您使用CLLD = 01B表示TBxCLn加载,当TBxR计数为0时。
当您更新频率(TB0CCR0) 和占空比值(TB0CCR2)时,当TBxR计数为TBxCLn时,将CLLD设置更改为11b TBxCLn加载
那么,您能告诉我您写入TB0CCR0和TB0CCR2的值是相同的值吗?
它的范围看起来是因为在100us脉冲之后,你可以再次看到90US脉冲,对吗?
那么,我们的想法是在下一个周期后更新频率和脉冲宽度(在您的图示中绿色箭头之后)?
这是因为旧值仍应位于比较闩锁中,对吗?
将更新功能的顺序更改为以下顺序是否有帮助:
void set_parameters_timerB (uint16_t period,uint16_t pulse_width_counter){
TB0CCR0 =周期;
TB0CCR2 =脉冲宽度计数器;
TB0CCTL0 = CLLD_3;
}
Dietmar,您好!
目前客户没有反馈,我会与他们核对,感谢您的注释。
Leon