コアレスモータ対応鉄道模型用コントローラの開発~その16・PIC版KATO KC-1~ [模型]
2018年12月22日の日記
やっと走行試験にこぎ着けました
難敵? のKATO C12をテスト中です。コアレスモータ搭載なので,2%程度のデューティでも走行してしまい,通常のコントローラでは常点灯になりませんが,本機では無事に成功です。停車中に前照灯も点灯しています。
☆ ☆ ☆
さて,先週,KATOの名コントローラKC-1のPIC版をご紹介しました。今週はデバッグして試験します。
まず,先週はKC-1の特徴である,高低2波のPWM波を発振させるため,まずは低周波PWMを動作させました。
PICに限らず,普通,DCモータは20kHz以上の高周波でスイッチングするのが当たり前なので,PICにはPWM発生機能がありますが,使用しているPIC用BASIC言語の Great Cow Basic のデフォルトの発振周波数が38kHzであることからもわかるとおり,KC-1のように50Hz前後という低い周波数で発振させるのはとても難しかったです。
最初,iruchanはこれはできない,と考えていました。GC BasicではハードウェアPWM制御用にHPWMというコマンドがありますが,設定周波数の単位はkHz単位となっていて,1kHz以下の周波数は設定できません。
でも,何のことはない,ちゃんとPWM波設定用のレジスタをきちんと設定すれば可能であることがわかったので,先週,無事に60Hzくらいの周波数で発振させることができました。
次はいよいよ常点灯用の高周波PWM波の発振をさせることができれば無事に成功! というわけだったんですが......。
これも結構,茨の道.....。
またまたドツボにはまってしまいました。
何度やっても20kHzくらいのPWM波が発振できません......
なんとか,発振させることができた,と思ってもほとんどデューティが0か100か,という感じでスムーズに発振させることができません。
いったい,どうなっとるんや.....。
と言うことでまた1週間つぶしてしまいました。今まで,何度もPICのPWM制御をやりましたけど,発振周波数で苦労したことはありませんでした。
よ~~く,考え直してみると,PWM波というのはPICのクロック周波数を分周して作っているので,低周波PWMの時に苦労しましたけど,クロックと密接に関連しているので,やはり簡単なはずの高周波PWMの方もきちんと計算しないといけません。なまじ,GC Basic は簡単にひとつのコマンドでハードウェアPWMができちゃうだけに,なめちゃっていました。
☆PICによるPWM周波数の決定
16F18325のデータシートを見ると,PWMの発振周波数の計算が載っています。データシートは周期になっているので,周波数に書き換えると,
となります。ここでfoscはクロック,TMRpreはプリスケーラの倍数の逆数(×8,×16など),PR2はPRレジスタの値です。タイマーが4の場合はPR4レジスタとなります。今回,低周波はタイマー2を,高周波はタイマー4を使います。resolutionは分解能です。
これで,なんとか,60Hzと20kHz前後の周波数が設定できるよう,PR2とプリスケーラ,クロックの3つを決めます。3つもあるので大変です。
結局,上記の式をExcelで計算し,適当な値を決めました。クロックは1MHzで動作させます。
fPWM 62.5Hz 17.9kHz
PR2 &hFF &h0C
プリスケーラ 1/16 1/1
分解能 10 5.8bit ※ fosc=1MHz
本当はなんとか高周波を20kHz以上にしたかったのですけれど.....。17.9kHzがやっとでした。20kHz以上にすると今度は低い方の発振周波数が上がっちゃいます.....orz。
まあ,ほぼ18kHzともなるとほとんどの人は聞こえないと思いますので,大丈夫だと思います。
さて,ようやくこれで高周波の方のPWMも動作するようになりました。
☆コアレスモータ対応のためのドライブ段の設計
さて,お次は高周波を出力して常点灯に対応させるのですが,これには条件がつきます。
従来のコアつきモータの場合は問題ないのですが.....。
コアレスモータはこの記事にありますとおり,2%台のデューティでも発進してしまい,常点灯に対応しなくなってしまいますので,最低デューティを1%台にしたいと思います。まあ,何とか,2%台前半に収まれば合格,と思っていますけど......。
でも,これ,むちゃくちゃ大変なのです.....。
仮に,スイッチング周波数を20kHzとして,デューティ1%と考えると,パルス幅は0.5μsです。目標として,2%未満と考えても,1μsの幅しか許されない,と言うことになります。
そんなの楽勝じゃん! と考えてはいけません。
バイポーラTrなら絶対に無理な数値なのです。高速スイッチング可能なMOS-FETでなら楽勝,と言う数値ではあるのですが,MOS-FETも前提条件があります。
たとえば,バイポーラTrとして,鉄道模型用のコントローラでよく使用されたNECの2SD560ダーリントンTrの場合,規格表には次のような数値が出ています。
出力されるパルス幅は ターンオン時間+蓄積時間+下降時間 以下にはできません。
とゆ~ことは,2SD560の場合,5.7μs以下のパルス幅は出力できない,と言うことになります。ほれじゃ,あかんやん......。そもそも,NECの規格表もパルス幅50μsに対して実験したものだし.....。
ただ,バイポーラTrでも,iruchanが使っている2SD409などで実験してもなんとか1μs台のパルスを出すことは可能なようです。おそらく,Nゲージなんかの軽い負荷の場合,コレクタ電流はせいぜい0.1Aくらいなので,このように小さな電流の場合は比較的高速にスイッチングできるのだと思います。
一方,MOS-FETの場合はこのうち,蓄積時間は0なので,非常に高速です。
同じNECの2SK2412の場合ですけど,単位がμsじゃなくて,ns なのに驚きます。
tonとtoffがパルス幅の限界と考えられますが,両方足しても0.085μsにしかなりません。
もちろん,MOS-FETは電界で動作する素子なので,バイポーラTrのように蓄積時間というものはありません。
蓄積時間というのはベースに外部から電子を供給すればonしますが,今度は蓄積された電子が抜けないとoffにならないので,その電子を抜くまでの時間です。MOS-FETだと電界で動作するので,この部分がないのです。
じゃ,MOS-FETの方が断然いいじゃん,と思っちゃうのですが.....
実はここに落とし穴があり,MOS-FETは入力容量Cissがバカでかいのです。バイポーラTrの場合はベース~エミッタ間を導通させて使用するので,この部分の容量は元から非常に小さいのですけど,MOS-FETはこの間が絶縁されており,金属酸化物がコンデンサとなって容量を持っちゃうのです。
CissはMOS-FETのCg-sとCg-dの和なのですが,これが入力容量として作用します。また,FETは電圧制御素子なので,ゲート電流は流れない,と思われていますが,この容量分を充電するための電流が流れます。
外部から電流を流すと,まずはこのコンデンサに充電され,FETのしきい値電圧Vthに達するまで,FETはonしません。また,offするときはこのたまった電荷を抜くまでoffしません。
iruchanも愛用している,80年代の開発で非常に古い2SK442はCissが小さく,330pFですが,90年代の2SK2412でもCissが小さく,860pFなのに(これでも非常にでかい!),あとでLTspiceでシミュレーションする,東芝の2SK2466の場合,3250pFもあります。最近のMOS-FETほど,Cissが大きくなっています。8000pFなんてあるものもあります。もう,天文学的数字だとiruchanは思っています。その点,同じ電圧制御素子である昔の真空管だとこの値は数pFですし,ソケットなども含めた実装時の容量は100pFくらいだと思いますから,MOS-FETは入力容量がでかすぎます。もし,2A3なんかでコントローラを作ったら非常に高速なものができるんじゃないかと......iruchanは考えています......(^^;)。
ということで,MOS-FETを使って高速スイッチングさせるには,やはりドライバ段が必要となります。大容量のコンデンサの充放電のため,大きな電流を流してやる必要があるからです。▼のように,かなり大げさな回路をつけ足してやることが必要です。
まあ,せっかくありがたい仏様がいらっしゃるのに,脇に立っている小僧さんに多額のお布施をしないと御利益が得られない,というわけです.......orz。しかも,最近のものほどCissが大きく,まるで本物の宗教みたい....なんてことは言ってはいけません。
☆PICによるMOS-FETドライブ回路
さて,じゃ,ドライブ回路というのはどうすりゃいいんだ,と言うことになりますが,こちらでも書いていますが,次のようなものです。
コンプリメンタリーTrをプッシュプルで動作させます。プラスの時は上側のNPN TrがMOS-FETのCissに電荷を低インピーダンスで注入します。パルスが0Vになると,下側のPNP TrがonしてCissに溜まった電荷を急放電します。
ちなみに,はき出す方をソース,吸い込む方をシンクなんて言ったりします。ついでに,日本語だと吐き出し電流,吸込み電流と言ったりします。ほのまんまやないか~。
RGはMOS-FETの発振防止のため挿入します。10~100Ωくらいです。大きくしちゃうとCissの充放電の時定数となるので,あまり大きくできません。なくても構いませんが,オシロで見て発振するようなら入れないといけません。
一方,なにげない抵抗なんですけどRsが実は大問題で,値によって大きく性能が左右されるばかりか,場合によっては,▼に示すように,使用するICの規格表によっては入っていません。
▲のようなプッシュプルドライバなら不要なのですが,シングルドライバの場合は絶対必要です。後で詳しく書きます。
プッシュプルドライバの場合は,下側のPNP Trが放電してくれるので,不要です。
抵抗は全部なくても大丈夫です。ただ,この場合,ドライバに瞬間的に結構大きな電流が流れるので,注意が必要です。RB1,RB2はベース電流を制御してコレクタ電流を抑えます。
ただ,実際,このようなドライバ回路を挿入してある場合はほとんどないと思います。iruchanも実際の回路では見たことがありません。
理由は単にコストの問題でしょう。それに,1μsのパルスが必要,なんて場合がおそらくほとんどないからなのでしょう。モータをPWM制御することは今は非常に多いのですが,普通は数十%というような大きなデューティで動作させるので,わずか1%とか,2%とかといった低いデューティのパルスを出すことはほとんどないからです。その意味で,鉄道模型というのは直流モータを駆動する場合としては特殊だと思います。
なお,NPN(プッシュ)側は▼の説明にもありますとおり,ICの中でエミッタ出力となっていることが多いので,こちらの方ははるかに楽です。それで,単純にDiのP-N接合で代用してしまう場合も多いです。iruchanも前回のKC-1改ではこのようにしました。
さて,実際にPICなどのマイコンでMOS-FETをドライブする場合,ドライバ段を使っていない場合がほとんどなのですが,この場合,注意が必要です。実は2種類あります。
これ,どう違うんや? ってことなんですけど......。
ICの出力部分がどのようになっているかによって回路を変えないといけないのです。よく,PICなどマイコン関係の本に書いてあるのは下の回路です。東芝のMOS-FETの資料にもこう描いてあります。
ただし,この場合,ICの出力回路がプッシュプルになっている必要があります。C-MOSのICはたいてい,プッシュプルになっていると思います。PICの場合も普通はプッシュプルになっています。ところが,驚いたことに16F18325なんかそうですけど,ODCONAレジスタのビットによってプッシュプルかシングルか選択ができるようになっています(デフォルトはPP)。何の意味があるんだろ,と思いますけどね.....。
TTLのロジックICや,KC-1のオリジナルで使用されているTL494などのICの場合,出力がシングルのTrになっていて,エミッタで出力されている場合が多いです。特に,70年代や80年代の頃の設計のICはこうなっている場合が多いです。
このとき,Rsを挿入しておかないと,MOS-FETのCissに溜まった電荷を逃がすことができません。
よく,ちゃんとICがパルスを出力しているのに,出力がデューティ100%となって出力全開となるトラブルがありますけど,原因はこれです。この場合,必ず100~1kΩくらいの抵抗でMOS-FETのゲートを接地してください。Rsは小さい方が高速でスイッチングできますけど,ICの出力電流の制限がありますから,あまり小さくしないでください。
いずれにしろ,MOS-FETをドライブするためには接続するPICなどのICの出力回路がどのようになっているか,確認が必要です。また,この場合,最大出力電流(ソース,シンク電流)の値を確認する必要があります。KC-1改で使ったTL494は250mAもありましたが,PICの場合はせいぜい20mAのようです。これでも十分大きい値なのですけど,大容量のCissを持ったMOS-FETをドライブするには不足であると考えています。
もう一つ,▼の回路のR3も結構,問題があります。最初,10kΩにしておいたら,パルス幅が2μsくらいとなってしまいました。これじゃあかんやんか,と言うわけで小さくしてみます。この抵抗は下側のPNP Trのベース電流を決めます。ベース電流を大きくしてやらないとCissの放電電流が小さくなって,パルス幅が大きくなってしまいます。
さて,ちょっと,シミュレーションで確認してみませう。
教科書や,東芝のwebにある,MOS-FETの記事などに載っている回路です。ドライブ回路として,PNP-NPNのコンプリメンタリTrを使ったプッシュプル回路です。パルスが出ているときは上側のNPN Trがonし,反対にパルスがないところでは,下のPNP Trがonして電荷を充放電します。
ただ,シミュレーションしてみるとわかりますが,プッシュプル回路と言っても,プッシュ側の方がやたら大きな電流を流し,下手すると最大定格を超えて壊れてしまうので,ベース電流を制限するため,抵抗を入れてあります。反対にプル側のPNPの方は不足気味なくらいです。
では,R3の大きさによるパルス幅の違いを見てみませう。クリックすると拡大します。
R3が1kΩの時はパルス幅は1.4μsです。パルスの立ち上がりにNPNのTrのエミッタ電流が増え,逆に立ち下がりはPNP Trのエミッタ電流が流れてCissに充電された電荷を逃がしていることがわかります。PNP側の方が電流が小さく,立ち下がりをいかに速くするか,が課題だというのがよくわかります。
ただ,10kΩにすると,やはりこれらの充放電電流が小さくなり,パルス幅も大きくなります。2μsくらいになっちゃいますね。
結局,基板を作って実際にはR3は470Ωまで小さくしました。100Ωくらいにするともっと高速になりますが,PICのピーク電流定格を超えちゃうのであきらめます。
回路を載せておきます。2つのPWMチャンネル出力をスイッチングDiと抵抗でミックスしています。本来ならORの論理ICを入れるべきですけどね~~。面倒なのでアナログ合成です。
もっとも,16F18325は論理回路も作れます。この2つのPWMのORを取るくらいできるので,そうするともっと回路をシンプルにできますが,ソフトをいじらないといけないので,このままです。
出力部分にスナバ回路を入れています。こうしておくと,波形の立ち下がりが緩くなり,車両側にスナバ回路を入れなくても常点灯+逆向き前照灯の点灯防止ができるはずです。
75×35mmの大きさです。基板上に出力信号のモニタ用のLED(オレンジ)を取りつけました。これをつけておくと,テストの時も,運転中も便利です。
☆ ☆ ☆
さて,ようやくこれでうまくいくようになりました。波形を載せておきます。
ちゃんと,低周波の大きなパルスの間を埋めるように高周波のパルスが出ていることがわかります。
周波数は16.5kHzです。若い人だと聞こえちゃうな~。
でもパルス幅は1.1μsですし,最低デューティは1.83%で2%を下回っていますから合格です。
大きくオーバーシュートしているのが気になりますけど.....。ピーク電圧は15.8Vになっています。瞬間的なので全然問題ありませんけど,おそらく,ゲートに挿入する抵抗RGをなくしちゃっているからだと思います。やはり10Ωくらいは入れてみて,ピークを抑えた方がよいと思います。
12月23日追記
さて,ようやくKATOのC12の試運転にこぎ着けたのですが.....なんと,最低デューティ1.8%でも動いちゃうじゃないですか!!
こちらで,C12の最低起動デューティを調べていますが,そのときは2.7%でした。同じくKATOのコアレス機D51ギースルエジェクタでは4.6%でしたけど,その時はC12は大変だ~っと思っていました。
ところが,本機でテストすると,本機の最低デューティは1.83%なのに,非常に低速なんですが,動いちゃいます。
困ったな~~~
手としては,デューティをもっと下げればよいので,
☆スイッチング周波数を低くする
☆最低出力パルス幅を狭くする
しかありません。
ただし,現状,スイッチング周波数は16kHzなので,これ以上,下げちゃうと完全に音として聞こえてしまいますので,この手は使えません。
となると,次の手は最低出力パルス幅をもっと狭くして,現状,ほぼ1.1μsなので,この半分で0.5μsだったら大丈夫,という気がします。
しかしなぁ~~。
今までの議論でおわかりいただけると思いますが,これは非常に大変なのです。PIC直結のドライブ法だと無理だと思います。
一応,本機は高速プッシュプルドライバを入れているので何とかなる,と思いましたけど....。
とりあえず,ソフトを再検討します。
でも,何度やっても1μs以下のパルスが出てきません。
なんでや~~!?
頭を抱えちゃいましたが,やはり,PICのPWMコントローラの周波数分解能の問題だと思います。今までの話でおわかりいただけるように,PWMの周波数やデューティはPICのクロックと密接に関係しているので,もう一度,クロックから考えてみます。
結局,何のことはない,現状クロックを1MHzにしていたのですが,2MHzにしないと最低パルス幅は1μsより下がらないのです。16F18325のデータシートをよく読んでみると,CCPR4L(タイマー4の場合)レジスタで最低パルス幅が決まっちゃいますが,最低の1にしておいてもクロックが1MHzではパルス幅は1μsにしかならないことがわかりました。
となると,クロックを2MHzにしてやればOKのはずですが.....。
今度は低周波のPWMが当然パルス幅2倍になっちゃうので,スイッチング周波数も120Hzくらいになっちゃいます。
こちらの方はプリスケラを現状,1/16なのを1/32にしてやればええやろ,と思ったのですけど....。
残念ながら,プリスケラは1/16の次は1/64でおしまいです......orz。
結局,クロックは4MHzにしてようやく一件落着でした。高周波側のプリスケラは1/4にしました。
こうしてなんとか,高周波スイッチング周波数を20kHz,低周波はそのままで63Hzにすることができました。
最低デューティは1.4%です。C12はこれでは動きません。
最低パルス幅は0.363μsでした。こんな狭い幅のパルスを出力するのはきわめて困難です。やはり高速プッシュプルドライバとMOS-FETの出力段が必要です。
なんとか,C12が止まったままで前照灯を点灯させることができました
本機の高周波パルスはVR全周で0~5%の範囲で可変できるようにソフトを組んでありますので,非常に常点灯の範囲も広く,楽勝でこのように機関車が止まった状態で前照灯だけ,点灯させることができました。なお,コアレス機の場合は最大デューティにしちゃうと動き出しちゃいますので,ご注意ください。通常のコアつきモータだと調光用のVRを最大にしても動くことはないのですけど....。
次回はソフト制御の電流遮断型保護回路についてソフトを開発します。
2018-12-23 00:00
nice!(7)
コメント(5)
調光用VRは回路図では10k、画像では1kのよう見えますが、1kを使えばよろしいでしょうか。
また、再度で申し訳ありませんが、パターン図を載せていただけるとありがたいです。
by ku-1 (2019-02-11 11:20)
どうも失礼しました。
このVRはポテンショメータモードで使っているので,定格以内なら何Ωでも結構です。手持ちの10kΩをきらしちゃったので1kΩで代用しています。
なお,パターン図およびソフトは今後,公開しないことにしました。ご了承ください。
by iruchan (2019-02-11 21:03)
ご教示ありがとうございました。
万能基盤で作ってみます。
by ku-1 (2019-02-11 21:41)
週末を使って作ってみました。
kc-1よりもスローが効いてお見事です。
車両によって音が大きめに出るのは、スローとのトレードオフでやむなしといったところでしょうか。
これまでにいくつか作らさせていただきましたが、その5で発表されたPIC利用の単一PWMのものが、車両による差が出ないことと性能のバランスが良いので愛用しています。
ありがとうございました。
by ku-1 (2019-02-18 00:21)
ku-1さん,どうもコメントありがとうございました。また,パターン図とソフトの件失礼しました。
ご指摘のとおり,起動時に少し音が出るようです。ただ,個人的にはハードウェア方式と差はないのでは,と思っています。
by iruchan (2019-02-19 08:01)