その後もLPC15xxのSCT (State Control Timer)についてアプリケーションノートなども見て考えましたが、結局、やりたいことは実現できそういないかな、というのが今の結論です。
結局、一番やりにくいのが
「ソフトウェアからイベントのトリガを生じさせられないのでは?」
という点です。見落としているのかもしれませんが…。
変則な手としては、ソフトウェアからGPIOに出力し、SWM (SWitch Matrix)経由でSCT inputに信号を入れる、というのができるかもしれません。感覚としては、何かな~、というところです。
デューティ比を更新すること自体は、reload register (別のマイコンだとshadow registerって言うのかも)があって、割り込みなど連動させてうまくreload register更新していけば、デューティ比更新していけそうです。これは、cookbookにもサンプルがありました。
そんな感じで、最近は横道にそれて、他のマイコン(dsPICとか)ではどうか?とあちこちデータシートをつまみ食いして回ったりしてます。
2014/06/22
2014/06/15
LPC15xxのSCT(1)
考えとかまとまってないですが、たまにはブログ更新しようかなというので、メモ的な内容です。
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などとの絡みでも良好かなと。
ラベル:
Cortex-M,
LPC15xx,
LPCXpresso,
NXP
登録:
投稿 (Atom)