ArsenicLAB

ロボット工学がメイン

IMUのチップをプリント基板に実装する

IMUのチップはQFNパッケージというICからピンが伸びていないパッケージで提供されることが多く、手作業によるはんだ付けが困難です。
IMUチップを自作基板等に実装することができれば、基板の小型化、最適化が期待でき、ドローン等の小型のロボットに組み込む際に便利です。

この記事では自分がIMUチップをプリント基板に実装するために行った手順やノウハウ等をまとめたいとおもいます。
自分がやってみた感じ特殊な技能は必要としなかったので、どなたでも作成可能だと思います。

自分が作成する基盤の仕様は以下です、基板設計ツールはKiCADを使用しています。

目次

 基板設計

KiCADを使用して外注用の基板データを作成するまでの流れを解説します。

KiCADにライブラリをインポート

KiCADでMPU9250を使用するために、MPU9250の回路図、フットプリント等が含まれるライブラリを使用します。ライブラリを使わなくても、KiCADの機能で自分で回路図やフットプリントを作成することもできますが、面倒なため外部のライブラリを使用しました。

使用するライブラリはPCB Part Libraryというもので、KiCADへの導入方法はここが参考になります。

回路図設計

MPU9250の周辺回路を設計します、マイコンボードの周辺回路については、以前書いたこの記事が参考になるかと思います。

IMUの周辺回路はデータシート通りに作成していくだけでOKなので、MPU9250のデータシートを参考に設計しました。

f:id:Arsenic25:20200227172613p:plain

引用:invensense.com MPU9250 datasheet

 今回はSPIで通信するので、右の回路をそのまま実装しました。

f:id:Arsenic25:20190102021815p:plain

 基板パターン設計

回路設計ソフトを使って実際の基板レイアウトをデザインしていきます。
とくに注意点はないですが、IMUのx, y, z軸は基板に配置した際に決まるので、こだわる場合はチェックしておいた方が無難です。実装後にどっちがx軸かわかるようにシルクパターンで矢印等書いておくといいかもです。

自分は割と適当に設計しました。

f:id:Arsenic25:20200227202703p:plain

 プリント基板の外注

外注サイトに依頼してプリント基板を作ってもらいます。
お金がある場合は日本国内の基板外注サイトで作ってもらってもいいですが、1万円以上するので、自分は中国のサービスを利用してプリント基板を作成しています。基板サイズにもよりますが、10枚程度発注して送料含めて3000円くらいです。今回はステンシルを付けるので1000円ほど高くなります。

ステンシルは、はんだ付けが必要な個所に穴が開いている薄い金属板で、液状のはんだペーストをステンシルを重ねた基板の上から付着させることで、プリント基板の適切な個所に精密にはんだを付着させるためのものです。

今回はFusionPCBを使って発注を行いました、KiCADから外注用のデータ出力方法はこちらを参考にさせていただきました。

届いた基盤とステンシルはこんな感じです

f:id:Arsenic25:20200227210029j:plain

プリント基板作成

リフローをしてプリント基板を作成します。リフローの全体的な流れをつかむには以下の動画が参考になりました。


「自宅で出来るリフローお試しキット」の紹介VTR

はんだペーストの塗布

ステンシルを用いてプリント基板にはんだペーストをぬり付けます。プリント基板を固定する際に、大きなアルミ板等に、使わない他のプリント基板やユニバーサル基板を組み合わせてプリント基板をテープで固定するとズレにくかったです。ステンシルをいい感じに固定してはんだペーストを塗布します、いらないカードやいらない基板等を用いて塗布していきます。上に貼った動画を見ると塗り方が大体つかめるかと思います。

ぬった後がこんな感じです。

f:id:Arsenic25:20200227210329j:plain

あんまりうまく塗布できてませんが、こんな具合で大丈夫です。気になる場合はピンセット等で形を整えてもいいかもです。

表面実装パーツの設置

ピンセットで表面実装パーツをマウントしていきます。動画でも説明されていますが、はんだが解ける際に表面張力でいい感じに位置が整うので、ある程度雑においても大丈夫です。体感だと、QFNパッケージは半ピッチくらいならズレていてもリフロー時に正しい位置に戻ってくれます。

