2021年05月29日

PIC32MX2XX RB5ポート注意点

先日、PIC32MX2XXシリーズを使用していて、RB5ポートの出力が意図通りに動かない問題に遭遇しました。今回はその原因と解決方法を紹介したいと思います。PIC32MX250F128BをターゲットにMPLAB X v5.45+Harmony3+XC32 v2.50を使用しています。


RB5ポートをHarmony3のPin SettingsでFunctionをGPIO、DirectionをOutに設定し、コード上でONにしましたが、RB5のみ2.2V付近の中途半端な電圧が出力されるのみで意図したIO変化をさせることができませんでした。

PinSetting.jpg


一般的なPICのGPIOポート設定でよくあるミスとして
・アナログ入力がONになっている(ANSELXが0でない)
・JTAGポートがONになっている(JTAGEN=ON)
・入力専用のポートだった
・OpenDrain設定だった(ODCXが0でない) or OpenDrain専用ポートだった
ということが多々あります。

今回は上記でもなく、MPUのエラッタと思い調べてみましたが、「I2C2モジュールが有効の場合にRB5、RB6がうまく動かない」というエラー以外はなく、I2C2を使用していないため、エラッタでもなさそうです。


データシートのピンアサインを調べてみるとRB5はUSBID用のポートとなっており、USBID関連の設定を見るとHarmony3のデフォルト設定が
USB USBID Selection bitがONとなっており、USBを使用していないにも関わらずデフォルト設定がONになっていることが分かりました。USB USBID Selection bit(FUSBIDIO) をOFFに設定すると意図通りにRB5のON、OFFができるようになりました。


USB_ID_DISABLE.jpg

USB機能があるPIC32MX2XXシリーズ固有の問題ですが、初期設定でUSB USBID Selection bitがUSB側になっているのは不親切だと思いました。ポートが意図した動作をしない場合はポートに割り当て可能な機能について設定状況を一折調べることが大切です。特にUSBやJTAG系の設定はGPIO設定とは設定項目が異なるため、見落としがちなので注意が必要です。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2021年03月06日

Nuclei StudioとGD32FV103試食

Sipeed Longan Nanoの開発環境の構築と試食としてUARTの出力について紹介します。Sipeed Longan NanoはRISC-VベースのマイコンGD32VF103CBT6を搭載した評価基板です。マイコン以外にLED、OLEDディスプレイやSDカードスロットが搭載されて1000円弱とお手頃です。

longannano.jpg

Sipeed Longan Nanoの開発環境として、VisualStudioCode+PlatformIOの組み合わせで使用する場合がほとんどだと思います。一方で開発環境のバージョン差による影響を抑えたい場合や社内利用で追加パッケージを入れずらい、入れられないといった場合があると思います。そのような場合におすすめなのがNuclei Studioです。GD32VFマイコンのアーキテクチャを開発しているNuclei社が無償で提供しています。Eclipseベースの開発環境でWindowsやLinux向けのインストーラが準備されています。STM32マイコンのSW4STM32やSTM32CubeStudioを使用したことがある方ならそのまま同じような感覚で利用することができます。

nuclei_studio.jpg

Nuclei Studioはこちらの公式サイトからダウンロードしてください。Zipを解凍してNucleiStudio内のeclipse.exeをクリックするとNucleiStudioが起動します。開発環境にサンプルプログラムが含まれているため、今回はサンプルプログラムベースにGD32FV103を試食します。まず、File→New→C/C++ Projectを選択します。


nuclei_studio_1.jpg


C Managed Buildを選択します。

nuclei_studio_2.jpg



適当なProject名を設定します。ProjectTypeにはNuclei SDK Project For GD32VF103 Socを選択しました。

nuclei_studio_3.jpg


 Board選択はgd32vf103v_evalを選択しました。

nuclei_studio_4.jpg

いくつかサンプルが準備されていますが、baremetal_helloworldを選択しました。他の設定は必要に応じて選択します。例えば、printfでfloat出力する場合は下記の様に対応するNEWLIBを選択します。

nuclei_studio_5.jpg

以降の設定はデフォルトのまま、次に進め、Finishをクリックします。

nuclei_studio_6.jpg

nuclei_studio_7.jpg


今回のbaremetal_helloworldはMISA情報をprintf出力します。今回はprintfの出力先をuart0に出力させます。プロジェクトフォルダ内のnuclei_sdk→SoC→gd32vf103v_rvstar→Includeのnuclei_sdk_hal.hをクリックし、下記を書き換えます。

GD32_COM0
から
USART0
に設定します。

また、main.cのグローバル関数に下記を追加します。
void usart_init(void) {
 rcu_periph_clock_enable(RCU_USART0);
 rcu_periph_clock_enable(RCU_GPIOA);
 gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
 gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
 USART_BAUD(USART0) = (58 << 4) | (10 << 0); //115200bps@108MHz
 USART_CTL0(USART0) = USART_CTL0_TEN | USART_CTL0_REN;
 USART_CTL0(USART0) |= USART_CTL0_UEN;
}

main関数頭に
usart_init();
を追加します。

