工具/软件:
您好:
我发现计时器存在问题、特别是比较模式问题、并在尝试生成 PWM 信号时在零事件期间进行更新。 当与值0 (100% PWM 占空比)进行比较时、信号值而不是设置为高电平会保持在低电平状态(图1)。 临时修复是改为0比较值已设置为1 (图2)、但这不是一个理想的情况。 解决此问题的另一种思路是、如果比较值等于0、则将更新模式更改为立即而非零事件(图3)、但这也不是一个没有缺点的解决方案、主要问题是、如果发生为设置适用占空比而执行的计算不够快、无法在下一个零事件之前完成、则在以下值为0时跳过该值。
当比较向上设置时的 CCP 极性更改为高电平、而比较向上设置时的 CCP 极性更改为低电平时、该问题仍然存在。
展示该问题的方法是计时器每个周期更改比较值、从0更改为负载值833、步长为83+/- 1、针对整数类型进行了调整。 在图中、通道0是互补的、通道1是主通道、通道3是更改比较值的每个实例切换的 GPIO。 使用的计时器为 TIMA1、配置为中心对齐 PWM、CCP 设置为发生零事件时的输出操作、频率为48kHz、加载值833
我的问题是、如果与0进行比较时计时器行为不正常、或者存在用于修复的设置、这是正常的。
uint16_t instances_counter;
uint16_t compare_value;
uint32_t compare_values[] = {1, 83, 167, 250, 333, 416, 500, 583, 666, 750, 833};
uint32_t tabele_size = sizeof(compare_values)/sizeof(compare_values[0]);
void Timer_Duty_Change( void )
{
if ( instances_counter < tabele_size)
{
compare_value = compare_values[instances_counter];
instances_counter++;
}
else
{
instances_counter = 0;
}
TIMA1->COUNTERREGS.CC_01[ 1 ] = compare_value;
}