2008-11-15
実験に使うモーターです。無負荷時の回転数は電源電圧3Vで4700rpmほどです。回転数はかなり大きく変動します。大体50~100rpm程度の振幅で変動しながら、モーター温度の上昇と共に300~400rpmほど回転数が上がっていきます。

マブチRE-280
回路図。スピコン回路を流用した物なのでFETが面実装タイプになっています。
基板を作るほどの回路ではないが、ソフト修正->テストの繰り返しが多くなると想定して基板を作ることにした。

基板パターン
2008-11-18
回転数が規定の範囲内に収まっていることが解るようにLEDを追加した。ついでに何かのためにスイッチを2つ。
2008-11-20
やはりPress-N-Peelは1mmの基板でやるとうまく転写できます。パターンのつぶれも殆どありません。ゴムローラーを使うと基板は宙に浮いた状態になるのでアイロンの熱が逃げないためうまくいくのではないかと思います。また面接触ではなく線接触になるため転写不良も防げるようです。

1mmのガラスコンポジット基板に転写。基板をゴムローラーとアイロンで挟んで転写する。この生基板は露光を失敗した感光基板。

今までで一番うまくいった
2008-11-22
回路完成。これからソフトの開発になるが、色々調べるとPID制御という確立された方法があるようだ。「PID制御のお話」というキーワードで検索すると、これについて書かれた雑誌の連載記事がHITするので読んでみると良い。

半田付け完了

裏面はFETとジャンパー線2本
2008-11-23
PID制御を使用しない方法で実験してみた。結果は全然ダメ。±200rpm程度で回転数が振れる。制御しない方がマシなくらい。アルゴリズムは...
【アルゴリズム-A】
回転数が目標より高かったらPWMのデューティーを1つ下げる
回転数が目標より低かったらPWMのデューティーを1つ上げる
というシンプルな物。これをローター1回転毎に実行する。目標回転数になれば緑のLEDが点灯、目標を外れていたら赤いLEDが点灯するようにしてあるが、殆ど緑が点灯しない。

実験中。ストロボ撮影のため止まっているように見えるが3000rpm以上で回転している。
2008-11-24
うまく動かないので、センサーの信号をロジアナで見てみた。すごいノイズ。PWMのノイズがセンサー側に回り込んでいるみたいだ。モーターとコントローラー回路を同一電源にしたのはまずかったか。

ノイズが...
2008-11-25
2008-11-26
2008-11-27
2008-11-29
1回転1パルスよりもっと細かく制御すれば目的の回転数にうまく一致させることが出来ると思ったが、予想以上に効果無し。パルス数を増やすのは定回転制御にはあまり有効でないかもしれない。大きな円盤を取り付けてしまったため、フライホイールとしての効果が発生し単純比較が出来ない。発泡スチロールなのだが明らかに加速が鈍っているのが解る。

PICにとって1回転はとても長い時間なので1回転7パルスにしてみた

実験風景
2008-12-02
良い回路ではありませんが、掲載しておきます。モーターとPICはフォトカプラで絶縁すべきです。RB0とセンサーの間にローパスフィルターが挟まっているところが変更点です。
カットオフ周波数を計算しましたが、こういう物は現物合わせが必要みたいです。

回路に差し込んだローパスフィルター
2008-12-04
今度は位置決めの実験をするため逆転が必要です。行きすぎたら戻さないといけないので逆転が必要なのです。回転数を数えるためにカウンターも作りました。
2008-12-06
忘れてた。逆転があるのでセンサー2つ必要でした。

2008-12-07
真理値表を作って、回路に間違いがないか確認する。この回路はバグがあってもハイサイドFETとローサイドFETが一緒にONしないようになっている。それ以外にもデッドタイムの生成がハードウェアーによって行われる。「バグ無し」という前提なら、かなり部品を減らすことが出来る。

サイズ100×75 ジャンパー線3本。ジャンパー線なしで配線しておいてから、ジャンパー線を差し込み、一部の配線を剥がして再配線する。そうしないとうまくいかない。

電気工作でもEXCELは必需品。
2008-12-10
条件はうまくいったときと同じだったのに、何故か露光オーバー???? 現像液の温度が少し高かったかもしれない... 正確な原因解らず。前回までは純正インクと詰め替えインクが混ざっていたかもしれないが、今回は詰め替えインクに殆ど置き換わったはず。これが原因と言うことも考えられる。

大失敗 パターンが切れた箇所有り。
2008-12-11
フラックスを塗る順番に悩んだことはないだろうか? エッチングが完了した基板の酸化速度は速く、直ぐにフラックスを塗りたいところだがフラックスを完全乾燥させずに穴あけを開始すると、基板の削りくずが付着して汚くなる。穴あけを先にはじめると、穴空け完了までにかなり酸化してしまう。この問題の解決策は以下の通りだ。
1.エッチング完了
▽
2.穴あけ
▽
3.基板に醤油を塗る 数滴で十分
▽
4.水洗いする あら不思議!! 基板はピカピカ
▽
5.ドライヤーで基板を乾燥&加熱する
▽
6.フラックスを塗る

10円玉を醤油に浸けてきれいにする実験
露光オーバーで失敗してしまったので、マスクを2重にして再作成。今度は完璧。