リフローではんだ付け

本当はリフロー炉等を用いてリフローを行うのが正しいやり方だと思いますが、個人でやるには難しいので動画でもあるようにホットプレートでリフローを行います。

自分が使ったホットプレートはこちら

リフローはんだ付けを行うプリント基板と、温度測定用の基板を配置して、テスターの測温抵抗器を用いて温度を測りながらリフローを行いました(下図)。
リフローを行う際の温度変化のさせ方はこの資料の6章が参考になりました。なるべくこんな感じの温度変化になるようにホットプレートのつまみを回して焼きます。
IMUが焼けてしまうのではないかと気になる方はIMUのデータシートにもリフロー時の推奨温度等が記載されていますので、そっちも参考になると思います。

f:id:Arsenic25:20200227212412j:plain

リフローが終わった直後の基板がこちら

f:id:Arsenic25:20200227212640j:plain

ところどころはんだがブリッジしているところがあるので、治してあげる必要があります。

はんだ付けの手直し

はんだがブリッジしているところを手直しします。
該当箇所にフラックスを塗布して、はんだごての先でなでてあげるだけで基本的にはブリッジが解消されます。それでも治らない場合ははんだ吸い取り線等を使って優しくはんだを除去します。

あとは表面実装以外のパーツを実装して基板は完成です。

ステンシルの洗浄

ステンシルを一度使用すると、はんだペーストで汚れて、とくにQFNなどの小さいピンの部分は穴がペーストでつぶれてしまうので、洗浄する必要があります。

正しいやり方かどうかわかりませんが、ステンシルにアルコールを流しながら歯ブラシで割と強めにごしごし磨いて、キッチンペーパーでふき取るときれいに取れました。これでステンシルを再利用できます。

 

IMUのマイコンでの使用方法の概要もまとめているのでそちらも参考にどうぞ

 

arsenic.hatenablog.com

 

2020/7/4 追記

作成した基板ではQFNパッケージ裏のExposed Die Padにはんだ付けしちゃっているのですが、MPU9250を含めたinvensense製のセンサはExposed Die PadとPCBをはんだ付けしちゃうことを否定しているぽいです(下記ツイート参照)Exposed Die Padをはんだ付けしちゃうと、熱膨張の応力等で、センサ性能が変わってしまうとのこと。

詳しくは公式資料「InvenSense MEMS Handling 」を参考ください。

【入門】マイコンでIMUを使う

ここ数年でIMUを使った開発が多かったので、これからIMUを使ってみたいという人向けに(主にマイコンでの)IMUの使用方法等についてまとめたいと思います

 IMUとは?

IMUとはInertial Measurement Unit(慣性計測装置)の頭文字をとったもので、主に加速度と角速度を検出するための装置です。3次元空間上でのx軸,y軸,z軸上での加速度を検出できる加速度センサは、3軸加速度センサと呼ばれます。同じようにx軸,y軸,z軸まわりの角速度を検出できる角速度センサは、3軸角速度センサと呼ばれます。

IMUには6軸IMUや9軸IMUと呼ばれるものがありますが、6軸IMUは上記の(3軸加速度)+(3軸角速度)を検出できるセンサという意味になります。9軸のIMUはこれに地磁気センサを3軸追加したもので、厳密には地磁気は慣性ではありませんが、よく一緒に搭載されるためIMUでひとくくりにされて呼ばれることが多いです。

加速度センサ

  • センサが取り付けられた物体の加速度を検出できる
  • 重力加速度も同時に検出できるため、重力方向の検出等にも応用できる

角速度センサ

  • センサが取り付けられた物体の角速度を検出できる
  • 角速度を時間積分することで、角度の変化を検出できる
  • オフセット(一定量のノイズ)が乗りやすい特性がある

IMUと似た言葉でAHRSという言葉があります。これは、Attitude and Heading Reference System(姿勢方位参照システム)の略で、物体の3次元空間上における姿勢を測定するための装置のことです。ここで言う姿勢とは、物体がどのような回転具合(姿勢角)で存在しているか(ロール,ピッチ,ヨー等)を意味します。

