がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

MXR mini iso-brickの解析

最近アイソレートサプライが標準になってきて値段が落ち着いてきたのでMXR mini iso-brickを購入してみました。
この記事では、使った感想よりも回路側にシフトして解説していけたらと思います。

導入

購入のきっかけを説明するために現在販売されているアイソレートサプライを調査してみました。

  • Strymon Ojai系列、Zuma系列(型番は省略)
  • VITALAUDIO POWER CARRIER系列(一部ノンアイソレートあり)
  • MXR iso-brick系列
  • FIREGLOW PPS-1
  • VOODOO LAB PedalPower
  • TRUETONE 1SPOT PRO CS7

上四つは絶縁DCDCを利用したタイプで、下二つはトロイダルトランスを使用したタイプだったと記憶しています。
StrymonとVITALAUDIOはネットに内部画像があがってたのとFIREGLOWが売り切れだったのでMXRをチョイスしました。
そのほか比較的安価、一番小型である、有名ブランドの設計はどうなっているのかというのも理由の一つです。

MXR mini iso-brick

f:id:gsmcustomeffects:20201017182035j:plain

スペックとしては

  • 9V 300mA x 4
  • 9V/18V 800mA x1

合計2Aまでの出力に対応している。
音を評価する環境がないので早速分解していきます。
f:id:gsmcustomeffects:20201017190504j:plain

内部は基板が二段組になっています。
上側の基板にはDCDC回路及びスイッチングトランス、二次側の整流回路が載っています。
下側の基板にはリニアレギュレータと9V/18VのDCDCコンバータが載っています。

上側の基板

f:id:gsmcustomeffects:20201017200545p:plainf:id:gsmcustomeffects:20201017201223p:plain

上側の基板には以下に示すものが載っています。

  • プッシュプルコンバータ制御IC(ZG1810?)
  • 外部N-ch MOSFET x2(STN4260)
  • プッシュプルトランス(シルクにはEPC25記載)
  • 二次側整流回路

絶縁DCDCの回路方式としてはプッシュプル方式という方式が採用されています。
制御ICにはZG1810というものが使われています。
刻印にはDunlopが入ってるのでおそらくOEM品かと思われます。
MOSFETはSTANSONのSTN4260が使われています。
トランスを返して送られてきた矩形波を整流するために二次側には全波整流回路が出力数分載っています。

そもそもプッシュプルコンバータってなに?

プッシュプルコンバータ基本回路はこのような形です。

f:id:gsmcustomeffects:20201018010639p:plainf:id:gsmcustomeffects:20201018010705p:plain
トランスのセンタータップに電源電圧を印可し上下巻線を交互にスイッチングしながら動作するコンバータです。
コイル両端には2*VINが出てくるので高電圧になる場合は感電などの注意が必要です。
解説としてはEDNさんの資料TDKさんの資料が短観に理解したい人にはおススメです。

実機の波形を確認してみる

参考までに実機で一時側のスイッチ波形と二次側の波形をとってみました。

f:id:gsmcustomeffects:20201018012914p:plain

