7 years, 2 months ago.

LPC1114FN28のPWMについて

お世話になります。

LPC1114FN28のPWMについて質問させてください。 PWMの参考としてHandBookにあるHello WorldのプログラムのLEDの部分をdp1に置き換えて外部にLEDを接続して、LPC1114FN28にプラットフォームを変更してテストをしてみたのですが、LEDが点灯したままになり、不思議に思ったのでオシロスコープに接続してみたところ1usくらいのスピードでパルス出力をしているようでした。

これはなぜでしょうか。 ハード的な故障でしょうか。 それとも1114は特殊な設定をしないといけない制約があるのでしょうか。

情報をお持ちの方、ご教授ください。 よろしくお願いいたします。

LEDという部分を単純にdp1に変えただけですが、以下にプログラムを記載しておきます。

include the mbed library with this snippet

#include "mbed.h"
 
PwmOut led(dp1);
 
int main() {
    // specify period first, then everything else
    led.period(4.0f);  // 4 second period
    led.write(0.50f);  // 50% duty cycle
    while(1);          // led flashing
}

1 Answer

7 years, 2 months ago.

LPC1114FN28のPwmOutで、dp1(P0_8)を使用する場合は、波形の生成に16ビットタイマーを使っています。このタイマーの周期は16ビットで指定できるプリスケールカウンタの最大値になります。Mbedでは、PwmOutのデフォルト周期(20mSec)を出力できる値に設定しています。4Secという値は、16ビットタイマーのプリスケールカウンタで設定できる値に対して大きすぎるため、期待した波形が出ていないと考えます。

参考:https://github.com/ARMmbed/mbed-os/blob/master/targets/TARGET_NXP/TARGET_LPC11XX_11CXX/pwmout_api.c#L87-L92

上記コード中のコメントにあるように、プログラム内で LPC_TMR16B0のPR の値を設定するか、32ビットタイマーを使用するdp24(P0_1)を使用して下さい。

コメントありがとうございます。

おっしゃる通り、dp24及びdp18だと正常動作をいたしました。

しかしながら、ご教授いただいた内容にある4sec以外に、実は1secや0.5secなども試したのですが、動作は同様のもので、ちょっとモヤモヤしています。

ネット検索でlpc1114のdp1を使ってPWM動作をさせていらっしゃる方を数名見受けましたので不思議に思いますが…。

そこでふとピン配列を眺めていて、もしかしたらスイッチサイエンスさんのボードを使ってUSBに刺した状態で使っているので、dp1がPWMout以外にMOSIというのに割当られていますが(SPIと言うのでしょうか)、それが通信をしていて、その値が優先されているのかな、と考えたりもしましたが、そういう考えも出来るのでしょうか。 的外れでしょうか。

素人考えですみません。

posted by j t 11 Sep 2017

Quote:

しかしながら、ご教授いただいた内容にある4sec以外に、実は1secや0.5secなども試したのですが、動作は同様のもので、ちょっとモヤモヤしています。

説明が分かりにくかったでしょうか?

タイマーの周期はハードウェアに設定しますが、dp1(P0_8)の場合その値は16ビットで指定できる値が最大値です。LPC1114FN28の場合は、システムコアクロックが48MHzで、MbedのLPC1114のHAL実装では、プリスケーラの値を31(指定値は30)に設定し、20mSecあたりをセンターに考えています。この場合、タイマークロックの周期は約646nSecになり、それがタイマーのクロックソースになります。

因みに、20mSecの場合のカウンタ値は、0x78F7です。 40mSecでは、0xF1EFとなり、このあたりがデフォルトで設定できるPwmOut周期の最大値になります。

ですので、4Sec, 1Sec, 0.5sec だと、デフォルトのプリスケーラ設定で指定できるカウンタ値を大きく超えてしまいます。

プリスケーラ値は、ユーザコードからも変更が可能です。以下のようにすると、dp1(P0_8)を使用しても、4sec周期の波形を出力することが出来ますので、お試しください。

#include "mbed.h"
 
PwmOut led(dp1);
 
int main() {
    LPC_TMR16B0->PR = 0x1000;

    // specify period first, then everything else
    led.period(4);  // 4 second period
    led.write(0.50f);  // 50% duty cycle

    while(1);          // led flashing
}

Quote:

そこでふとピン配列を眺めていて、もしかしたらスイッチサイエンスさんのボードを使ってUSBに刺した状態で使っているので、dp1がPWMout以外にMOSIというのに割当られていますが(SPIと言うのでしょうか)、それが通信をしていて、その値が優先されているのかな、と考えたりもしましたが、そういう考えも出来るのでしょうか。 的外れでしょうか。

pinoutの図中の表記は、Mbedとして使用可能な機能を表しています。プログラム中で明示的にSPIを使用しない限りは、設定が行われることはありません。

posted by Toyomasa Watarai 13 Sep 2017