加速度センサと、角速度センサの情報を統合すると物体の3次元姿勢が推定できるため、IMUはよくAHRSに用いられます。複数のセンサの情報を統合することをセンサフュージョンといいます。IMUの姿勢推定のためのセンサフュージョンアルゴリズムは様々なものがあります、これは後に紹介します。

マイコンでのIMUの利用

マイコンでIMUを使用する際に、選択肢として

  • 市販のセンサモジュールを使用する
  • IMUのチップを購入し、自分で基板実装する

等が挙げられます。前者は、購入したモジュールを仕様書通りに使えばよいので楽です。後者の場合少し工数がかかり面倒ですが、個人でも十分に作成可能だと思います。

センサモジュールを使用する

IMUのセンサモジュールは、様々な通販サイトで販売されているため、入手には困らないと思います。購入する際には、センサモジュールのインターフェイスを確認して、マイコンで使用可能かどうかをチェックしましょう。マイコンで利用する場合、I2CやSPI,UART等のインターフェイスを搭載したモジュールが便利です。
I2CやSPIをインターフェイスとして搭載したIMUでは、内部レジスタに書き込み、読み込みを行うことで、IMUの設定(センサ感度等)、センサデータの読み出しを行うものが多いです。

高精度で高価なIMUモジュールには、インターフェイスがUSBであるものもあります。この場合、PCに接続しROS等を用いてセンサデータを処理するのが一般的です。また、高価なIMUモジュールには姿勢推定が機能として既に内蔵されているものもあります。

チップを購入し、基板実装する

IMUのチップはGigiKeyやMouser,マルツ等の通販サイトで個人でも入手可能です。ただし、QFNパッケージのような手作業によるはんだ付けが困難なものが多いため、実装するためには、プリント基板を外注し、はんだペーストとステンシルを用いてリフロー等を行う必要があります。

 

f:id:Arsenic25:20200227005948p:plain

出典:mouser.jp

プリント基板を外注し、自作基板にIMUを実装する方法については、こちらの記事で解説しています。

arsenic.hatenablog.com

 

 IMUでの姿勢推定

IMUを使用する目的として一番多いのが姿勢推定としての使用だと思います。ここでは代表的なIMUを用いた姿勢推定手法について概要を話します。

 相補フィルタ

相補フィルタは、加速度センサの低周波成分と角速度センサの高周波成分を足し合わせて姿勢を推定する手法です。

加速度センサから姿勢を推定するには、重力加速度の向いている方向を検出すればよいですが、加速度センサなので、重力加速度以外の通常の加速も検出してしまいます。重力加速度は一定(低周波成分)なので、通常の加速度(高周波成分)が邪魔です。

一方、角速度センサから姿勢を推定するには角速度センサの出力値を積分すれば、姿勢角の変化が求まります、ただし角速度センサにはオフセットが含まれるため、単純に積分をしてしまうと、オフセットも一緒に積分してしまい、角度が発散してしまいます。角速度センサはオフセット(低周波成分)が邪魔です。

これらの二つのセンサのそれぞれ邪魔な成分を取り除き、姿勢推定に都合のいい部分だけを取り出して姿勢推定を行おうというのが相補フィルタです。実際の実装方法は以下資料がわかりやすかったです。(実装方法は39ページを参照)

自律型ホバリング・ヘリによる各種センサ説明

拡張カルマンフィルタ(EKF)

カルマンフィルタは、センサ測定システムに正規分布に従うノイズが入ると仮定した時に、センサ測定値から確率論的に最も確からしい状態を推定する手法です。

拡張カルマンフィルタは、カルマンフィルタの線形近似バージョンで、姿勢とセンサ入力の関係を表した状態方程式非線形な場合にも対応できるカルマンフィルタです。(通常のカルマンフィルタは線形システムのみ対応)

恐らくIMUの姿勢推定で最も有名な手法です。

Madgwickフィルタ

原論文曰く、拡張カルマンフィルタを用いた姿勢推定より高速で、かつ同等以上の精度で姿勢推定を行える手法。相補フィルタの一種らしいです。

原論文は"An efficient orientation filter for inertial andinertial/magnetic sensor arrays"

論文の最後にC言語での実装例が載っています。

SW4STM32でコンパイルエラー「program "gcc" not found in PATH」「program "g++" not found in PATH」

