ラベル NXP の投稿を表示しています。 すべての投稿を表示
ラベル NXP の投稿を表示しています。 すべての投稿を表示

2016/02/03

mbed LPC1768でインバータ制御できるか?

 久々の更新です。紆余曲折で「青mbed(mbed LPC1768)でインバータ制御信号を出せるか?」といった質問を何回か受けているので、一回まとめておこうかと思います。

 結局、やりたいのは
こんな感じの信号を出力したい、ということです。Tを1周期として指定されたA~Gの各タイミングで対象の信号をHighにしたりLowにしたりします。Tは数us~数十us程度になります。

 細かく考えるとより多いch数、運転モード・停止モードの遷移、ソフトスタート、ソフトストップ、周期固定 or 変動、などいろいろありますが、そのあたりは後回しということで。

 私が考えたところでは、答えは「mbed LPC1768では出力できない」です。

 厳密には割り込みとGPIOを使えば出力できそうに思いますが、この方法は除外して、それなりのペリフェラルが主導して動作する構成を考えていきます。

 「LPC17xx User manual」を見たところ、使えそうなペリフェラルは

  • Timer
  • Pulse Width Modulator (PWM)
  • Motor control PWM

になります。

 Timerは周期的な信号を出力させられますが、結局は無理そうです。もっと単純なパターン、例えばデューティ比50%の信号、なら出せそうです。

 PWMはうってつけのモジュールですが、対応ch数がきわどく足りません。User manualにも書いてありますが、3chまでなら出力できます。

 User manualの「24.4 Sample waveform with rules for single and double edge control」で説明されている通りなのですが、もう少し説明するために「Fig 119. PWM block diagram」を引用すると
ここで色をつけた部分が動く箇所になります。Matchレジスタがもっとあれば、実現可能かもしれませんが、足りないものは仕方ないですね。

 残るはMotor Control PWMですが、これは基板の配線の都合でmbed LPC1768では使えません。Motor Control PWMの出力ポートMCOA0, MCOB0, MCOA1, MCOB1, MCOA2, MCOB2どれも未接続だったり別用途に使われていて、DIPnに接続されていません。

 ただ、もしMotor Control PWMが使えるなら所望信号が出せるかというと出せそうです。実際に試してはいませんが…。mbed LPC1768に近いLPCXpresso1769ならMotor Control PWM出力が取り出せるので試せそうに思います。Motor Control PWMを使えば、4ch信号でなく、3相インバータの6ch信号を出力することも可能です。

2014/06/22

LPC15xxのSCT(2)

その後もLPC15xxのSCT (State Control Timer)についてアプリケーションノートなども見て考えましたが、結局、やりたいことは実現できそういないかな、というのが今の結論です。

結局、一番やりにくいのが
「ソフトウェアからイベントのトリガを生じさせられないのでは?」
という点です。見落としているのかもしれませんが…。

変則な手としては、ソフトウェアからGPIOに出力し、SWM (SWitch Matrix)経由でSCT inputに信号を入れる、というのができるかもしれません。感覚としては、何かな~、というところです。

デューティ比を更新すること自体は、reload register (別のマイコンだとshadow registerって言うのかも)があって、割り込みなど連動させてうまくreload register更新していけば、デューティ比更新していけそうです。これは、cookbookにもサンプルがありました。

そんな感じで、最近は横道にそれて、他のマイコン(dsPICとか)ではどうか?とあちこちデータシートをつまみ食いして回ったりしてます。

2014/06/15

LPC15xxのSCT(1)

考えとかまとまってないですが、たまにはブログ更新しようかなというので、メモ的な内容です。

最近、NXPのマイコンLPC15xxのSCT (State Control Timer)をいじってみています。ひとまずの実機はLPCXpresso 1549です。

SCTは1個で出力10chあって(Largh SCTの場合)、かなり複雑な信号生成ができそうです。電源制御やモーター制御の場合、3相で6ch、ブレーキなどがあっても7chで足りることが多そうなので十分そうです。

が、私が以前仕事で作ったのは12ch以上必要で、そういう場合はSCT 1個では足りないので2個以上を同期連動させることになりそうです。電源制御などでは、単にchごとのデューティ比がそろっていればいいのではなく、各chが同期している必要があるので考慮が必要です。厳密にいうと
  • 運転開始時の信号の挙動がきっちり決まること
  • 運転中にノイズなどによっても信号の位相がずれないこと
  • 運転停止時の信号の挙動がきっちり決まること
といったことが求められます(私が関わったのは試作品だったので、実際の製品だともっと厳しいかもしれませんが)。

その仕事の時は別のマイコンを使っていたのですが、複数のPWMモジュールを同期させる仕組みがきっちりしていたので、若干のひねりは必要でもユーザーマニュアルやアプリケーションノートを見れば実装できました。

LPC15xxのユーザーマニュアルやSCT関連のアプリケーションノートをあたった限りでは、複数SCTの同期についてドンピシャな説明は見当たりませんでした。SCTの場合、SCT0とSCT1でカウンタを同期させるという説明は無かったですが、SCT0とSCT1間での信号接続はあるので、それを使って同期させるのかなと考えています。ユーザーマニュアルによれば下図のような接続関係があるようです(UM10736 "LPC15xx User manuarl"より引用)。



そこら辺から考えて、以下のような方法でいいのではないかなと (まだ実機で試してはいませんが)。
  • SCT1のHALTはソフトウェアで解除しておいてSTOP状態にしておく
  • SCT0からカウンタクリアされる時にSCT1にパルスが出るようにしておく(SCT0のイベント2つ使う?)
  • SCT1ではSCT0からの信号でSTARTするようにしておく(SCT1のイベント1つ使う)
  • SCT1でSCT0からの信号とSCT1カウンタがずれたらエラーとして止まるようにしておく(SCT1のイベント1つ使う)
  • SCT1でエラー検出したら割込か制御信号経由でSCT0も止める
運転開始時はSCT0に対してSCT1が1周期だけ遅れそうですが、制御信号の振り分けを選んで、ソフトスタートにすれば対処できるかなと。

いずれにしても、もちょっとドキュメント読み込んで実機でも試してみないとな、というところです。

PWM信号だけなら、FPGA使えば10chでも20chでも簡単に出せるのですが、A/Dとか通信とかの総合的な部分ではマイコンがやりやすいので、LPCの系列で実現できればmbedなどとの絡みでも良好かなと。