計測箇所は画像に示した通りになりますが①と②は1次側GNDに対する電圧を見ており、③は巻線両端の電圧を見ています。
一時側トランスの巻線が直接はんだされてるのはちょっとびっくりですが気にしないことにしましょう。(2*VIN出てるのでちょっと怖い

次に波形を示します。

f:id:gsmcustomeffects:20201018005822p:plainf:id:gsmcustomeffects:20201018005826p:plain
一枚目はGNDに対する一時側の巻線両端を計測したものです。
Vinとしては18Vが入力されているのでVp-pで36V付近が出てきます。
上側と下側を交互にオンしてトランスを駆動している形です。
二枚目は二次側の巻線間を計測したもので0Vを中心にVp-pで25V付近が出ています。
この波形を全波整流するとダイオードの順方向電圧分降下して11.8Vぐらいになるというわけです。
尚スイッチング周波数は60KHz付近です。

下側の基板

少し脱線しましたが、下側の基板も見ていきましょう

f:id:gsmcustomeffects:20201018003041p:plainf:id:gsmcustomeffects:20201018003048p:plain

下側の基板には

  • 9Vリニアレギュレータ 78M09 x4(HTsemi製)
  • 9/18V用DCDCコンバータIC AAP6034A (SGMICRO製)

が載っています。
上側のMOSもそうですが半導体は中華デバイス主体です。
これのおかげで12000円でこのスペックを実現しているのかーとちょっと感心しました。

次に回路動作を見ていこうと思います。
上の基板から来た11.7Vはリニアレギュレータに送られて9Vを生成します。
上の基板から来た24.5VはDCDC回路に送られて9 or 18Vを出力します。

電圧の切り替えはオンボードのスライドスイッチでFB抵抗を切り替えて実現しています。
二次側回路だけ軽くとったので参考にしてください。
drive.google.com

まとめ

今回はmxr iso brick miniを解析し70%ぐらい理解した。
低背のカスタムトランスとOEM制御IC?を用いてこの大きさにまとめているのは流石MXRといったところでしょう。
機会があればFIREGLOWのアイソレート電源も解析してみたいと思う。

おまけ

LT3439を使ったプッシュプルコンバータ

今回の解析では1次側にOEMチップ?が使われていたので同じようなものを作るとき困る。
そこでLT3439を用いたものを紹介しようと思う。

f:id:gsmcustomeffects:20201018015822p:plainf:id:gsmcustomeffects:20201018020607p:plain

トランスさえ作れれば結構お手軽な構成ですね。

フライバック方式

複数のアイソレートOUTを小型で作るにはカスタムトランスを使うしかないのが現状です。
汎用トランスで作れそうな絶縁DCDCとしてはフライバックが有名です。
f:id:gsmcustomeffects:20201018021429p:plain

例えばLM5180だとこのような形になります。

f:id:gsmcustomeffects:20201018021616p:plainf:id:gsmcustomeffects:20201018021600p:plain

ちなみにFlybackもトランス出力を増やすことで複数回路に対応できます。
f:id:gsmcustomeffects:20201018021908p:plain

結局のところ一時側の巻線に多くの電流が流れるのでプッシュプルやハーフブリッジ、フルブリッジのような構成が向いてるのかもしれません・・・・

Strymon Ojaiの内部

https://alfalfasprout69.wixsite.com/ojai/gut-shot-picturesより引用
f:id:gsmcustomeffects:20201011150021p:plain

Strymonはトランスを複数載せているのでフライバック?
ピン数的にプッシュプルかもしれない

VITALAUDIO VA-05の内部

Amazonレビューより引用
f:id:gsmcustomeffects:20201011150239p:plain

VITALはMXRに似ているのでもしかしたらここがOEMで作ってるのかな?

VITALAUDIO VA-08の内部

アスモ君より拝借(https://twitter.com/aSumoeffects/media

f:id:gsmcustomeffects:20201011150501j:plainf:id:gsmcustomeffects:20201011150457j:plain

Seeed FusionPCBで基板を作った話

タイトル通りの話ですがSeeed FusionPCBで基板を発注した話です。

私自身FusionPCBというサービスを知ってから数年たちますが、最近ではつぎつぎに新しいサービスを展開し非常に勢いのあるメーカーであると感じます。

www.fusionpcb.jp


ブランド紹介も済んだところで早速本題に移りたいと思います。
今回発注した基板は、デジタルエフェクターDSPが載っている基板です。
モノとしては、Baoding Forlinx Embedded Technologyhttp://www.forlinx.net/product/rt1061-44.html)社のFET1061Sを実装するための基板になります。


f:id:gsmcustomeffects:20200807153256p:plain


届いた基板がこれ

f:id:gsmcustomeffects:20200807204013p:plain

捨て基板は折ってしまっていますが特に問題はないです。
基板自体の品質ですが、シルクもレジストもかなりきれいに仕上がっています。

今回は基板+ステンシルも頼んだので13.8$(4.9 + 8.9)
配送は新しくできたJapanDirectLineを利用して12.38$
合計で30$いかないで基板が作れてしまった。
個人的にJapanDirectLineが導入され、送料が17$→12.38$程度まで下がったのが大きいといえる。

配送時間だが、発注からの流れを張っておくので参考までに・・・・・
f:id:gsmcustomeffects:20200807160244p:plain

以上Seeed FusionPCBに基板を発注した話でした。

参考

Seeedのエンジニアが書いているブログは新サービス情報などが手に入るので非常にお勧めである。
FusionPCB-配送データ大披露! | Seeed FusionPCB

KiCadのバスについて

導入

KiCadにはメモリバスなどの同種な信号線をまとめるバス機能がある。
バス機能を使うことで回路図の見栄えが良くなったりするので覚えておいて損はない。
今回はそれのやり方とTipsを紹介しようと思う。

使い方


f:id:gsmcustomeffects:20200725093351p:plain

  1. 画像のようにローカルラベルをD0~D7を配置する。
  2. ワイヤーバスエントリを配置
  3. バスを配置
  4. グローバルラベルにてD[0..7]のように信号線をまとめる

使う際はグローバルラベルが推奨されているが、同階層で結線するならローカルラベルでも問題なさそう。
ちなみにまとめたい配線が離れている場合でも0..7 , 8..15とすれば0..15でまとめたところとつなぐことができる。

f:id:gsmcustomeffects:20200725094018p:plainf:id:gsmcustomeffects:20200725093932p:plain

作業環境をちょっとよくしたはなし

本当にお久しぶりです。
6か月以上ブログ更新をさぼっておりましたが、久々の更新ということで最近あったこと、タイトルの通り作業環境の更新だったりを書こうと思います。

まずここ数か月何をしてたかというと

2月 修士論文報告会
3月 研究の引継ぎおよび卒業
4月 関東に引っ越して社会人生活がスタートし研修など・・・・・
5月~7月 入社して焦り自己研鑽とかやってた
こんな感じで結構忙しい生活をしていたのでいつの間にか夏になっていたという感じですね。

作業環境の話

次に作業環境がちょっと新しくなったので紹介します。

f:id:gsmcustomeffects:20200706011055p:plain

つくえ

かなでものというサイトでセミオーダーしました。
ダイニングテーブル - 金物家具の「かなでもの」

サイズ的には180㎝ x 90cmになります。
かなり大きいので、27インチモニターを3つおけます。
多少値段が張るのですが木目がしっかりしているデスクが、ずっとほしかったので満足です。

次に机周りのものだったりを紹介して終わろうと思います。

モニターとアーム

モニターは、BENQの27インチのものを使用しています。
2万ぐらいで27インチ、VESAマウント対応というごく一般的なモニターです。
https://amzn.to/2ZD70I6

アームに関してはFleximountsのM01というものを使用しています。
これは新発売のもので、ものすごく安いガススプリング式モニターアームです。

片方のモニターだけアームでつないでいて後ろにオシロスコープを配置して隠しています。
Amazon CAPTCHA

キーボード

キーボードは、ロジクールBluetooth K380というものを利用しています。
コンパクトでかわいいという理由だけで選んでいます。
Amazon CAPTCHA

デスクライト

デスクライトは調光機能が付いたJOLY JOYというものを使用しています。
仕事中は白色にし夜は暖色にしています。
Amazon CAPTCHA

いす

椅子ですがGT901BLACKというゲーミングチェアを使っています。
Amazon CAPTCHA


ざっとこんな感じです。
4月から結構お金使ったなーと思うので今後は進捗と記事の更新ができるように頑張りたいと思います。

littlevGL シミュレータを使うメモ

littlevGLのシミュレータを使う時の導入メモ
公式の解説だけだと少しはまったのでまとめておくという感じ。
尚littlevGL 6.0を対象に進めていきます。
なんか8月に下書きでかいてて2020年1月21日現在いつの間にか6.1になってましたがマイナーアップデートなのでおそらく手順的な変更点はないはず

littlevGLについて

f:id:gsmcustomeffects:20200123073118p:plain
LittlevGLの公式デモUI(Dark Styleを適用)
MIT licenceで提供されている組み込みGUIライブラリである。
組み込み向けGUIは商用含め

  • emWin(NXPだとフリー)
  • TouchGFX(STだとフリー)
  • Embedded Wizard(体験版があり)
  • uGFX(趣味ならフリー)

などがあるがlittlevGLはどのプラットフォームでも無料で使えるので覚えておいて損はない。



littlevGLシミュレータを試す

littlevGLについては前項でふれた通りだが、毎度マイコンに書き込んでデバッグしているのではかなり大変である。
そこで活躍するのがPCシミュレータという機能今回はこれの導入方法の紹介

f:id:gsmcustomeffects:20190827032041p:plain





Eclipse CDTの導入

以下のリンクからEclipseCDTを落としてくる。
CDT Downloads | The Eclipse Foundation

インストールまでは普通に進めてください

MinGWの導入

EclipseC言語を扱うにはコンパイラが必要なのでそれを導入します。
ここで注意が必要なのが普通に検索してトップに出てくるMinGWは32bit版なので64bit版を探してきて使います。
MinGW-w64 - for 32 and 64 bit Windows download | SourceForge.net


導入に関してはこのサイトが詳しいです。
PENGUINITIS - MinGW 64 bit 版 のセットアップ

パッケージに関して今後管理する必要があるならMSYS2とか入れとくと便利でしょう。
インストールが終わるとC:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\binとかにインストールされてると思うので
このディレクトリにPATHを通してこの段階までは各自進めてください
f:id:gsmcustomeffects:20190827033153p:plain

MinGW PATHなんかでググるとやり方は無限に出てきます。

pc_simulator_sdl_eclipseをクローンする

公式がコンフィグ済みのプロジェクトを配ってくれているのでこれをgit cloneします。
github.com

README読めば書いてありますがgit clone --recursiveとすることが重要です。

これをしないとサブモジュール(lvgl,lv_drivers,lv_drivers)がないのでエラーとなりますので注意してください。

SDL2を持ってくる

SDL2はクロスプラットフォームのマルチメディアライブラリでシミュレータのグラフィック描画に必要。

Simple DirectMedia Layer - SDL version 2.0.10 (stable)

上記リンクに飛んでDevelopmentをダウンロードして適当なところに展開する。
f:id:gsmcustomeffects:20190827034118p:plain

公式ドキュメント通りにやるならこの手順通りにファイルをコピーしたりする。
f:id:gsmcustomeffects:20190827034218p:plain

自分はMinGW直下を汚したくなかったので
C:\SDL2\x86_64-w64-mingw32みたいな感じに配置してEclipseの機能でライブラリパスを通した。(この方法に関しては次の項で説明)

pc_simulator_sdl_eclipseをインポート

先ほど落としてきたpc_simulator_sdl_eclipseEclipseにインポートする。
この状態でいくつかエラーが出ると思うのでプロジェクトのプロパティを開きます。

C++/Build -> ToolChainEditerを開きMinGWを選択

f:id:gsmcustomeffects:20190827040928p:plain

この時正しくPATHが通せていればこうなる
f:id:gsmcustomeffects:20190827041159p:plain

これでApplyを押すとコンパイラ関連のエラーは消える。

次にSDLを読み込む
f:id:gsmcustomeffects:20190827041338p:plain

ライブラリも同様に読み込む
f:id:gsmcustomeffects:20190827041436p:plain

これである程度の修正はOK
あとはlv_conf_template.hをlv_conf.hにコピーする。(これはアップデートが入るたび必要みたい
f:id:gsmcustomeffects:20200121044500p:plain

ここで一度コンパイルを行う。
fb関連でエラーが出るようなら以下のように対応する
f:id:gsmcustomeffects:20200121045007p:plain

起動

あとはRunするとこのような画面が出るはず
f:id:gsmcustomeffects:20200121045025p:plain

Tips

その他のデモを動かしたいならこのようにする
f:id:gsmcustomeffects:20200121045351p:plain

f:id:gsmcustomeffects:20200121053129p:plain

テーマ系を動かすならlv_confのテーマに関する部分を1にしておく必要がある。
f:id:gsmcustomeffects:20200121052341p:plain
ダークテーマはこんな感じ
f:id:gsmcustomeffects:20200121052249g:plain

これでシミュレータの導入はできたと思いますのでご自分でやってみたい方は公式のドキュメントに沿って進めてもらえるといいと思います。
細かいカスタムの仕方および組み込み機器への導入方法はまた今度書きます。

参考文献

公式ドキュメント
docs.littlevgl.com

MIMXRT10xxのeFlexPWMを使ってPWM信号を出力する。

今回はどのマイコンでもよく使う機能の一つでもあるPWMについてやっていく。
MIMX系のマイコンではeFlexPWMというペリフェラルがそれにあたる。

特徴を解説したいところですが長すぎたのでRMのFeatures部分を貼っておくので読みたい人は該当部分を読んでください

f:id:gsmcustomeffects:20191215055621p:plain


テスト環境と留意事項

  • MCUXpresso IDE 11.1(2020,1/1時点で最新
  • MCUXpresso SDK 2.70(2020,1/1時点で最新)
  • MIMXRT1020-EVK(ここは使う環境によって変わる)

今回はNXP公式ボードのMIMXRT1020-EVKを使うことにする。
最近MCUXprressoSDKとIDEが最新版になりePWMのコンフィグツールが入ったので最新版を前提に進めていこうと思います。

eFlexPWM

モジュール自体の内部構造はこのようになっている。

f:id:gsmcustomeffects:20191215055940p:plain
PWM Submodule Block Diagram

ごく一般的な比較レジスタとカウンタの組み合わせ

クロックがIPG経由でもらえるのでかなり高速なPWMを生成可能
16bit分解能というスイッチング電源つくってくれと言わんばかりの機能。

生成できるPWMのタイプ以下の4つ

  • Center Aligned PWMs
  • Edge Aligned PWMs
  • Phase Shifted PWMs
  • Double Switching PWMs

f:id:gsmcustomeffects:20191215062935p:plain
PWM type

PWM 生成のながれ

f:id:gsmcustomeffects:20200104024216p:plain
PWM Generation Block Diagram(クリックで拡大)

eFlexPWMは主に上記のブロックで構成されている。
各機能を含めブロック詳細をこれから解説していく。

PWM Clocking

f:id:gsmcustomeffects:20200104025733p:plain
PWM Clocking(クリックで拡大)

モジュールのクロックはIPBUS_CLK(IPGクロックのこと) , EXT_CLK(外部クロック) , AUX_CLK(submodule0からのクロックを供給)の3つのクロックから選べる。
最後のAUX_CLKはsubmodule0をマスターとしてsubmodule1 , submodule2 , submodule3にクロックを共有できる機能。(submodule0は必ずIPBUS_CLK , EXT_CLKのどちらかから駆動する必要がある。

eFlexPWM Clock Blockの機能としては , Prescalerを内蔵しているので1~128で分周を設定できる。
ここで設定しないといけないのはクロックソースとPrescalerの2つであり、それにより16bit counterのクロック速度が決定する。

Register Reload Logic

f:id:gsmcustomeffects:20200104030858p:plain
Register Reload Logic(クリックで拡大)

eFlexPWM関連のレジスタはダブルバッファで構成されている。(動作中に片側は書き換え可能ということ
Register Reload Logic Blockは、ダブルバッファのリロードのタイミングを設定することができる。

まずMaster ReloadとLocal Reloadだが、Masterはsubmodule0から他のsubmodule1-3を同期してリロードしたい場合に使用する。
ややこしいので例を示すと

submodule0はLocal Reloadを使用
submodule1-3はMaster Reloadを設定

submodule0からのリロード信号でsubmodule1-3のリロードを実行という感じです。

次にLDOK(Load OK )についてだがMaster Control Register (MCTRL)LDOKビットのことでLoadOKのこと。
こいつがセットされるとダブルバッファレジスタのセットされた値を有効にする。
コンフィグツールとSDK使うならユーザーがケアする必要がないので詳しく知りたい方はRM(Reference Manual)のMaster Control Register (MCTRL)の項を読んでください。

Mod Compareは、Control Register (SM0CTRL - SM3CTRL)COMPMODEのことでこれもSDKのコンフィグツールで設定可能なのでユーザーはno careでいい

Half CompareはリロードをPWMのハーフでするかの設定。
Control Register (SM0CTRL - SM3CTRL)のHALFビットで設定可能。同様にしてFULLビットも設定可能。
これもSDKのコンフィグツールで設定可能なのでユーザーはno careでいい

Timer synchronization

f:id:gsmcustomeffects:20200104043708p:plain
Submodule Timer Synchronization(クリックで拡大)

Timer(counter) synchronizationはカウンタの初期化同期の機能を提供する。
LocalSync , Master Reload , Master Sync , PWM_EXT_Syncの4つから選べる。

LocalSyncはそのモジュール自体でPWM周波数などを制御する。
Master Reloadはsubmodule0のReload頻度に他のモジュールがロックされる。
Master Syncはsubmodule0のLocalSync信号がそのまま自身のcounter Init挙動になる。
PWM_EXT_Syncこれはチップ外の信号にcounter Init挙動を任せる。

FORCE_OUTのFRCENビットがセットされている場合は上記のどれがセットされていようがFORCE_OUT信号のアサート時にカウンターを初期化できる。
この機能はRM曰く

When PWM signals are commutated on an inverter controlling a brushless DC motor, it is necessary to restart the PWM cycle at the beginning of the commutation interval.
This action effectively resynchronizes the PWM waveform to the commutation timing.

とあるように転流タイミングでのPWM同期をとるためっぽい。

PWM Generation

f:id:gsmcustomeffects:20200104064228p:plain
PWM Generation(kurikkudekakudai )

VALn Register とコンパレータでH/L信号を作りPWMを生成する部分
このセクションもSDKコンフィグツールで

  • Center Aligned PWMs
  • Edge Aligned PWMs
  • Phase Shifted PWMs
  • Double Switching PWMs

選択することで勝手に設定されるのでユーザーはno careでいい
ちなみにDuty CycleとかPWM周波数もコンフィグで入力できる部分があるので楽に設定可能

Force Out Logic

f:id:gsmcustomeffects:20200104065733p:plain
Force Out Logic(クリックで拡大)

このモジュールは、直訳するなら強制出力。
ForceOut信号自体は8つから選択出来てその信号が有効になるとあらかじめ設定された出力に強制的に切り替わる
その時出力できるのが、PWM23(positive,negative)、OUT23、PWM_EXTAの4つ

OUT23はSoftware Controlled Output Register (SWCOUT)で設定でき常時1か0を出力する。

Deadtime Insertion Logic

f:id:gsmcustomeffects:20200104072900p:plain
Deadtime Insertion Logic(クリックで拡大)

ハーフブリッジとかフルブリッジとかで同時ON(ショート)を防ぐための機能
SDKコンフィグツールで時間入力する部分があるのでレジスタとかはno careでいい

Fault Protection

f:id:gsmcustomeffects:20200104074713p:plain
Fault Protection(クリックで拡大)

Fault保護機能のこと。
下のほうはデバッグ中PWM止めるか止めないかを選べる機能できちんと設定しておかないと勝手にPWMが止まることになる。

Faultピン(Fault0-3)の接続先だがこの辺の資料に外部回路の例が載っているのでまじめにやるならばACMP(Analog Comparator)とFaultピンをXBARでリンクするなりの工夫が必要。
それ以外はXBARの内部接続機能でHIGH,LOWどっちか固定を選べる。

https://www.ti.com/jp/lit/an/jaja502a/jaja502a.pdf

https://www.analog.com/media/jp/technical-documentation/application-notes/jan105.pdf

http://www.ti.com/jp/lit/ml/jajy091/jajy091.pdf

Output Logic

f:id:gsmcustomeffects:20200104233735p:plain
Output Logic(クリックで拡大)
PWMの極性設定ができる。

実際にやっていく

ここまででPWMモジュールのブロック図の中身をあらかた解説したので次はMCUXpressoSDK内臓のペリフェラルコンフィグツールを使ってPWM出力を行う。
まず新規プロジェクト作成でpwm , xbaraをインポートしてプロジェクトを作成する。

f:id:gsmcustomeffects:20200105003608p:plain
新規プロジェクト作成

クロックの設定

f:id:gsmcustomeffects:20200105005003p:plain
クロックの設定
クロックのルートはコアクロック付近からもらってきているのでだいぶ高速である。
そのため自分に合ったところに落とすために周辺にある分周器に印をつけておいた。

ピンの設定

f:id:gsmcustomeffects:20200105020516p:plain
ピンの設定

PWM1を使うこととして、引き出せるピンの都合上、submodule3を使うことにする

f:id:gsmcustomeffects:20200105021334p:plain
使用するピン

PWMペリフェラルの設定

MCUXpressoSDK ペリフェラルコンフィグツールでPWM1を選択して画面を開く

設定値はあくまで参考程度だと思ってください

f:id:gsmcustomeffects:20200105035003p:plain
peripheral設定(クリックで拡大)
f:id:gsmcustomeffects:20200105035941p:plain
peripheral設定(クリックで拡大)
f:id:gsmcustomeffects:20200105040427p:plain
peripheral設定(クリックで拡大)

メインコード

一応動作済みのコードを示す。

Duty変更時のディレイはSystickタイマーで作っています。
PWM_SetPwmLdok(PWM1_PERIPHERAL, (kPWM_Control_Module_3), true);
PWM_StartTimer(PWM1_PERIPHERAL, (kPWM_Control_Module_3));

の部分はコンフィグツールのバグでsubmodule0のコードしか吐いてくれないのでやむなくmainでLoadOKとタイマーセットをしてる感じです。

ループではPWM_UpdatePwmDutycycleでDutyを更新してLDOKを読んでレジスタをReloadしているだけなので簡単ですね。

#include <stdio.h>
#include "board.h"
#include "peripherals.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "MIMXRT1021.h"
#include "fsl_debug_console.h"
#include "fsl_xbara.h"
/* TODO: insert other include files here. */

/* TODO: insert other definitions and declarations here. */

/*
 * @brief   Application entry point.
 */

uint32_t delayCount;

void SysTick_Handler(void)
{
    if(delayCount != 0x00)
    {
    	delayCount--;
    }
}

void Systick_delay(uint32_t ms){
	SysTick->LOAD  = (SystemCoreClock/1000 & SysTick_LOAD_RELOAD_Msk) - 1;
	delayCount = ms;
	while(delayCount!=0x00);
}
int main(void) {

  	/* Init board hardware. */
    BOARD_InitBootPins();
    BOARD_InitBootClocks();
    BOARD_InitBootPeripherals();
  	/* Init FSL debug console. */
    BOARD_InitDebugConsole();


    PRINTF("Hello World\n");
	SysTick_Config(SystemCoreClock/1000-1);
    PWM_SetPwmLdok(PWM1_PERIPHERAL, (kPWM_Control_Module_3), true);
    PWM_StartTimer(PWM1_PERIPHERAL, (kPWM_Control_Module_3));
    while(1) {
        for (int i = 0;  i <=90;  i=i+10) {
        	PWM_UpdatePwmDutycycle(PWM1_PERIPHERAL, kPWM_Module_3, kPWM_PwmA, kPWM_SignedCenterAligned, i);
        	PWM_SetPwmLdok(PWM1_PERIPHERAL, (kPWM_Control_Module_3), true);
        	Systick_delay(2000);
		}
        __asm volatile ("nop");
    }
    return 0 ;
}

動作時の波形はこのような感じです。

f:id:gsmcustomeffects:20200105041223p:plain
PWMの波形
f:id:gsmcustomeffects:20200105042636p:plain
PWMの波形

LEDの点灯密度もきれいに取れたので貼っておきます

f:id:gsmcustomeffects:20200105055900p:plain
PWMでLED点灯をしている図

PWM周波数が20kHz となっているので正しく波形が出ていることが確認できる。

参考資料

i.MX RT1020 Processor Reference Manual