SW4STM32で作業してたら急に上記エラーをはいた

さっきまで普通にコンパイルできていたのに何故??

結論

根本解決はできていないが、きちんとコンパイル→STM32マイコンへ書き込みはできるようになった

方法

新しくプロジェクトを作成してプログラムを移植(コピペ)したら動いた

ただし、移植元と同じ方法でプロジェクトを作成しなければうまくいかなかった

自分の場合、STM32CubeMXのコード自動生成から、SW4STM32プロジェクトを作成しているので、同様に新しく作成するSW4STM32プロジェクトも作成元のSTM32CubeMXプロジェクトのコード自動生成から作成する。

SW4STM32の[File]→[New]→[C Project]からプロジェクトを新規作成し、プログラムコードと、自動生成されたHALコードをコピってもうまくいかなかった。

program "gcc" not found in PATH...のエラーが発生する瞬間

自分の場合、はじめは正常にコンパイルできていたが、開発中に気づいたら「program "gcc" not found in PATH」エラーが発生していた。

今回いろいろと調べているうちにこのエラーが発生するトリガーとなる操作の一つがわかったので報告。

[プロジェクトのProperties]→[C/C++ General]→[Preproceccor Include Paths, Macros etc]→[Providers]→[CDT Cross GCC Built-in Compiler Settings]

にチェックを入れた瞬間に「program "gcc" not found in PATH」「program "g++" not found in PATH」エラーが発生するようになった。

「じゃあチェック外せばいいじゃんw」と思ってチェックを外したが、エラーが消えなかった、今のところこのエラーを消す方法はプロジェクトの再作成しか自分は知らない

とりあえず詳しく理解するまではここの設定はいじらないようにしようと思う

f:id:Arsenic25:20190222045749p:plain

 

STM32マイコンの基板設計

入手性がよく高性能ということで、今まで使ったことのないSTM32マイコンにチャレンジしようとして、いろいろ苦戦しました。マイコンの基板設計は昔ルネサスエレクトロニクスのRX62Gマイコンで一度だけ設計したことがありましたが、知識不足の状態で設計したため、クロックが発振すらぜずに失敗に終わったため、難しそうな印象がついてました。

Nucleo等の簡単に開発を始められる評価基板から入ってもよかったのですが、今回はAmazonで購入したドローンキットに搭載するマイコンボードを求めていたので、ドローンに乗るように極小サイズのSTM32マイコンボードを制作することにしました。この記事では、自分がSTM32マイコンを用いてドローン用の制御基板を作るまでの過程を書いていこうと思います。これからSTM32マイコン基板を作ろうとしてる方の参考になれば幸いです。

STM32マイコンについて

正直ほとんどSTM32マイコンに関する知識がなかったので、基板設計をするにあたり何から手を付ければよいか、というか何をすればいいかすらよくわからず、とにかくSTM32マイコンについて調べてたところ、こちらの記事がとても参考になりました。STM32マイコンの開発全体の概要をつかめると思います。

自分がSTM32マイコンを選んだ理由としては

  • 動作周波数が高く、強そう

自分が今まで使ってきたRenesasマイコンやMbed, Arduinoなどは高くても動作周波数100MHz以下だったので、動作周波数だけでスペックが決まるわけではないが、STM32マイコンには動作周波数の高いマイコンが多く、様々なドローン用フライトコントローラーに採用されているのもあり、ドローンの制御に十分なスペックがあるだろうと判断し、採用しました。

  • チップが秋月で簡単に手に入る。

秋月でチップ単体で売っているのが個人的に評価が高いです。秋月で売ってるとなんか安心感ありますよね。

  • 興味がある

純粋に使ったことないから興味がある、使ってみたい、学ロボとかでも使われてるっぽい。凄そう。

 

作成する基盤の仕様

ドーローンに搭載するので、小型にするため、なるべく実装するパーツが少なくなるように仕様を決めました。

  • STM32マイコンはSTM32F405RGT6(秋月で売ってるやつ)
  • 無線通信用としてXBee使う
  • 姿勢推定用IMUはMPU9050
  • 書き込みはUART
  • プロペラブラシレスのESC制御PWM出力x4
  • 拡張のためのI2CとUARTインターフェイス

 

