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などとの絡みでも良好かなと。