エッチング中。あと数枚エッチングしたらこの塩化第2鉄溶液は寿命だ。

基板完成
2008-12-12
フォトインタラプタは段差を付けて取り付けます。

2個のフォトインタラプタ
2008-12-14
画材屋(ゆめ画材)で塩化第2鉄溶液を購入。画材屋では「腐食液」という名称で売られている。確か塩化第2鉄というのも俗称で正式名は塩化鉄III溶液だったと思う。隣の白い物は溶液を捨てるときの中和用消石灰1kg。廃液をまとめて捨てるときは消石灰を使用するが、塩化第2鉄溶液の付着した容器などを水洗いするときは重曹で中和したほうがいいらしいので500gほど購入した。買いすぎたか.... たぶん10年は持つだろう。ちなみに消石灰は目にはいるととても危険。
塩化第2鉄溶液 2リットル ¥1470
重曹 500g ¥409
消石灰 1kg ¥714
ピンセット 2本 ¥692
送料 ¥840
この塩化第2鉄溶液を試用した結果は詰め替えインクの記事を見て下さい。

塩化第2鉄溶液 2リットル
2009-10-31
ハイサイドとローサイドのFETが同時ONするとショートしてしまうので通電前にロジックアナライザーで動作を確認。

フォトインタラプタの接続が間違っていたので修正

ロジックアナライザーで目的の信号がでているか確認
2009-11-29
低速回転での安定度を上げたいのなら1回転あたりのパルス数を増やしてやると効果的。

紙に穴を空けた物

OHPフィルムにインクジェットプリンターで遮光パターンを印刷した物。180パルス/回転だ。
2010-01-01
Hブリッジの制御方法は3通り有る。
Fig1:高速回転向き
回転->停止->回転->停止を高速で繰り返す。「停止」とは電源を切っている状態のこと。
右上のFETが常にON
左下のFETをPWM駆動する
FETのゲート駆動回路の部品点数が多くなるのが欠点だがドライバーICを使うとIC一個で済んでしまう。
PIC16F886(とても安い。28ピン)のフルブリッジPWM機能を使うならこの回路が一番素直
上下のFETを交互にONするわけではないのでデッドタイムの事を考えなくて良い
Fig2:中速回転向き
回転->ブレーキ->回転->ブレーキを高速で繰り返す
車で言うとサイドブレーキを引いたままアクセルを踏み込んでいく感じ
右上のFETが常にON
左側上下のFETを交互にONする
この図では上下のFETがPチャネルとNチャネルなので同相のパルスを入力する
左下のFETがONしているときはFig1と同じだが上側のFETがONしているときはモーター両端の端子が
ショートしてブレーキがかかる。
FETの駆動回路はFig1の半分で済むがデッドタイムを考えた回路にしないといけない
PIC16F886のハーフブリッジPWM機能(PIC16F886データシートの135ページの下の回路図参照)を
使えばデッドタイムはソフトウェアで制御できる。(同じくデータシートの143ページも参照)
回転数が低いときはブレーキの効きが悪いので中速回転向きになる。
Fig3:低速向き
正転->逆転->正転->逆転を高速で繰り返す
左側上下のFETを交互にONすると同時に右側のFETを左とは逆相でONする
PWMのスイッチング周波数が低いと正転<->逆転を繰り返すことになるが
通常のPWMのスイッチング周波数6kHz程度で反応できるモーターはないので
デューティー50%の時にモーターは停止する。デューティによって正転/逆転を制御する
モーターが静止しているとき電流が流れない(差し引きゼロ)。何となく不思議な感じがする回路
FETが常にON/OFFを繰り返しているので4つのFETを全部NチャネルFETにし
上側のFET(ハイサイドと言う)のゲートをブートストラップ回路で駆動する事が出来る。
ブートストラップ回路については「FET ブートストラップ」などのキーワードで検索するとヒットする。
全部Nチャネルにすると効率がよいが(NチャネルFETはON抵抗が小さい)低速回転向きであるので
このメリットはあまり生きてこない。
逆転によるブレーキをかけるので低速制御に向いている。そのため高速回転には向かない。
・FETモータードライバーもこの3種類ある。切り替えられる物もあるし1方式しか使えない単機能の物もある。
・厳密には3パターンではなく、正転、逆転、停止、ブレーキの組み合わせで駆動するのでもっとたくさん考えられる
Fig3の方式でPWM周波数5kHz、電源電圧3V(FETにはちょっと低すぎる電圧)、デューティ50%で電流が流れないが、電源電圧を5Vに上げると50%デューティでも100mA程度流れてしまう。モーターはマブチモーターRE-280(定格3V)

ブレッドボードで実験。MPU部分がブレッドボード、モーター回路部はプリント基板。
2010-01-05
2010-02-13
OLIMEXに発注した基板を組み立てた。正逆転可能な物と正転のみの物。

USBはプログラム書き換え用。
MicrochipDirectで注文したPIC18F4550。トレイというのはこんなのだった。たったの2個注文でこんなにでかいのが届く。

無駄なVIAを生成している。何故だ。

大きなトレイにチップが2個だけ
2011-07-07
加速度を計測することにした。最短時間で目的の回転数に到達させるためには個々のモーターの特性をあらかじめ計測しておく必要がある。モーター単体ではなくモーターで駆動する機械を取り付けた状態での計測が必要。この実験では紙の円盤が負荷。