回路設計

仕様を決めたはいいものの、STM32マイコン自体の使い方がよくわからなかったので、基板設計ではほとんどSTM32のデータシートとにらめっこする作業で、自分の知りたいことがデータシートのどこに載ってあるのかを見つけるのに苦労しました。

データシート等は公式サイトでダウンロードできます、(日本語)と表記があるものは日本語対応してます。

公式ドキュメント:https://www.stmcu.jp/design/

以降参考にした公式ドキュメントをAN****といった、公式ドキュメントの通し番号で表現します。STマイクロの公式サイトの検索欄より、通し番号で検索するとドキュメントのページが見つかると思います。ページの真ん中に最新の英語ドキュメントのダウンロードリングがありますが、日本語対応しているドキュメントは右下に日本語版のダウンロードリンクも貼ってあります。

f:id:Arsenic25:20190101174313p:plain

 

ドキュメントの中でも特にこの資料は読んでおくべきだと思います。日本語で回路設計全体の知識が網羅されています。サンプル回路、PCB設計での推奨パターンまで乗ってる素晴らしい資料です。

ドキュメントAN4488:STM32F4xxxx マイクロコントローラ・ハードウェア開発の手引書

基板設計ツールはKiCADを使用しました。

 

回路を設計する前に

KiCADを使って、いきなりゴリゴリ設計を始めてもいいのですが、あらかじめSTM32CubeMXで、マイコンのどのピンに何の機能を使うかを定義して、回路設計を始めることがおすすめです。

STM32CubeMXとは下のようなソフトでSTM32マイコンの周辺機能をピンに割り当て、それに対応したコードを生成してくれるツールです。STM32CubeMXで使いたい周辺機能をあらかじめピン割り当てしておくことで、基板設計時にピンの配線ミスなどが減ると思います。

f:id:Arsenic25:20181231194242p:plain

 

電源回路設計

マイコンの電源周辺回路は資料AN4488の「2 電源」にて説明されています、言われたとおりにコンデンサをつなぐだけです。また同じ資料の「8.3 電源デカップリング」にて、プリント基板での推奨設計パターンも説明してあるので参考程度に見ておきました。

f:id:Arsenic25:20181231213829p:plain

今回設計する基板の電源は、LiPOバッテリーからESCに内蔵されたBECを通して約5Vに降圧されたものを基板へ供給するので、5Vからマイコンの動作電圧である3.3Vまで降圧させる必要があります。秋月で適当な3端子レギュレータを見つけて、データシート通りに降圧回路を設計しました。

f:id:Arsenic25:20181231215553p:plain

 

リセット回路設計

リセット回路も資料AN4488 の「3 リセットおよび電源供給スーパバイザ」にて説明されています。資料の図の通りに設計しました。スイッチの端子が4つあるのはタクトスイッチを使用しているためです。

f:id:Arsenic25:20181231222342p:plain

 

クロック回路設計

ここが割と苦戦しました。

「なんか水晶が発信するやつとコンデンサつけるんでしょ?」

程度の前提知識だったので、まずいろいろと疑問があって

  • 水晶振動子とか水晶発振器とか聞くけどどっち使うの?
  • コンデンサつけるのはいいけど容量どうやって計算すんの?
  • たまにクロック回路に抵抗ついてる回路もあるけど、抵抗付けたほうがいいの?

といった疑問を順番に解決していきます。

まず参考にする資料はこれです。

AN2867:STM8AF/AL/S および STM32 マイクロコントローラ向け オシレータ設計ガイド

この資料には、クロック回路の原理、設計方法、PCBの推奨設計パターンからはんだ付けのノウハウまで、クロック回路の全般が網羅されています。とりあえずこの資料+ネットで調べて疑問を解決していきます。

  • 水晶振動子とか水晶発振器とか聞くけどどっち使うの?

水晶振動子と水晶発振器の違いはこちらの記事を参考にさせていただきました。

簡単に説明すると水晶振動子は受動素子で水晶発振器は能動素子のようです。

なので、水晶振動子水晶振動子のみでは発振できず、水晶振動子の外部に水晶振動子を駆動するためのシステムが別途必要です。この水晶振動子を駆動するためのシステムはSTM32マイコンに内蔵されていますので、マイコンと接続することで、水晶振動子は発振を行うことができます。

