[Armadillo:08331] Re: Armadillo-440 のバックライト制御PWMについて
Koyo Takenoshita
email@hidden
2012年 9月 21日 (金) 10:14:20 JST
竹之下です。
i.MX25のPWMモジュールでは、内部のカウンタは0x0000からカウントアップを始め、
PWMSARに設定された値と同じ値になったときにPWMO出力を反転し、PWMPR+2と同じ値に
なったときにPWMO出力を再度反転します。そのため、PWMSAR == PWMPRとなっている場合、
2クロック分のパルスが発生してしまいます。
PWMSARの特性について、i.MX25 Reference Manualに以下の記述があります。
37.3.2.4 PWM Sample Register (PWMSAR)
A value of zero in the sample register will result in the ipp_pwm_pwmo output
signal being always low/high (POUTC =00 it will be low and POUTC = 01 it will
be high), and hence no output waveform will be produced. If the value in this
register is higher than the PERIOD + 1, the output will never be reset/set
depending on POUTC value.
つまり、輝度最大時に常に値を一定にしてパルスを発生させたくない場合、
PWMSAR > PWMPR+1とすれば良いことになります。
以下の修正をおこなうと、輝度最大時にパルスが発生しなくなります。
diff --git a/drivers/mxc/pwm/mxc_pwm.c b/drivers/mxc/pwm/mxc_pwm.c
index 79c3ca7..3b6b03d 100644
--- a/drivers/mxc/pwm/mxc_pwm.c
+++ b/drivers/mxc/pwm/mxc_pwm.c
@@ -82,6 +82,9 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
do_div(c, period_ns);
duty_cycles = c;
+ if (period_cycles >= 2)
+ period_cycles -= 2;
+
pr_debug("%s: clock=%lld, period cycles=%ld, duty cycle=%ld, prescale=%ld\n",
__func__, clock, period_cycles, duty_cycles, prescale);
> i.MX25のデータシートではPWM関連レジスタの変更はPWMを止めて行なうように推
> 奨しているが、pwm_config()はPWMを止めずにレジスタ書き換えている。
> 特に不具合は無さそうだけど、気持ち悪いので、ついでに修正した。
この部分は実装時に悩んだのですが、PWMをとめないでデューティを変えたい
こともあるかと思い(パルスモーターの制御をするときとか?)、disableにしないで
変更しています。
(2012/09/21 0:07), Yasuhisa Nakamura wrote:
> 中村です。
>
> データシートもコードも読んでいませんが、
> 質問させていただきます。
>
>> i.MX25データシートのPWM機能説明を調べたところ、
>> ・PWMカウンタは0〜PWMPR+1の値域で累積される
>> ・PWMカウンタとPWMSARが一致するとPWMOが反転する
>> とされている。
>
> PWMSARにPWMPR+1をセットした場合、どうなりますか?
> (一瞬ヒゲが出るのでしょうか?)
> periodより大きなdutyをセットするということが
> できれば・・・ですけど。
>
> いっそのこと、duty_nsとperiod_nsが等しい場合には
> PWM動作をとめて出力をLOWに固定してしまう、という
> 解決策はありでしょうか?
>
--
Koyo Takenoshita
armadillo メーリングリストの案内