ADCできる端子の生えたB-G431B-ESC、あったらいいな~~

 どうもこんにちは。さばねっこです。

 今回は完全に備忘録記事です。まあ生存報告もかねて…。

 

 現在私はリニアモーターを制作しており、そのドライバとしてB-G431B-ESCを使用しています。

https://www.mouser.jp/ProductDetail/STMicroelectronics/B-G431B-ESC1?qs=%252B6g0mu59x7KUfhaFDGurZQ%3D%3D

 3000円強でこれは破格すぎる。

 このドライバはこのようにとても小型で最大40A(強制空冷時)、そしてさらにデバッガも搭載されている非常に優秀なモータードライバです。

 サイズはデバッガ込みで41x31mm程度。クッソ小さい。

 しかもデバッガ部分はmouse bitesでつながっているため手軽に分離することができ、その場合は驚異の41x18mm程度になります。

 マイコンはおなじみSTM32G431ですので、STM32マイコンの開発を行ったことがある方であれば手軽に開発を始められるのではないでしょうか。もちろん公式が公開しているファームを利用すればすぐにモーターを回すことができますし、simpleFOCライブラリによる開発もできるので非常に便利です。まあ僕は使ったことないのでよくわかりませんが…。pizac氏の解説がかなり分かりやすいので参考になるのではないでしょうか。

pizac.hatenablog.com

 

 なんかこういうのを見るとわざわざドライバを自作するのが馬鹿らしくなってきてしまいますね…。

 

 

 このように、このドライバはBLDCを回したいだけの人から制御の勉強をしっかりやりたい人までおすすめできる素晴らしいデバイスなのですが、一つ残念な点(オタク並感)があります。

 なんとADCが使える端子が出ていません!ロボマスモーター回せないじゃないか!!!

 みなさんご存じ(?)のようにM2006、M3508といったいわゆるロボマスモーターのエンコーダーはリニアホールセンサを用いたアナログ出力のものなので、それを制御するためにはADC(2ch分)の存在が不可欠となります。

 というかロボマスモーター云々以前に、私が現在制作しているリニアモーターでもリニアホールセンサを用いたエンコーダーを利用しようとしているので使えないと普通に困るんですよね。

我がリニアモータのリニアホールセンサユニット(笑)



 というわけでADCできるようにプチ改造しますよ、というわけです。

 

 まずこのへんの回路図や現物を見ながらどこに接続するか考えます。

https://www.digikey.jp/reference-designs/ja/motor-control/2840

 TP3とマイコン横の謎の長方形空パッドがちょうど使えそうですね。

 字が見づらすぎますね。すみません。

 それぞれ回路図上では検流用オペアンプの出力となっていますが、設定次第では普通のADCピンとして割り当てられるのでこちらを使用します。

 まあマイコンの足に直接繋いでも良いのですがさすがにめんどくさい、というか家にあるUEWでは太すぎて少々厳しいです。

 

完成の図

 というわけであとは適当にコネクタを付けてそこまで配線して完成。

 コネクタがフラックスなどでめっちゃ汚れてますが気にしてはいけません。

 いろいろ考えるのがめんどくさかったのでGHコネクタを基板上にアロンアルファで接着しました。

 

 こんな具合で改造したB-G431B-ESCを使用して無事リニアモーターを動かすことができました。めでたしめでたし。

 

  さすがに誰得記事すぎるので参考になるかもしれない画像を投下。

 CUBE MXはこんな感じで設定しました(回路図読んだだけ)。

CUBE MXの設定例

 ADC2_IN3のところは一応設定してあるだけで未使用です。

オペアンプの設定例

 上の設定だとオペアンプの出力をマイコン内部で直接ADCに接続することができます。

 ちなみにADCの値を電流に換算する計算はこんな感じ。


float adc_to_current(uint16_t adc_val){
	constexpr float rl = (2.2f*1.5f)/(2.2f+1.5f); //基板上の並列接続された抵抗の合成抵抗
	constexpr float v_bias = rl/(rl+22.0f)*3.3f;  //バイアス電圧
	constexpr float amp_gain_inv = 1.0f/7.0f; //cube mxで設定するオペアンプのゲインの逆数
	constexpr float shant_r_inv = 1.0f/0.005f;         //シャント抵抗の値
	float v = adc_val*3.3/static_cast<float>(1<<12);

	return ((amp_gain_inv + 1.0f)*v_bias - amp_gain_inv*v)*shant_r_inv;
}
  

 ※コメントに大嘘が書いてありましたので訂正しました。すみません。(基板上の分圧抵抗の比→基板上の並列接続された抵抗の合成抵抗)

どうやって導出したのか一切記憶がありません。まあでも基本的には差動増幅回路のなので、それをベースにバイアス部分をいい感じにしたら上のような計算になると思います。間違ってるかもしれんけど。

 

 以上です。誰得記事にお付き合いいただきありがとうございました。