モーターはマブチRS-380PH 最適な電圧は7.2V
2011-07-08
センサーの信号をロジックアナライザーでとらえて解析。

電源を入れた直後の5~6回転でトップスピードに到達してしまっている。負荷が軽すぎるか? モーター電圧は5V。約10000rpm
PWMのデューティーを約5%と目一杯下げても似たような状況。約4300rpm
2011-07-13
今度はモーターの電源を切ってからどの程度で停止するかを計測。カーソルAのところで電源を切っている。停止したのは0.65秒後。これは制御しているとは言えない。
モーターの両端子をFETでショートさせてブレーキをかけてみた。今度はすぐ止まる。回転数が落ちてくるとブレーキをかけるためのエネルギーも小さくなるのでブレーキが効きにくくなる。この回路は逆電圧をかけられないので。これ以上は強いブレーキをかけられない。
テスト環境。ON->BRAKE->ON->BRAKEを繰り返したほうがうまく制御できそうなので簡単なテストプログラムを作る。

回転数を計測するために回転計のセンサーも取り付けてある

テストプログラム。set_duty(1023)はデューティー100%の意味
回転数はON時間とブレーキ時間の比に比例する。
ON[us] モーターをONしている時間
BRAKE[us] モーターの両端子をショートさせてブレーキをかけている時間
RPM そのときの回転数
ON[%] ON時間の比率
Freq[Hz] PWM周波数
PWM周波数を高くすると低速回転してくれなくなる。このモーターは500μ秒あたりが一番制御しやすかった。370rpmあたりが最低速度の限界だったが600rpm以下はかなり不安定。
2011-07-14
上の実験はPWMの周波数が低速と高速では違っている。低速側の分解能は高いが高速側が低くなるのでPWM周波数一定にしてみた。周波数は低速回転に適した160Hz。結果は3000~4000rpmに山が出た。何故? モーターの局数との共振か?
周波数を260Hzに上げた。山が小さくなって高速側に移動したか? このグラフの縦軸はデューティーだがモーターの端子間電圧だと思って良い。デューティー100の所が5V。50の所が2.5V。モーターの回転数は電圧にほぼ比例している。デューティーと電圧が比例するのはたぶん無負荷の時だけ。無負荷の時はY=AXのグラフになるが負荷がかかるとY=AX+Bのグラフになる。たぶん。傾きのAも少し変化するはず。
400Hzで山がほとんど消える。160Hzは9600rpm。極数が3なので9600÷3=3200rpmとなって山が出来たのか?
2011-07-15
回転計のロジックを移植。液晶ディスプレイには目標回転数と実際の回転数を表示する予定。うまく制御できれば同じ値が表示される。PIC18シリーズはタイマーが4つもあるのでプログラミングがだいぶ楽になる。TMR2以外は16ビット。

2011-07-25
1回転6パルスの実験。穴あき円盤はタミヤの楽しい工作シリーズのプーリーセットS。センサーと円盤の相性がいまいち。

2011-07-26
もう少しパルス数を増やしてみる。スリットはOHPフィルムにインクジェットプリンターで印刷。これだと反射式のフォトインタラプタは使用できない。

2011-07-27
偏芯しないように取り付けるのが難しい。0.5mm偏芯すると最大1/4パルス程度信号がずれる。1回転を周期として信号がうねる。

ここまでのまとめ:
・シングルアウトプット(FET1個構成)のPWMではブレーキが効かないので制御しにくい
・回転速度制御のためにはハーフブリッジもしくはフルブリッジが必要
・USB付きのPIC18系はシングルアウトプットなのでモーター制御向きではない
・クロック20MHzのPICだと10ビットの分解能が得られる最低周波数は1.22kHz このときマブチモーターはかなりトルクが小さくなる。約750rpmが最低回転数
・PWM周波数160Hz程度が低速回転でのトルクが大きい。ただしここまで周波数が低いとPICではハードウェア(ECCP)によるPWM制御が出来ない。
・ECCPを使わないと
1.回転検出
2.PWM出力
をソフトウェアで同時に実行する必要があり回転検出の影響をPWMが受ける。結果、PWMのデューティーが安定しない。
・エンコーダーのパルス数が多いと急激に負荷が変化したときに追従しやすい。
・万能な制御ソフトを書くのは難しい
-モーターの特性は個々に異なる
電源電圧
エンコーダーの分解能
無負荷回転数
-負荷の特性
慣性の大小
抵抗の大小
負荷変動
-ストールした場合の対応
一定秒数経過したら電源OFF(何秒で焼き切れる?)
さらにPWMのONデュティーを上げる
・無負荷時にはPWMのデューティーと回転数は比例する
負荷がかかるとこの比例関係は崩れる
・無負荷時にはPWMのデューティーとモーターの両端子電圧は比例する
負荷がかかってもこの比例関係は崩れない
・書籍は意外と役に立たない
例えば
・モーターのトルクは電流に比例する
・回転数は電圧に比例する
という理屈が解っても電流、電圧の測定がそんなに簡単ではない。
PWM周波数1.22kHz
2011-07-30
回路上の限界があるので今度はフルブリッジ回路で実験。