対して水晶発振器は電源を供給するとそれ単体でクロックを生成することができる素子です。

STM32マイコンでは、水晶振動子、水晶発振器どちらからでもクロック供給できるようです。(AN4488「6.1 HSE OSCクロック」より)

今回は、水晶振動子を用いることにしました。

f:id:Arsenic25:20190101214418p:plain

水晶振動子を使用することにしましたが、実際に使用する水晶振動子の周波数や、型番はどうやって選んだらいいかわかりませんでした。

まず、周波数については、マイコンごとに対応している周波数の範囲がわからないと、大体何MHzの水晶振動子を選んでいいかわからないので、使用するマイコンが対応している周波数を調べました。対応する周波数は使用するマイコンのデータシートに書いてあり、STマイクロの公式サイトから使うマイコンのページに飛びデータシートを参照にしました。

今回使うSTM32F405RGT6の対応している周波数は4~26MHzでした。(データシートの1ページ目にかいてありました)

f:id:Arsenic25:20190101020607p:plain

今回は速いほうが速く動くだろうという安直な理由で26MHzの水晶振動子を使うことにしました。

 

次に水晶振動子の型番ですがこれもAN2867の「5 STM32 マイクロコントローラの推奨発振子」に選定方法が記載されています(下図)(よく見るとそれぞれのマイコンに対応する周波数範囲も下の表に書かれてますね、あとで気づきました)。

ここに示されたメーカーの発振子なら大体適合するらしいですが、不安な場合、同資料AN2867の「4.2 STM32 適合クリスタルを選択する詳細なステップ」を参考に、慎重に水晶振動子を選定したほうがよさそうです。

f:id:Arsenic25:20190101021422p:plain

今回はEPSON水晶振動子FA-128を使うことにしました。

型番はFA-128 26.0000MF10Z-W5です。

とりあえずこれで使う水晶振動子は決まりました!

あとはこの水晶振動子をどうやってマイコンに接続するかですが、これは、資料AN2867の「3 ピアース・オシレータ設計」にて図示されていました。

f:id:Arsenic25:20190101175750p:plain

図中のQが水晶振動子のようです。

自分が使う水晶振動子はデータシートを見てみると端子が4つあったのですが、そのうち2つが水晶振動子の両端で、残り2つは水晶振動子の表面シールドと直結してあり、GNDに接続しろとのことでした。

f:id:Arsenic25:20190101193432p:plain

 

  • コンデンサつけるのはいいけど容量どうやって計算すんの?

水晶振動子と一緒につけるコンデンサについてですが、接続方法は下図におけるCL1、CL2が付け足すコンデンサのようです。

f:id:Arsenic25:20190101175750p:plain

図中のCsは浮遊容量で、実際にコンデンサは接続されていないが、ピンや基板配線の物理的構造によって生じる仮想のコンデンサで、基板の配線構造や、基板の材質などが影響してくるため、実際の値を求めるのは難しそうです。

 

CL1とCL2の値の求め方の詳細はAN2867「3.3 CL負荷容量」に詳しく解説されていますが、まとめると。

  • CL1, CL2の値はCLとCsから計算できる。
  • CLは水晶振動子の負荷容量で、使用する水晶振動子によって値が異なる。
  • Csは浮遊容量で、正確に求めることが難しい。(だいたい5pFくらい?)

水晶振動子の負荷容量CLは水晶振動子のデータシートに記載されており、今回使用する水晶振動子の負荷容量は12pFのようでした。通販サイトで買う場合、商品の説明欄に水晶振動子の負荷容量が記載されてるとこもあるようです。

f:id:Arsenic25:20190101200247p:plain

Csは計算が困難ですが、ネットで探したSTM32マイコンの回路の例では、大体どこも5pFくらいで見積もっているようでした。

CL1, CL2の計算は資料に計算例があるので、それを参考に計算しました。

f:id:Arsenic25:20190101200929p:plain

 CL1とCL2を同じ値として方程式を解けばいい感じですね。

今回はCL1=CL2=15pFとしました。

 

  • たまにクロック回路に抵抗ついてる回路もあるけど、抵抗付けたほうがいいの?