書き換えたコードを保存して、Ctrl+bでプロジェクトをビルドします。Debugフォルダ内にプロジェクト名.hexファイルができているはずです。

書き込みツールは「GD32 MCU Dfu Tool_vXXXX」をダウンロードします。ファイルを7Zip等で解凍し、フォルダ内のドライバGD32 MCU Dfu Drivers_vXXXX.exeをクリックし、ドライバをインストールします。

nuclei_studio_8.jpg

GD32 MCU Dfu Tool_vXXXフォルダ内のGD32 MCU Dfu Tool.exeをクリックし、書き込みツールを起動させます。アップデート有無を聞いてきますが、いいえを押して無視します。Sipeed Longan NanoとPCをUSBで接続し、BOOTボタンを押しながらリセットを1秒程度押してから離すと書き込みモードになります。スイッチのチャタリングなのか、書き込みモードに入っても書き込みに3回に1度ほど失敗します。そのような場合は再度、Resetボタンでリセットさせてから、書き込みモードにして書き込みを行います。認識するとDFU Deviceにデバイスが自動で「GD DFU Device1」といった表示がされます。

nuclei_studio_9.jpg

Download to Deviceにチェックを入れて、Openで先ほどのプロジェクトフォルダ内のDebugフォルダ、***.hexファイルを選択し、画面下のOKボタンを押すと書き込みが開始されます。100% Download successfully!が表示されれば書き込み完了です。Resetボタンを押すとコードが実行されます。

USBシリアル変換アダプタ等をSipeed Longan NanoのT0、GNDを配線してTeraterm等で開くと出力結果を確認できます。サンプルプログラムをベースに簡単にprintf出力することができました。J-tagのデバッガなしでも本体のみでUSB経由で書き込めるのは非常に楽だと思いました。今後はデバッガーを使ったデバッグ方法やSPI、I2C等のペリフェラル機能を使ってみたいと思います。

posted by Crescent at 00:00| Comment(2) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2021年02月13日

掃除機 吸引圧その2

今回も先日の掃除機の吸引圧について追加検討した内容を少し紹介します。前回は紙パックを交換した直後の圧力変化を測定してみましたが、今回は紙パックがごみで満杯な状態で測定しました。

前回、掲載した結果と同じですが、紙パック新品の場合で吸引パワーを3段階切り替え可能で標準→強→弱の順に切り替えてみました。

掃除機圧力_.jpg


標準で1012hPaから996hPaまで低下、強で993hPa、弱で1004hPaとなりました。まとめると標準で-16hPa、強で-19hPa、弱で-8hPaという感じです。

続いて、紙パック満杯の状態で吸引パワーを3段階切り替え可能で標準→強→弱の順に切り替えてみました。

満杯.jpg

標準で1016hPaから996hPaまで低下、強で993hPa、弱で1005hPaとなりました。まとめると標準で-20hPa、強で-23hPa、弱で-11hPaという結果となりました。

紙パック新品と紙パック満杯で比較すると3~4hPa程度低下することが分かりました。想定よりも差が小さいことが分かりました。紙パックの状態を可視化するためには各吸引パワーモードを切り替える際の圧力勾配の変化等も合わせて測定する必要がありそうです。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2021年01月30日

掃除機 吸引圧

今回は掃除機の吸引圧について事前検討した内容を少し紹介します。なぜ、掃除機の吸引圧を検討したかというと紙パックの容量を可視化できたら便利だと思ったからです。市販品の掃除機では紙パック詰まりを表示して交換を促す製品もありますが、定量的に紙パック容量を可視化しているものはあまりありません。

今回はマキタの掃除機CL107FDに新品の紙パックを使用した状態でダストボックス内の紙パックとファンの間に圧力センサを入れ込んで吸引圧を調べてみました。

圧力センサはST製 LPS22HHの評価基板を使用して、USBシリアルI2C変換基板でPCに接続して1秒周期でNode-Redからリアルタイムに可視化してみました。
cleaner.jpg

今回の掃除機は吸引パワーを3段階切り替え可能で標準→強→弱の順に切り替えてみました。


掃除機圧力_.jpg

標準で1012hPaから996hPaまで低下、強で993hPa、弱で1004hPaとなりました。まとめると標準で-16hPa、強で-19hPa、弱で-8hPaという感じです。


掃除機圧力2_.jpg

続いて標準状態で紙パックにごみが堆積して詰まったと仮定してノズル先端を手で押さえて検討してみました。標準の996hPaから987hPaまで低下し、-9hPa程度内部の気圧が低下することが分かりました。

実際の掃除では掃除機のモードによる気圧変化だけでなく、更に掃除機のノズル形状、絨毯かフローリングかで若干基準が変わります。圧力センサを入れるだけで容易に紙パック容量を可視化というのは難しいかもしれませんが、見込みはあることが分かりました。定常的な圧力だけでなく、圧力変化の勾配等、圧力センサを活用して面白いセンサを検討してみたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年12月19日

絶縁コンバータノイズ対策

今回は絶縁コンバータのノイズ対策について紹介します。絶縁コンバータは非絶縁コンバータに比べて、ノイズ対策に工夫が必要です。