縦軸がPWMデューティー。10ビットなので0~1023。横軸が回転数。何故か原点を通るグラフになった????? 理論上は原点を通らないはずなのだが.... 原点を通る方が計算が簡単になるので制御はやりやすい。進角付きのモーターは逆転させると変な音がする。逆転させるのはやめておいた方がよさそうだ。
2011-08-04
原点を通ってしまう原因がわかった。フォトカプラの応答速度が遅いようだ。PWMの周波数が早くなるとフォトカプラがついて行けなくなってグラフが下がってくる。

ハイライト(黄緑色)されている部分の波形を観測

波形
R7を1kΩに変更するとだいぶ改善される。上側の波形のハイライト部分を拡大したのが下側の波形。オシロのディレイタイムポジションを使っている。

R7を1kΩに変更後。PWMの周波数はさらに上げて2.44kHz。縦軸10ビットduty、横軸rpm。
2011-08-05
PIC標準のフルブリッジ制御でPWM Dutyと回転数の関係をプロットしてみた。これは今までの
加速->ブレーキ->加速->ブレーキ
ではなく
加速->フリー->加速->フリー
という制御。フリーの部分ではモーターの両端子を開放。このときローターは慣性で回っている。
2011-08-09
回転数を表示するルーチンを作ったが何故か正しく表示されない。割り込み処理内の割り算とメインルーチン内の割り算が競合している。生成されたアセンブラーのコードを見ると割り込み処理、メインルーチンともに同じ割り算サブルーチンを呼び出している。言語の仕様なので逃げ道無し。
ソードフィッシュコンパイラ
割り込み処理、メインループで割り算をやると同じ割り算サブルーチンがコールされる
マイクロベーシック V7.2(PROより1つ前の古いバージョン)
同上
MPLAB C18
同上
マイクロベーシック PRO
同上
PWMのデューティを決定するために割り算を割り込み処理内で使っているのだが、この処理をメインルーチンに持ってくるとメインルーチンでの処理の影響をPWMデューティー計算ルーチンが受けてしまう。メインルーチンは遅い液晶表示処理を含んでいるのでメインルーチン内でPWMデューティー計算をやりたくない。

4000rpmで制御してる。メインルーチンの割り算途中で割り込みがかかり、割り込みルーチン内での割り算処理がメインルーチンの割り算ルーチンの変数を破壊してしまう。先頭の9が破壊された変数によるもの
割り算について:(mikroBasicの場合)
・割り算サブルーチンは変数の型ごとに用意されているので型が異なっていれば割り込みルーチン内とメインルーチン内で競合しない。
・32ビットの割り算処理はだいたい600ワードのプログラムメモリーを食う
・除算よりシフト命令の方が早いのはアセンブラーでコーディングする場合の時
コンパイラーは B=A/2 と書くと Aを1ビットシフトした物をBに代入しれくれる。
2,4,8... で割っても同様にシフト命令で処理される。
dim a as word
dim b as word
dim b as word
a = 10
b = 2
c = a/b
と書くと、コンパイラーはcにいきなり5を代入する。cが定数であることを判断し無駄なa/bを実行するコードは生成されない。
コンパイラーは a×10 を (a<<3)+(a<<2) に展開しれくれるほど賢くは無いが、初心者が出来る程度の高速化は自動でこなしてくれる。
コンパイラーが生成するコードを見なければ高速化は実現できない。
賢い割り算をやってくれるのはmikroBasicだけでMPLAB C18やswordfish SEは除数によって生成するコードを変えてはくれない。
2011-08-11
割り込みルーチン用の割り算関数を作ってしまう以外に方法が無いという結論に至る。割り込み関数を書いてみたが変数を任意のアドレスに割り当てることが出来ない。処理速度を考慮するとバンク0に変数を割り当てたい。absolute命令で出来るのだが他の変数が同じアドレスに割り当てられてしまう。mikroBasicは有料になるのでMPLAB C18に移植するしか無さそうだ。
PIC18シリーズは8ビット×8ビットの掛け算が出来るので除数がconstantなら割り算では無く掛け算で実行した方が処理が早い。変数aが16ビットなら
b=a/5 <-bは16ビット
ではなく
b=a×(2^16/5)/2^16 <-bは32ビット
を計算する。
(2^16/5) はコンパイラが計算してくれる
この式の通りにコードを書くとかえって遅くなるが /2^16 は割り算では無く下位16ビットを捨てて、上位16ビットを取る処理に置き換える。
処理は速いが誤差が出るのが欠点
0001 '-------------------------------------------------------------------------------
0002 ' 32bit / 32bit division
0003 '-------------------------------------------------------------------------------
0004 Function warizan_32x32(dividend As LongWord, divisor As LongWord) As LongWord
0005 Dim dividend_32,dividend_32H,dividend_32HH,dividend_32HHH As Byte
0006 Dim divisor_32,divisor_32H,divisor_32HH,divisor_32HHH As Byte
0007 Dim divans_32,divans_32H,divans_32HH,divans_32HHH As Byte
0008 Dim divwork_32,divwork_32H,divwork_32HH,divwork_32HHH As Byte
0009 Dim div_counter As Byte
0010
0011 Structure DivArg32
0012 LWval As LongWord Union
0013 Bval(4) As Byte Union
0014 End Structure
0015 Dim tmp As DivArg32
0016
0017 tmp.LWval = dividend
0018 dividend_32 = tmp.Bval(0)
0019 dividend_32H = tmp.Bval(1)
0020 dividend_32HH = tmp.Bval(2)
0021 dividend_32HHH = tmp.Bval(3)
0022 tmp.LWval = divisor
0023 divisor_32 = tmp.Bval(0)
0024 divisor_32H = tmp.Bval(1)
0025 divisor_32HH = tmp.Bval(2)
0026 divisor_32HHH = tmp.Bval(3)
0027
0028 Asm
0029 MY_SB_DIV_U_32X32
0030 CLRF divans_32,0
0031 CLRF divans_32H,0
0032 CLRF divans_32HH,0
0033 CLRF divans_32HHH,0
0034 CLRF divwork_32,0
0035 CLRF divwork_32H,0
0036 CLRF divwork_32HH,0
0037 CLRF divwork_32HHH,0
0038 MOVF divisor_32HHH,0,0
0039 IORWF divisor_32HH,0,0
0040 IORWF divisor_32H,0,0
0041 IORWF divisor_32,0,0
0042 BZ MY_DIV_U_32X32_EXIT
0043 MOVLW 32
0044 MOVWF div_counter
0045 MY_DIV_U_32X32_LOOP
0046 BCF STATUS,0,0
0047 RLCF dividend_32,1,0
0048 RLCF dividend_32H,1,0
0049 RLCF dividend_32HH,1,0
0050 RLCF dividend_32HHH,1,0
0051 RLCF divwork_32,1,0
0052 RLCF divwork_32H,1,0
0053 RLCF divwork_32HH,1,0
0054 RLCF divwork_32HHH,1,0
0055 MOVF divisor_32HHH,0,0
0056 SUBWF divwork_32HHH,0,0
0057 BNZ $ + 18
0058 MOVF divisor_32HH,0,0
0059 SUBWF divwork_32HH,0,0
0060 BNZ $ + 12
0061 MOVF divisor_32H,0,0
0062 SUBWF divwork_32H,0,0
0063 BNZ $ + 6
0064 MOVF divisor_32,0,0
0065 SUBWF divwork_32,0,0
0066 BNC MY_DIV_U_32X32_SKIP
0067 MOVF divisor_32,0,0
0068 SUBWF divwork_32,1,0
0069 MOVF divisor_32H,0,0
0070 BTFSS STATUS,0,0
0071 INCFSZ divisor_32H,0,0
0072 SUBWF divwork_32H,1,0
0073 MOVF divisor_32HH,0,0
0074 BTFSS STATUS,0,0
0075 INCFSZ divisor_32HH,0,0
0076 SUBWF divwork_32HH,1,0
0077 MOVF divisor_32HHH,0,0
0078 BTFSS STATUS,0,0
0079 INCFSZ divisor_32HHH,0,0
0080 SUBWF divwork_32HHH,1,0
0081 BSF STATUS,0,0
0082 MY_DIV_U_32X32_SKIP
0083 RLCF divans_32,1,0
0084 RLCF divans_32H,1,0
0085 RLCF divans_32HH,1,0
0086 RLCF divans_32HHH,1,0
0087 DECFSZ div_counter,1,0
0088 BRA MY_DIV_U_32X32_LOOP
0089 MY_DIV_U_32X32_EXIT
0090 End Asm
0091
0092 tmp.bval(0) = divans_32
0093 tmp.bval(1) = divans_32H
0094 tmp.bval(2) = divans_32HH
0095 tmp.bval(3) = divans_32HHH
0096
0097 warizan_32x32 = tmp.LWval
0098 End Function
0099 '==================== 32 / 32 division ==================== E N D ==============
2011-08-24
2011-08-26
正転<->逆転を交互に繰り返して回転数を制御する方式の実験。周波数は11.72kHz。正転の時間が長ければ正転、その逆になれば逆転する。DUTYがちょうど50%の時にモーターは停止する。理論上はDUTY=512(PICのECCPは0~1023の10ビットなので512がDUTY50%)を境界に上下対称になるはずだが、このモーターは進角付きなので対象にならない。DUTY50%の時にも80mA程電流が流れた。モーター電源の電圧は5V。
2011-08-31
TLP521は遅すぎるのでTLP559に変更した。速度は1桁速いが価格も一桁高い。PWM周波数20KHz程度なら遅延を気にしないで済むはず。秋月電子は高速フォトカプラの品揃えが悪い。DigiKeyで注文した。千石電商はフォトカプラの品揃えが良い。高速動作するフォトカプラは汎用の物と異なり電源端子がある。速くなる代わりに「電源電圧の制約を受ける」「デジタル動作しかできない」「出力が0Vにならない」といった制約がある。制約は品種により異なる。
高価な高速フォトカプラを使用するに至った理屈は
A.フォトカプラはON時間よりOFFにかかる時間の方が長い
フォトカプラがONの時、FETがOFFになるようにすればFETを素早くOFFに出来る。
結果、ハイサイド、ローサイドのFETが同時ONになる危険性を少なく出来る。
つまり、MPUから見たときにハイサイドもローサイドもActivーLowで設計したい。
B.モーターの電源を入れたときにいきなりモーターが回り始めないようにしたい。
MPUから見たときにハイサイドもローサイドもActivーHighで設計したい。<-Aと逆になる
この矛盾が起きたため。十分に高速動作すれば遅延を気にする必要がなくなり「A」から解放されるので「B」の条件で設計すれば良くなる。