水晶振動子の外付けの抵抗については、AN2867「3.5 励振レベル(DL)と外部抵抗(RExt)の計算」で詳しく説明されています。

すごく簡単にまとめると

とのこと。ようするに

(水晶振動子の等価直列抵抗)×(水晶振動子に流れる電流の実効値)^2 > DL

なら外部抵抗が必要なようです。

そしてこの水晶振動子に流れる電流は、実際に回路を組み、オシロスコープを用いて測定しろとのこと(「3.5.1 励振レベル(DL)の計算」を参照)

つまり、正確に外部抵抗RExtが必要か、不必要かを判断するには、実際に回路を組んで、振動子に流れる電流を測定する必要があるらしいです。

回路設計段階でこの実験は困難であること、ネットで探した様々なSTM32マイコンの回路図にほとんど外部抵抗を入れてるものがなかったことから、とりあえず外部抵抗はつけない方向で進めました。

ちなみに、今回使用した水晶振動子の推奨駆動電力DLはデータシートに表記されており、1~100μWの間で駆動することが推奨されてるようです。等価直列抵抗についても記載されていました。

f:id:Arsenic25:20190101211930p:plain

 

以上のことを踏まえて最終的に設計したクロック回路がこちら

f:id:Arsenic25:20190101211316p:plain

苦戦した割にかなりシンプルな構成ですね。

 

ブートモード切替回路設計

書き込みモードと実行モードを切り替えるための回路を設計します。

ここではUSARTで書き込みを行うと仮定してブートモード切替回路設計を行います。

スライドスイッチを用いて切り替えれるようにします。

参考資料がいくつかあり。

回路設計はAN4488「4.4 ブート・モード選択」を参考に、設計を行います。

公式ドキュメントRM0090という資料の「2.4 ブート設定」の方が自分の使うSTM32F405RGT6に対応した詳しい情報が載っていたのでそちらも参考にしました。

もっと詳しく、ブートローダーの仕様を知りたい場合は、AN2606も参考にするといいかもしれません。

これらの資料を読んだところ、どうやらBOOT0とBOOT1の2つのピンの状態でブートローダーの起動を選択できるようです。ブートローダーが起動してしまえば、書き込みツールを用いてUSARTでプログラムをマイコンに書き込めます。

簡単にまとめると

  • マイコンのリセット後、システムクロックの4回目の立ち上がりタイミングでBOOT0, BOOT1が読まれる。
  • BOOT0ピンが0ならBOOT1ピンの常態にかかわらず通常の実行モード
  • ブートローダーを起動するにはBOOT0=1, BOOT1=0
  • BOOT1ピンは他のGPIOピンと共有ピン、ブートモードの初期化後GPIOピンとして使えるようになる

BOOT1ピンは今回は常に0でいいので、BOOT1ピンと共有のGPIO機能を使わない場合は、常に抵抗を通してGND接続で良さそう。

設計した回路はこんな感じ。BOOT1ピンはPB2ピンと共有で、抵抗を通してGNDに接続してます。

f:id:Arsenic25:20190102014818p:plain

 

書き込み回路設計

今回はUSARTで書き込みを行います。デバッガツールを使わずUSART書き込みを使う理由は、自分がPrintfデバッグ派だということと、RenesasマイコンなどでUSART書き込みに慣れているからです。秋月に売ってるUSBシリアル変換ケーブルで簡単に接続できてお手軽です。

RM0090の「2.4 ブート設定」にシリアル書き込みを行えるUSARTポートが示してあるので、そのピンをコネクタにつなぐだけで、書き込み回路はOKです。

f:id:Arsenic25:20190102020008p:plain

周辺回路設計

マイコンの周辺回路は、STM32のドキュメントというより、使用する周辺機器のデータシートを参考に作っていく感じでした。

周辺回路設計に入ると、STM32CubeMXの恩恵を受けれると思います。STM32CubeMXでの定義通りに周辺回路を作っていきます。

 

周辺回路の例として、IMUはMPU9050を使用しました。回路設計は、MPU9050のデータシートに記載されている回路設計例を参考に設計しました。

f:id:Arsenic25:20190102021815p:plain