[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 メーリングリストの案内