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

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

2012/10/28

Stellaris LaunchPad

 すごく安いマイコン基板が出たので、反射的に買ってきました。

 Texas InstrumentsのStellaris LaunchPadです。Cortex-M4Fがのって550円の安さ!実は初入荷の後に店に行ったのですが売り切れで、再入荷との情報を得て、買いに行って何とかゲットしました。お店では

お一人様、4個まででお願いします

――と。そりゃそうですね、破格の安さだし。

 他の方に聞いた話やTIの資料によると、どうも正規価格は約12ドルなので、期間限定のキャンペーン価格なのかもしれません。もう、何枚か買っておこうかな~。

 主なスペックはこんな感じです。

  • TI LM4F120搭載
    • 80MHz 32-bit ARM Cortex-M4F
    • 256KB Flash, 32KB SRAM, 2KB EEPROM
  • オンボードUSB Debug Interface搭載
  • USBから給電
    • レギュレータで3.3Vをマイコンへ給電
  • USB Device機能
  • リセットスイッチ & 2個のユーザ用プッシュスイッチ搭載
  • 16MHz クリスタル搭載
  • RTC用クリスタル搭載
  • フルカラーLED 1個搭載
  • BoosterPack(拡張基板)用コネクタ搭載

 見た目はこんな感じです。裏面にはコネクタしかなくスッキリしています。コネクタが足になるので、基板が裏面でクリップとかに触れてショートする心配なくて良いかと。

左1/4のあたりが、Stellarsis In-Circuit Debug Interface (ICDI) を構成している部分です。よく見ると、ICDIを構成しているのも中央と同じ型番です。結局、Cortex-M4F (LM4F120)が2個載ってます!

 Micro-BのUSBコネクタは左がICDIのポート、下はマイコンがUSB Deviceになる場合のコネクタです。電源はどちらかのUSBコネクタから供給し、それを左下のスイッチで切り替えます。

 ちなみにICDIのUSBを接続すると、仮想シリアルポートも見えます。これはメインマイコンのUARTに繋がる感じです。デバッガとかと独立にシリアルポートとしても使えるので地味に便利かな~と思ってます。

 開発ツールは複数から選べるようですが(評価期間とか制限とかいろいろ異なる)、私はTIのCode Composer Studio (CCS v5)を使いました。

 定番のLチカをするには次の手順でできました。

1. TIサイトから必要なファイルをダウンロード

  • EK-LM4F120XL-CCS (CCS, StellarisWare, ICDIドライバ等が含まれる)
  • Stellaris LaunchPad Workshopマニュアル
  • Stellaris LaunchPad Workshopファイル
の3つです。合計で約1.3GBになります。
 Workshopのは必須ではないのですが、WorkshopのLabに沿って進めるのが手っ取り早いです。

2. ソフトウェア類のインストール

  • CCSv5 (開発環境)
  • StellarisWare (ライブラリなどが含まれる)
  • Workshopファイル
  • ICDIドライバ
の4つです。上3つはセットアップを実行していくだけです。標準のままだとc:\tiとc:\c:\StellarisWareにインストールされます。

 ICDIドライバは基板をPCに接続して、ドライバを入れていきます。PowerSelectスイッチをDEBUGにして、DBG側のUSBをPCに接続します。Windowsのデバイスには都合、
  • Stellaris Virtual Serial Port
  • Stellaris ICDI DFU Device
  • Stellaris ICDI JTAG/SWD Interface
の3つが出てきます。

3. WorkshopのLab2をする

 実は手順2でだいたいLab1をしたことになるので、Lab2をやります。Lab2がLチカそのものです。

 結局は、
  • CCS起動
  • 空プロジェクト作る
  • main.cを書き換える(コピペ)
  • プロジェクトの設定を追加する
    • StellarisWareのヘッダファイルやビルド済みライブラリを使うようにする感じです
  • 実行する
    • デバッガモードになって、バイナリがマイコンのフラッシュに書き込まれて動き出します
って感じです。