2011-09-02
フォトカプラが届いたので半田付け開始。モーター駆動部分だけを差し替える。

EAGLEで自動配線。ジャンパーは2~3本で済んだ。

感光基板で作った方が速いが小さいのでユニバーサル基板で製作。
2011-09-03
組み上がったのでテスト。1μ秒程度になってほしいのだが遅い。

遅延3μ秒
スピードアップコンデンサを入れてみる。

390pF

速くなった
まだダメ。変なノイズが入っている。他の信号の影響を受けているようなのでパスコンを入れた。10μFのコンデンサを入れたら消えた。

2011-09-06
モーターを繋いで回してみたらなんだか元気が無い。ゲート駆動回路の波形を見てみるとすごいノイズ。写真の波形はローサイド回路のフォトカプラ出力とFETゲート。電源にノイズが乗ってしまっているのが原因でゲート駆動回路にもノイズが乗っている。

波形拡大。波形が立ち下がる直前にノイズが発生しているが、これは他のFETがここでスイッチングしているから。このノイズの影響でハイサイドとローサイドが同時ONして余計に電流が流れている感じ。短絡するほど長時間では無いのでモーターは回転する。ノイズの原因はこういう理屈か?
FETがスイッチングする
▽
モーターはコイルなのでFET OFF時に高電圧が発生する
▽
発生した高電圧ノイズが電源に乗る
▽
電源に乗ったノイズがゲート駆動回路に乗ってFETがスイッチング
▽
これの繰り返し
対策は
1.ゲートドライブ回路の電源を隔離する
2.スパイクノイズを吸収する回路を追加する
のどちらか。2が完全であれば1は不要。両方やればより安全。電源電圧が低いので1はちょっと難しい。

2011-09-09
アナログオシロでは波形がよくわからないのでデジタルで確認。なんだか上に書いたロジックではなさそうな気がする

ブレッドボードでPWM回路を組んでモーターを回してみる。ローサイドだけのFET1個構成では発信波形は発生しなかった。

ローサイドだけの回路。ハイサイドは電源直結。波形の乱れは発生していない。

FETのドレインソース間電圧。32V出ている。この電圧の影響を受けている感じがしない。電源電圧は5V。
抵抗負荷で動かしてみた。同じ波形が観測される。モーターの逆起電力が原因では無いことが判明。Hブリッジだけでは無くハーフブリッジでも発生する。

抵抗値は10Ω。5Ωのセメント抵抗2本
FETのゲート抵抗を変更してみる。抵抗値を大きくすると波形が綺麗になるがFETゲートの充放電に時間がかかりスイッチングが遅くなる。FETはゆっくりスイッチングさせると損失が大きくなる。ゲート電圧が小さいとON抵抗が大きくなる。

抵抗値10Ω。波形はゲートをドライブしているNPN,PNPトランジスタのベース

抵抗値330Ω。下側はゲートをドライブしているNPN,PNPトランジスタのベース。上側はFETのゲート電圧

抵抗値470Ω。
電源にコンデンサを入れるのが正解のようだ。

電源間にコンデンサを入れる。水色と紺色の物。どちらも1000μF。耐圧が低いので大きくは無い。

電源間のコンデンサ容量100μF、ゲート抵抗100Ω 改善前の状態
2000μFより大きくしてもそれ以上はあまり効果が低い。FETをON抵抗値の大きな物に変更すると波形はもっと改善される。但しモーターを駆動する回路の場合はON抵抗は出来るだけ小さくあってほしいので波形の綺麗さより効率優先。FETはON抵抗が小さくなるほどゲートの静電容量が大きくなる。
FETのバランス取り要素まとめ
・ON抵抗が小さいほどゲート容量が大きくなる
・ゲートの容量が大きい物ほどスイッチングに時間がかかる
・ON抵抗が小さい物ほど価格は高い
・スイッチングに時間がかかるとスイッチングによる損失が大きくなる スイッチング周波数が高くなっても同じ
・ON抵抗が大きいと常時損失が大きくなり大きな放熱器が必要になる
D級アンプはもっと高速でスイッチングしているので、もっと綺麗な波形に出来そうなのだが今のところ発信波形の発生原因不明。

1000μF

2000μF 波形の乱れは残っているが実用域

FETゲートの放電時間大体2μ秒
2011-09-10
発信の原因はT5だった。
・T5がOFFになる
▽
・FET(Q4)がOFFになる
▽
・負荷が無くなって電源電圧が急激に上がる(約0.35V程度)
▽
・ベースの電圧がそのままで電源電圧が上がるとT5がONしてしまう
▽
・FETがONして電源電圧が下がる
▽
・電源電圧が下がるとT5がOFFする
▽
繰り返し

