PWMの基本周波数変換のためのプログラムを諸兄の
CSSコンパイラー(高い)から、無料のHI-TEC-Cコンパイラー
に移植しました。
諸兄は、200Hz(MCAHの設定)を20000Hzに変換して
いますが、私は秋月のPWMコントローラーでも使えるように
100Hz(MACHの設定)を10000Hzに変換するようにしまし
た。諸兄は、MACHからのPWM信号のサンプリングをTIMER2
の割込で、50μsごとにやってますが、私のプログラムは、
基本周波数を半分にしたためと思いますが、倍の100μs
ごとのサンプリングになりました。
また、諸兄のプログラムでは、AD変換を使って、マニュアル
でPWM信号を生成できるようにしてありますが、AD変換
を加えると、プログラムが面倒なので、省略です。
テスト用の基盤でやってますので、ユニバサール基盤に
作り直す予定です。作り直してから、外部割り込みのテスト
をします。
PWMの信号を段階的に、プログラムから変化させてます。
実際は、サンプリングによって、変化させます。
参考のために、作成したプログラムを掲載しますが、テスト
用に、ダミーが沢山入っています。もちろん、動作の保証
等はありませんので、あしからずです。
---SPINDLEのPWM制御 (基本周波数の変換) (2)---TIMER1の設定
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // 262ms
の262msは、262msごとに割り込みをかける意味ですが、
なぜ、262msなのか、意味が分からず、あれこれ調べて
ました。
ある本で、
「PICのクロックを8MHZとすると最長262msのタイマー値を
得ることができます。」
の記事を見つけました。
やっと262msの意味がわかりました。次のように計算します。
タイマーの基準のとなる時間は、
(1/クロック周波数)×4
で求められます。私が、プログラムに使っている16F88の
クロックは8MHzなので、
(1/8Mhz)×4=0.5μs
「1」をカウントするために必要な時間は、0.5μsですが、
プリスケラ-(分周)との組みあわせで使います。
プリスケラ-を8とすると、「1」をカウントするための時間は、
0.5μs×8=4μs
になります。
TIMER1には、16ビットのカウンターを使うので、
最大、
16進数でFFFF(一桁を表すのに4ビット使うので、
4桁で16ビット)
10進数で65535回
を数えることができます。
目一杯数えると、
4μs(一回カウントするための時間)×65535回
=262140μs
262140μs=262.14ms
ということで、262msの時間がかかります。
やっと262msの数値がでてきました。
これを使うにあたっては、カウンターをセットする必要が
あります。
次のように、二つのレジスタを使って設定します。
が、
TIMER1H=0XFF
TIMER1L=0XFF
のように、設定すると最大の0XFFFF(16進数)の65535
の設定ができます。
アップカウンターなので65535を数えるには、
TIMER1H=0
TIMER1L=0
のようにします。
それでは、目的の数値を設定するには、
どうすれはいいのでしょうか。
TIMER1Hには、4桁の数字の上位の2桁を、TIMER1Lには、
4桁の数字の下位2桁をセットしますので、上位2桁と
下位2桁を取り出す必要があります。
たとえば、10進数で、8546の85を取り出すには、
8546÷100
をやって、小数以下を切り捨ててしまえば、目的の「85」
の数値を取り出せます。
これと同じことを、ビットをずらすという命令を使って実現し
ます。ビットをずらす命令は、2進数で考えますので、
4桁の数値を2進数にすると16桁になります。
○○○○ ○○○○ ○○○○ ○○○○
赤が目的の数値ですので、右に8こずらすと、
○○○○ ○○○○ ○○○○ ○○○○
となり、ずらした後には、0が挿入されますの、これで目的
の上位2桁を取り出せます。これをするには。
8546 >> 8
とします。つまり、85をTIMER1Hにセットするには、
TIMER1H=(8546 >> 8)
とすればいいわけです。
では、下位2桁を取り出すにはどうすればどうすればいいで
しょうか。
8546-8500
をすれば、46の数値がとりだせます。これを実現するのに、
やはり2進数で考えます。マスクをかけるというような言い方
をしたりしますが、「and」という演算をします。二つの数値を
比べて、次のような出力になりますから、
0と0は0
1と0は0
0と1は0
1と1は1
次のように、16進数で「OOFF」(2進数で0000000011111111)
とのAND演算をします。
すると上位2桁が0になって目的の下位2桁の数値が取り
出せます。実際は、次のようにします。
TIMER1H=(8546 & OX00FF)
これで、下位2桁の「46」をセットすることができます。
8546回数えさせるためには、
TIMER1H=(8546 >> 8)
TIMER1L=(8546 & OX00FF)
と言うように、2行に分けて、記述します。
難しかったです。ここまで理解するのに、3日ぐらいかかり
ました。
---SPINDLEのPWM制御 (基本周波数の変換) (1)---
諸兄の作ったプログラムを、穴の開くほどながめていました。
タイマー0、タイマー1、タイマー2、外部割り込みを使ってます。
一部、数値の意味の分からないところもありますが、同じもの
が時間をかければできそうな気がしました。
ちなみに、それぞれの割り込みは、
タイマー0・・・・・・MACHからのPWM信号の有無の検出
出力用PWMの初期設定
タイマー1・・・・・・マニュアルでのLCDとLEDの点滅
タイマー2・・・・・・MACHからのPWM信号のHとLの時間
の計測
外部割り込み・・・PWMの一周期の検出とDUTY比の計算
PWM信号の有無の検出(追記)
をしてるようです。
分からなかったのが、タイマー2がPWMの信号も生成して
るはずですが、割り込みにも使われているので、ここがわ
りませんでした。
PWMの生成と一緒にタイマー2の割り込みも実行できる
ようで、やっと、その資料も見つけました。
ちょっと、離れると、細かい設定の仕方を忘れてしまいます。
諸兄のCコンパイラーは、CCSのようで、私が使っているのは、
無料のHI-TECH-Cなので、割り込みや細かい記述(文法)が
違います。また、いろいろあさりながら、楽しみます。
---SPINDLEのPWM制御---
sable2015のスピンドルに、ブラシレスモーター(模型用)や
ちょっと前に発売になった専用の20VのDCモーターを使った
りしてます。
どちらにも一長一短があるのですが、DCモーターの方が静か
なので、こちらを使おうかと思いました。
ブラシレスモーターは、既存のインターフェースを使って、速度
制御したことがあるのですが、DCモーターということで、
秋月の「PWM(スイッチング方式)DCモーター速度可変キット」
を使って、マニュアル操作とMACHからの制御の切り替えができ
ないかと、思いつきました。
マニュアルは、簡単に接続すればいいのですが、MACHから
となると、一工夫が必要なようです。
MACHからのPWMで直接モーターを制御するには、
問題があると諸兄のHPにはあります。
「周波数の設定は任意に変えられる。 高くも設定できるのだが、
階調が低下するので実用的ではない。
例えば、カーネル周波数が35KHzの場合にPWM周波数を1KHzに
すると階調は35段階だ。
殆んどの人が聞こえない15KHzを選ぶと階調は2.3段階になって
しまう。」
この意味がなんとなく分かりました。秋月の「PWM(スイッチング方式)
DCモーター速度可変キット」は、PWMの基本周波数は、10KHz
と記載があります。
詳しいことは分かりませんが、搭載してあるパワーMOSFETを制御
するにあたって、この周波数が最適なんでしょうね。
とすると、諸兄が言っているように、MACHで、基本周波数を高く
すると、階調の問題が・・・・・・・・・・・・・・・。
カーネルの周波数を25000Hzとして、MACHの設定を、
「PWM(スイッチング方式)DCモーター速度可変キット」と同じ
10kHzにすると、おおよそ、低・中・高の3段階ぐらいの切り替え
しかできないことになってしまうようです。
階調のことを考えると、MACHの基本周波数を低めにして、
コンバートの回路でもつくる必要があるんでしょうね。
一つまた、勉強しました。
---MACH3からのPWM信号---
MACH3からのPWM信号をパラレルポートで確認しました。
Dsub25ピンから信号を取り出すのに、秋月の
RS232 GENDER CHANGER
を使いました。Dsub25コネクターを二つ組み合わせて、
ストレートの結線を作ってももよかったのですが、細かい作業
になるので、やめました。
これの1ピン(出力)、14ピン(出力)、25ピン(GND)にブレッド
ボード用の線をハンダ付けし、ケースの隙間から引き出して、
ケースをとじました。
これで、ショート等の事故が少なくなります。
SmoothStepperと同じで設定で、回転数1000~10000まで、
確認してみました。ポート1の14ピンに出力してます。
回転数に応じて、きれいにパルスの幅が倍増していくの
が確認できました。
1000回転の設定で、パルス幅は、約1msです。
5000回転の設定で、パルス幅は、約5msです。
上限に設定した、10000回転で、約10msです。
今回は、コントロ-ルボードを通さないで、パラレルポートから直接
とりだしました。応答もよく、きれいな波形でした。
実際のコントロールに使うには、いろいろ工夫がいるんだろうな
と思いました。
便利な道具も販売されているようで、MACHのPWM信号を
電圧に変換するボードもあるようです。
---SmoothStepperからPWM信号---
SmoothStepperはやはり、優れものでした。あれこれ、悩み
ましたが、きちんと、PWMの信号が出ていました。
あの大きさで、ポート2.5個分ぐらいのインターフェースを
もっているのですから、しょうしょう高めでも納得です。
========================
でも、パラレルポートって、どうなんでしょうか。もう、そろそろ
時代の遺物の仲間入りでしょうか。もともとは、プリンター等
のインターフェースですし、今では、プリンターは、USBで、
パラレルポートは、使いませんから、パラレルポートの用途は
特殊なものになりつつあるような気がします。ネットで検索
すると、まだあるようですが、需要は、あるのでしょうか。
=========================
結局、SmoothStepperからのPWMの信号を確認できなかった
のは、初歩的なMACHの操作ミスでした。
今回も諸兄のHPをみながら、設定をしました。私の設定は、
で、出力をSmoothStepperのポート2の17ピンに割り当てました。
PWMを選択して、PWMBaseFreqを 100にしました。
PullySelectionを、
のように設定し、SmoothStepperのUSB SmoothStepper Configを、
のようにしました。Base Hzがここにもあるので、SpindleSetup
の数値と一応そろえました。
この設定で、MACHのエラーもでなくなりました。
PWMの信号が確認できなかったは、出力するための、
Spindle Speedに希望の回転数を入力しないで、操作したから
でした。ここで、はまったようです。
設定を済ませた後、Spindle Speedをクリック、数値を入力リターン、
F5(Spindle CW F5をクリック)で、あっけなくパルスが確認
できました。
たくさん参考になるHPを諸兄が作ってあります。
ここや、ここ(11ページ~13ページ)、
を参考にしました。
全部のピンを確認した訳では、ありませんが、Ports and Pin
の設定で、PWMの設定をするのに、ポート1を選んで、Step
だけの設定をして、Dirの設定を0のままにしておっくと、MACH
に設定をしてくださいと怒られてしまいます。ポート2だと、そのま
ま通ってしまいますので、もしかして、SmoothStepperは、Spindle
の設定で、ポート1は考えてないのかな、と思いました。
基本周波数の設定やらプーリーの設定やら、意味が分からず
に設定しました。システムに見合った設定できるように、また、
勉強です。