7.8.6. 常见问题¶
7.8.6.1. 每个 PWM 控制器的两路输出信号有什么关系?¶
每个控制器可以控制两路输出PWM信号,这两路信号从设计上有三个约束条件:
- 共用同一个 time-base 信号,即DTS参数 - tb-clk-rate,详见 PWM 自定义参数;
- 共用同一个 PWM 信号频率 配置参数; 
- 共用同一个 占空比 配置参数。 
上述 “PWM 信号频率” 和 “占空比” 由PWM的 调用者运行时配置。 两路信号可以完全相同,也可以做到亮点差别:
- 相位相反,在占空比上看到的是一个为正、一个为负; 
- 可以关闭其中一路,在DTS参数中将对应的Action配置为 “none” 即可。 
7.8.6.3. PWM 信号的周期不准¶
7.8.6.3.1. 现象¶
这个问题,通常出现在增减模式,看到周期值可能存在“差1”的误差。
7.8.6.3.2. 解决方法¶
对于 增模式 和 减模式,周期值的计算方法比较简单:
Tpwm = (TB Period + 1) / tb-clk-rate
Fpwm = 1 / Tpwm
对于 增加模式,周期值的计算方法是:
Tpwm = 2 * TB Period / tb-clk-rate
Fpwm = 1 / Tpwm
其中:
- tb-clk-rate: 时基计数器的工作时钟 
- Tpwm: PWM信号的周期值 
- Fpwm: PWM信号的频率值 
- TB Period: 时基计数器的计数值,假设此值是100,那么从0计数到99就是一个增模式PWM信号的周期 
在PWM驱动中,tb-clk-rate是从DTS中获取的,其他几个值的计算顺序是:
Tpwm(即period_ns) -> Fpwm(即freq) -> TB Period(即prd)
代码详见函数aic_pwm_config()中:
arg->freq = NSEC_PER_SEC / period_ns;
prd = arg->tb_clk_rate / arg->freq;
if (arg->mode == PWM_MODE_UP_DOWN_COUNT)
    prd >>= 1;
else
    prd--;
可以看到上面 TB Period(即prd) 的计算过程中有一次 除2操作,所以可能会引入“差1”的误差。