T5を取ってしまってハイサイドと同じシンプルな回路にすると発信しなくなる。コンデンサを入れると電源が強化され電圧変動が少なくなるので同様の効果が得られる。ゲート抵抗を大きくするとFETがゆっくりOFFして急激な電源電圧変動を押さえられるので同じく発信しなくなる。
T5を取ってしまうと電源を入れただけでFETはONになる。ハイサイドはOFFなので貫通電流(ハイサイドとローサイドが同時にONすることをショートスルーと言う)は流れないのだが別のところで問題がある
・両方ともアクティブHighなら回路図上の74HC157のままで良いが
ハイサイドとローサイドでアクティブHigh、Lowになっていると74HC158に要変更
▽
・74HC158は電源を入れると出力がHighになる
▽
・Q3、Q4が電源投入時にONになり、電源を入れただけでモーターが回り出す
PICが動き出してからモーター電源を入れるためのスイッチ回路を追加しなければならなくなる。出力がハイインピーダンスに74HC158の亜種もあるが入手難。複数TTLを組み合わせれば可能だが部品点数が増える。
2011-09-14
小型のフォトインタラプタの実験。オムロンのEE-SX1131とロームのRPI-151。手前がEE-SX1131。足のピッチは1.27mm。センサーの窓が2つ見える。

LED側の抵抗は560Ω、フォトトランジスター側が33k?

このフォトインタラプタは両方ともセンサーが2個入っている。片方を回転数の計測、もう一方を回転方向の検出に使う。円盤のスリット幅を2つのセンサーの間隔より大きくすれば回転方向を検知できる。回転数検知側がONのとき回転検出側がONになっているかOFFになっているかを見れば回転方向がわかる。ロームの物はデータシートらしき物が無いがOMRON製とほぼ同じ特性のようだ。若干ロームの方が2つのセンサー間の距離が長いようだ。ロームはスルーホール用でスロット間隔が1.5mm、オムロンは面実装用でスロット間隔が2mm。フォトトランジスターはコレクターが共通になっているので5本足。

立ち下がり側が若干なまる

信号のずれは約50μ秒。モーターの回転数は約10000rpm
2011-09-16
修正した回路で実験。この進角付モーターは逆転させるとすごくノイズが発生する。回路がおかしいのか?

逆転時。FETのドレイン波形

正転時。同じくFETのドレイン波形
基板プロトタイプ最終形。上の2つはセンサー基板。

2011-09-16
OLIMEXはカード支払い不可になっていた。EU以外からはPayPalで支払い。やたらと長いメールが来たので設計ミスがあったのかと思ったが読むと「PayPalで支払ってくれ」という内容。PayPalは手数料取られて割高になるが以前のFAX送信方式よりずっと楽に支払いが出来る。以前は1枚¥6000程度だったが、今はユーロ安で¥4191。

オーダーフォームがすごくシンプルになっていた。

いつもは Hi attached is your po form Best regards だけだ
2011-10-07
基板到着。いつもは14日で届くのだが、今回は18日かかった。

2011-10-14
プロトタイプ最終版組み立て完了。回路を不安定にするためにコンデンサは間引いてある。これで安定して動くならパスコン強化すればもっと安定するだろうという理屈。

2011-10-18
ミニ四駆PROのモーターで実験。このモーターは軸が後ろからも出ているのでセンサーを取り付けるのに都合が良い。モーター用電源の最低電圧は5V、ミニ四駆のモーターは単三電池2本の定格3Vなのでduty100%で駆動すると壊れる。ソフトでduty60%以上にならないように制御すれば使える。

2011-10-23
キット化のため部品を発注した。DRO用の部品なども併せて発注したので基板を入れると総額60万円を超える。基板の発注は部品が届いてからサイズを実測後。部品の発注先は秋月電子、千石電商、RS、マルツ、DigiKey、樫木総業。この中では秋月電子のカートシステムが分かり易い。購入品のサムネイルが表示されるので何を買ったのか確認がとても楽。DigiKeyは品数が多すぎ。機能的に優れているのはRS。使い物になる部品の絞り込み機能があるのはRSだけ。100個単位購入でもたいていの部品は秋月が一番安い。部品発注は単純作業では無い。品切れや価格変動などに応じて注文する部品を変更することもある。部品の発注だけで約8時間。

2011-10-31
当方のEAGLEの制約が100×160mmなので、この範囲に収まらない物は基板メーカーに面付けを依頼している。ルーター切り出し、面付けなどで特注費用が¥37200もかかった。基板とあわせて10万円を超えた。電子工作ブームも去ったようだし...全部売れるか???
2011-11-21
基板はこんなサイズ。ちょっとだけ小さくなっている。

2011-12-05
組み立て完了。Duty=400/1024、4625rpm。FETやフォトカプラは高いので試作基板から移植。組み立ては半田付け作業だけでなく部品表のチェックもやっている。ここでチェックするのが一番効率が良い。

2011-12-09
Microchip社のHIDブートローダーは新しくなっていた...が動かず。どこが悪いのか調べるのが面倒なので旧バージョンを使うことにした。

設定機能の作り込みは面倒。回転方向、電源電圧、モーター電圧、回転数、制御方式等々。モーター電圧と電源電圧は許容できるDutyを決めるための物。電源電圧が5Vでモーターの定格が2.5VならDuty50%以上にするとモーターが焼けてしまう。

2011-12-14
2011-12-15
MPLAB C18は日本語コメントが入る。

2011-12-16
ミニ四駆のモーターを回してみたがRS-380と同じロジックではうまく制御できない。3Vのモーターを5Vで回しているのでDUTYを0.1%(厳密には1/1024)変更すると70rpmも回転数が変化する。加えて加速は遅いが減速が早い。今はPIDとは言えないシンプルなロジックで駆動している。出来れば変な係数の無い仕組みにしたいのだが... PIDにしてみるか。

2011-12-20
PIDの書籍を2冊購入。今日届くはずなのに、いつまで経っても配達に来ないので変だな思って郵便受けを見に行ったら郵便受けを突き抜けて地面に落ちていた。目の前で地面に落ちたのが見えたはずなのだが一旦他人の敷地に入ってしまった物は放置なのか?以前は手渡し配達だったがamazonは最近ゆうメールに変わった。
白い方の内容はPIDだけ。もう一方はお題の通りDCモーター用では無いがPWMで制御するか周波数で制御するかの違いなのでたぶん同じ理屈で良いはず。

2011-12-23
PWMのデューティーで回転数、回転方向を変化させるのはこうするそうだ。黄色い本より。PICのECCPじゃ出来ない制御方法。この制御方法はdsPICを使うのがたぶん正解。

2011-12-30
上の二冊はざっと読んだのだが、ラプラス変換とか出てきて何じゃらほいなので制御工学の入門書を購入。ラプラス変換は学生時代に勉強した記憶が無い... 単位を取ろうとしなかったのか、三流アホ大学はその程度なのか、それともアルツハイマーが発症しかけているのか。

2012-02-02
3冊読み終わった。PIDでロジックを書き換えたがミニ四駆のモーターはハンチングが押さえ込めない。15000rpm付近で制御不能になる。負荷が無いとダメかな。タミヤのギヤボックスを付けてみよう。今日は近所の模型屋が休みなので明日。

2012-02-04
これくらいの負荷でもだいぶ違う。でも今一歩という感じ。ジュラコンの丸棒。

ギヤボックスを使ってみた。今度はかなりテキトーなPIDパラメーターでも安定して動作するようになった。

回転部分にハトメを使ったりして進化している。昔の金属製のギヤボックスはひどかったね。特にモーターブラケットが。

タミヤのシングルギヤボックス。減速比は一番小さくしてみた。
2012-02-06
RE-280モーターでも実験。何故かまるっきりダメ。不安定すぎてお話にならない。

オシロスコープで見るとノイズらしき物が見えるのでモーターにコンデンサを付けた。これで解決。ミニ四駆のモーターはコンデンサなしでもOK

これはセンサーの信号。矢印の所に何かある。

0.0047μF=4700pF。モーターの両端子を指で触っても安定するので100kΩ程度の抵抗を入れてもいけると思う。
2012-02-07
ギヤボックスに付いていたFA-130モーターでも試してみた。特性はミニ四駆のモーターとほぼ同じ。

2012-02-09
キット化完了。位置決め用のソフトもそのうち作りたいが同期モーター(つまりブラシレス)じゃ無いと難しいと思う。

2012-02-10
PIDの式はこんな物
制御出力 = 前回の制御出力 + 制御出力変化分
制御出力変化分 = Kp((目標値との偏差-前回の目標値との偏差)
+ 制御周期/積分時間×目標との偏差
+ 微分時間/制御周期×((目標値との偏差-前回の目標値との偏差)-(前回の目標値との偏差-前前回の目標値との偏差))
前回というのはこのモーター制御回路なら1回転前のこと、ADコンバーターで電圧をサンプリングしている回路なら1サンプル前のこと
この回路は1回転毎に制御しているので制御周期は回転数によって変化してしまうが面倒なので無視して
制御出力変化分 = 定数Kp×((目標値との偏差-前回の目標値との偏差)+
定数Ki×(目標との偏差)+
定数Kd×((目標値との偏差-前回の目標値との偏差)-(前回の目標値との偏差-前前回の目標値との偏差))
としている制御出力はPWMデューティなので
PWMデューティー = 1回転前のPWMデューティー + PWMデューティー差分
PWMデューティー差分 = 定数Kp×(目標回転数と現在回転数の差-1回転前の目標回転数と現在回転数の差)+
定数Ki×(目標回転数と現在回転数の差)+
定数Kd×((目標回転数と現在回転数の差-1回転前の目標回転数と現在回転数の差)-
(1回転前の目標回転数と現在回転数の差-2回転前の目標回転数と現在回転数の差)))
で制御している。定数Kp、Ki、Kdはステップ応答法とか限界感度法といった実測と計算を組み合わせた手法で決めるのだが式を見て解るとおり現在回転数を目標回転数に近づけているのは定数Kiだけ。これを現物あわせで決めてしまえばそれなりに制御できてしまう。
2012-02-13
両軸モーターが届いた。1個だけ軸が短い物が混ざっていた。中古なんじゃ無いかと思って中を開けてみた。無負荷回転数は3Vで3000rpm。5Vで5000rpm、9Vで9000rpm。9V無負荷時の電流は80mA。定格は不明なのだがたぶん12V。小型の模型用モーターは中国製でも安くは無い。殆ど国内価格と同じ。送料がかかる分だけ割高になる。

新品でした

さすがチャイナクオリティー。軸が短い。両軸モーターは国内で殆ど見かけないのでやむなし

RE-280の両軸タイプかと思ったが磁石はかなり強力。