非絶縁コンバータの場合、入出力でGNDが共通のため、主にディファレンシャルモードのノイズを考慮した設計が必要です。出力とGNDにコンデンサを並列に挿入したり、出力部にインダクタを直列に挿入することでディファレンシャルモードのノイズは容易に抑制することが可能です。なお、非絶縁コンバータの場合はコモンモードノイズはGNDや入出力を介してそのまま伝搬するため、入力段にコモンモードノイズフィルタを挿入して対策することが一般的です。

一方、絶縁コンバータの場合は当然ながら入出力でGNDが絶縁されているため、GNDが共通ではありません。GNDを入力と出力で分けることができるため、鉄道や自動車、産業用途などのノイズが多い環境下で多く使用されています。GNDが絶縁されているため、入力側のノイズを受けにくくなりますが、絶縁コンバータを使用すれば、ノイズの影響を受けない、ノイズが少ないという訳ではありません。絶縁コンバータに適切なノイズ対策をすることで絶縁によるノイズ抑制効果を発揮します。

dcdc_only_diff.jpg

絶縁コンバータに適切なノイズ対策とはコモンモードノイズ対策です。ディファレンシャルモードのノイズ対策は非絶縁コンバータ同様の対策で比較的容易に対策できますが、コモンモードノイズの対策はディファレンシャルモードのノイズに比べると容易ではありません。

絶縁コンバータは絶縁トランスを介して、入力側と出力側が接続されています。絶縁トランスが理想的にインダクタ成分のみであれば問題ありませんが、実際の絶縁トランスは入出力間に数10pF~100pF程度の静電容量を持っています。この静電容量と入力側のスイッチング(200kHz~1MHz程度)によってコモンモードノイズを発生させます。負荷や回路構成によって異なりますが、入力側のスイッチングが1MHz程度と高い場合であっても、コモンモードノイズに低い周波数(10k~100kHz程度)のピークが発生する場合があります。


コモンモードノイズは対象機器内部だけでクローズされた回路であれば、対象機器内部全体が揺れるため、比較的問題を受けにくい傾向があります。一方で信号を他の機器から受ける、他の機器へ信号を出すという場合には考慮が必要です。例えば、外部のセンサ信号を機器が受けて、増幅する場合にコモンモードノイズが影響します。外部のセンサ信号をアンプ(差動アンプでない)で増幅することで信号のインピーダンスとGNDのインピーダンスに差が生まれます。このインピーダンス差からコモンモードノイズがアンプ出力側にノイズとして表れることがあります。コモンモードノイズフィルタや差動アンプといった対策が必要です。電源系の至るところに様々な容量のコンデンサを追加してもノイズの現象が改善しないしない場合の多くはコモンモードノイズの影響が疑われます(それ以外は放射ノイズを受けている可能性がある)。外部のAC電源から入るノイズと切り分けをする場合は電池で駆動させてノイズを見ます。電池でもコモンモードノイズが発生する場合は絶縁コンバータがノイズ源か疑います。


このような絶縁コンバータによって生じるコモンモードノイズは下記のような対策で改善できる場合があります。回路設計や機器構成によってコモンモードノイズはノイズの出方や対策が異なるため、対策については参考に紹介します。

@絶縁入出力間のリターン回路
絶縁トランスの容量によって出力側に発生するコモンモードノイズに対して、リターン回路をつくることでコモンモードノイズを低減できます。具体的には入力側と出力側(もしくは基準となる端子)を数1000pFのコンデンサで接続させます。トランスの容量よりも同じor大きければコモンモードノイズ対策としては十分です。この容量を更に増やすと漏れ電流が大きくなり、ノイズ環境下で漏電ブレーカが頻繁に作動するといった不具合が発生します。この問題を防ぐため、数1000pF程度に抑える必要があります。また、コンデンサの耐圧は絶縁コンバータの絶縁耐圧に合わせた電圧を選定します。多くは1kV以上の耐圧を選択します。


dcdc_diff_and_simple_common.jpg

絶縁入出力間のリターン回路は入力側のスイッチング素子がない方と出力側のダイオードがない方を結合させます。絶縁コンバータの内部構成が不明な場合は必要に応じて両側にリターン回路を実装します。リターン回路は絶縁コンバータに可能な限り近い場所に実装します。


Aコモンモードノイズフィルタ
絶縁入出力間のリターン回路の対策@ではコモンモードノイズのピークを抑えることができますが、全体的なコモンモードノイズを低減させるためにはコモンモードノイズフィルタを入出力の両側に実装します。片側のみの場合はコモンモードノイズがもう片方から出てしまうため、両側かつ絶縁コンバータから近い場所に実装することが理想的です。


dcdc_diff_and_fully_common.jpg


コモンモードノイズは対策が難しく、発生源の特定も難しい場合が多々あります。ポイントはコモンモードノイズ対策が不十分な場合、絶縁コンバータ自体もコモンモードノイズの発生源になり得るということです。それらを踏まえた上で回路設計、ノイズ評価を行うとスムーズに対応できます。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする