Front Page                                                                2014,12,03 掲載

   CNC3020のスピンドル制御

CNC3020のスピンドル回転速度をMach3から制御するPWM基本周波数変換アダプターを作った。
これによってGコードからスピンドルの回転数を設定できるようになった。以下に解説する。
         

1.Mach3-PWM出力の問題点

Mach3にはスピンドルの回転数を制御するためのPWM信号出力機能が在る。
但しCNC3020の説明書に記載された設定では、この機能は働かない。

Mach3のPWM出力は、RCフィルターを通して0-5Vの直流電圧を得る事を想定しているようだ。
直接にモーターを制御するには周波数が低過ぎる。
可聴周波数のPWM信号でモーターを回すと、モーターから騒音が出る。

周波数の設定は任意に変えられる。 高くも設定できるのだが、階調が低下するので実用的ではない。
例えば、カーネル周波数が35KHzの場合にPWM周波数を1KHzにすると階調は35段階だ。
殆んどの人が聞こえない15KHzを選ぶと階調は2.3段階になってしまう。

CNC3020ではないが、下記はその問題を解決した例だ。
    Methods to control the beam power of a laser tube.

注:上述のページに在るソースファイルは、
  一部の包含ファイルが含まれておらずコンパイルしてもエラーになります。

2. CNC3020制御箱の隠れた機能

当初は速度設定ではなく切削終了時にスピンドルを止めたかった。
その情報を求めてネット上でYoocncの回路図をを探したところ下記に在った。
    CNC Engraver Schematics (YOOCNC-NT65-3X)

CNC3020の制御箱には、スピンドルモーターの制御基板とステッピングモーターのドライバー基板が入っている。
その回路図を読んだところCNC3020では使っていない回路が在るのが判った。その一つがPWM対応回路だ。

スピンドルモーターの制御基板には、
PWMを基板上で作るのか外部から入力するのかを選ぶスイッチ入力コネクター( ピンヘッダー:SW1 )と、
外部からのPWM信号を受け入れる為の入力コネクター( ピンヘッダー:PWM )が在った。
         

ステッピングモータードライバー基板にはパソコンのパラレルポートからの信号を受け
ロジックICを介してPWM信号として出力するコネクターが設けられていた。
しかも+5V( VCC )の電源も供給されていた。
PMW基本周波数変換アダプターに使って下さいと言わんばかりの心配りだ。
ただ残念な事にコネクター( ヘッダ )は付いていない。ここだけ基板の改造が必要だ。
         

ステッピングモータドライバー基板のPWM出力コネクターと、
スピンドルモータードライバーのPWM入力コネクターの間にPMW基本周波数変換アダプターを入れれば
Mach3でスピンドルの回転数を設定できる筈だ。
これなら基板を改造せずにすむ。スピンドルを止める改造よりも簡単だ。

PMW基本周波数変換アダプターを使わずに直結しても動く筈だが、騒音の懸念は在る。
下記は実際にそれをやった方の記事だ。
    CNC3020T: EMC2 configuration and hidden features

3. 回路基板の製作

使い慣れたPIC12F683を使って作った。PIC12F683には8ピンのICだがPWM出力やADC入力を備えている。
簡単な回路だったので回路図を描かずに、直接機械CADで回路パターンを設計した。横着だが、それだけではない。
電子回路CADでノイズ耐力の在る基板を設計するのは難しいからだ。思ったようなパターンが出来ない場合が多い。
           
上の写真で右端のコネクターがステッピングモータードライバーからの入力用。
左端の2極のコネクターはスピンドルモータードライバー基板への出力用だ。

後日、忘れると困るので回路図を描いた。総てのコンデンサにはチップの積層セラミックを使った。

入出力に使っている端子は、下記のようだ。
         7番   GP0   アナログ入力   RCフィルタ経由( R:22kΩ C:10μF )
         6番 GP1 出力モニター用LED駆動出力 ( R:330Ω )
         5番   GP2   PWM出力

Mach3からのPWM信号はRCフィルターで直流としAD変換器で受け取る。
アナログにしたのでデバグ作業に使う模擬信号源が可変抵抗器で済み簡単になった。
デジタルでも可能だが、デバグ作業に模擬PWMを出せる信号源が必要で面倒だ。

4、ソフトの要点

    ①移動平均処理
        Mach3からのPWM信号をRCフィルターで直流に変えてPIC内蔵のAD変換機に入力している。
       僅かにリップルが残るので10mSの移動平均フィルタを用い減衰させた。

    ②出力モニター用LED
        1秒周期のモニター用PWM信号を作りLEDを点灯した。モニター用PWM信号のメーク比は出力PWMと同じだ。
        これで出力の状態が大まかに把握できる。

    ③出力PWMの基本周波数
       約15.6KHzにしてモーターから可聴周波数の騒音が出るのを避けた。

    ④加速制御
       スピンドルモーターを起動する際のラッシュ電流を緩和する為に、加速制御を行った。
       直線的に加速し100%出力に至るまでに0.5秒掛かるようにプログラムした。減速も同様。

       いきなり高速回転で起動するとフューズが溶断する恐れがある。
  短期間には切れなくとも膨張と収縮で金属疲労を起こし、フューズの寿命が縮む。

4-1 ソースファイルの詳細  ( 2017,01,20 作成 )
開示にあたり新たにプログラムを書いた。
割り込みや構造体などの難解な記述を避け、
PICの初心者でも理解しやすい平易な表現を心掛けた。
他のCPUや言語への移植も容易だと思われる。

デバッグ済みですが、万一瑕疵があった場合でも当方は一切の責任を負わない。
活用される方は、各自の自己責任において安全に配慮し対処して下さい。

//
//
//      Base frequency converter for MACH3 PWM 
//
//      Rev.1 :         '17,01,20    y.ogawa 
//     Compiler :     CCS-C Ver.3.
//     Writer :         MPLAB ICD 3.
//

#include <12f683.h>          // Change if you use a different chip.
#device ADC=10                 // AD Converter 10 bits mode.

#Fuses INTRC_IO,WDT,NOCPD,NOPROTECT,MCLR,NOPUT,BROWNOUT,NOIESO,NOFCMEN

#use fast_io(A)
#use delay(clock=8000000)

//
//          Port-A    I/O list  
//
// bit0     In           Sens voltage
// bit1     Out         Monitor LED driver
// bit2     Out         PWM Output
// bit3     MCLR
// bit4     Out         No connection
// bit5     Out         No connection

//
//                Define variables  
//
int16     Volt;                             // Input voltage from MACH3-PWM
int16     M1,M2,M3,M4,M5;       // Memory for Filter
int16     M6,M7,M8,M9,M10;     // Memory for Filter
int16     Duty;
int16     Set_point;                   // Target value of the speed control.
int16     Led_timer;                  // Timer for LED PWM monitor.
int16     LED_duty;

//
//      Definition of the peripheral function
//
main() {
    setup_oscillator(OSC_8MHZ);                    // CPU Clock 8MHz.
    set_tris_A(0b00000001);                         // 0:Output 1:Input

    setup_ccp1(CCP_PWM_PLUS_1);             // Set to PWM mode
    setup_timer_2(T2_DIV_BY_1,0x7F,1);     // 15.625kHz at 8MHz clock
    set_pwm1_duty( 0 );                                 // 9bit mode

    setup_ADC_ports( AN0_ANALOG );
    setup_ADC( ADC_CLOCK_DIV_2 );

    output_bit(pin_a1,0);

//
//           Initialization of a variables 
//
    duty = 0;
    M10 = 0;
    M9 = 0;
    M8 = 0;
    M7 = 0;
    M6 = 0;
    M5 = 0;
    M4 = 0;
    M3 = 0;
    M2 = 0;
    M1 = 0;

//
//
//                 Start point of the endless loop
//
//
    while(1) {                              // Endless loop.

            set_adc_channel(0);         // Starting of AD conversion.
            delay_uS(703);                 // Adjustment of the timing. ( 1mS )
            restart_WDT();                 // Restart Watch Dog Timer.

//
//            Moving average ripple filter 
//
            M10 = M9;
            M9 = M8;
            M8 = M7;
            M7 = M6;
            M6 = M5;
            M5 = M4;
            M4 = M3;
            M3 = M2;
            M2 = M1;
            M1 = read_adc();             // Reading of the voltage.

            Volt = ( M10 + M9 + M8 + M7 + M6 + M5 + M4 + M3 + M2 + M1 ) / 10;
            Volt++;

//
//               Control of Spindol speed and acceleration
//
            if ( Volt > 1023 ) Volt = 1024;              // Upper Limiter;
            if ( Volt < 102) Volt = 102;                   // Lower Limiter;

            Set_point = Volt / 2;                             // Convert 10bits to 9 bits

            if ( Duty < Set_point ) Duty++;
            if ( Duty > Set_point ) Duty--;
            if ( Duty > 0x200 ) Duty = 0x200;         // Upper limiter ( 0x200 = 512 )

            set_pwm1_duty(Duty);

//
//                 LED Monitor 
//
            Led_timer++;
            if (Led_timer > 1000) Led_timer = 0;                             // Period 1 second.

            LED_duty = Duty * 2;
            if ( Led_timer < LED_duty ) output_bit(pin_a1,1);         // LED Lighting up.
            else output_bit(pin_a1,0);                                              // LED Turning off.
    }
    return 0;                                                                                 // Finish endless loop.
}

注:このリストをコンパイルすると、
“ while(1)”の所で「 Condition always TRUE 」との警告メッセージが表示されます。
問題ないので無視して下さい。

4-2 Hexファイル  ( 2017,02,07 作成 )
CCS-Cが手元に無い方は上記のソースファイルをコンパイルできない。
それでは不便なのでHexファイルを開示した。

:10000000000000308A0039280830C302031C13287E
:10001000433084000310800C0008031913281128B2
:100020000000800B10288B28A101A201A001A301D0
:100030004708031D1E284608031938281030C80039
:100040000310C40DC50DA00DA30D47082302031D09
:100050002B2846082002031C34284608A002031C53
:10006000A3034708A3020314A10DA20DC80B202867
:10007000FC2884011F308305713083168F000F0820
:1000800083121F1383161F109F101F119F1107301B
:1000900083129900713083168F000F08013085009C
:1000A000831205111C3095000030A1000438920025
:1000B0007F3083169200831293011F1383161F143F
:1000C0009F101F119F111F129F121F1383129F1742
:1000D0001F148510BB01BA01B901B801B701B601FF
:1000E000B501B401B301B201B101B001AF01AE017C
:1000F000AD01AC01AB01AA01A901A801A701A601AC
:100100000030A1001F08F33921049F001330C20002
:100110002330C3000428C20B882864003708B900C4
:100120003608B8003508B7003408B6003308B50003
:100130003208B4003108B3003008B2002F08B10013
:100140002E08B0002D08AF002C08AE002B08AD0023
:100150002A08AC002908AB002808AA002708A90033
:100160002608A8009F149F18B32883161E08831220
:10017000A6001E08A70036083807C2003908C300C9
:1001800037080318370FC3073408C20735080318A8
:10019000350FC3073208C20733080318330FC307EC
:1001A0003008C20731080318310FC3072E08C207F1
:1001B0002F0803182F0FC3072C08C2072D08031898
:1001C0002D0FC3072A08C2072B0803182B0FC307DC
:1001D0002808C20729080318290FC3072608C207E1
:1001E00027080318270FC3074308C5004208C400A7
:1001F000C7010A30C60014282208A5002108A4005F
:10020000A40A0319A50A2508033C03180A29043087
:10021000A500A401A508031D14292408653C031C9E
:100220001429A5016630A4000310250CBD00240C80
:10023000BC003B083D02031C2629031D23293C0862
:100240003A0203182629BA0A0319BB0A3D083B02E1
:10025000031C3429031D30293A083C0203183429B1
:100260003A080319BB03BA033B08013C03184229AF
:10027000FF3A031D3F293A08003C03184229023087
:10028000BB00BA013B08A2003A08A100A20CA10CD5
:10029000A20CA10CA20C21089300A20C220C303954
:1002A000A0001508CF3920049500BE0A0319BF0A23
:1002B0003F08023C03186529FF3A031D63293E08E5
:1002C000E83C03186529BF01BE0103103A0DC000C8
:1002D0003B0DC1003F084102031C7629031D742910
:1002E00040083E0203187629851477298510802856
:0602F0000030A1007A2994
:02400E00F4308C
:00000001FF
;PIC12F683
;CRC=8ECD CREATED="07-2-17 07:35"


5、制御箱への取り付け

基板を固定する為にケースへ穴あけ加工を行うのが面倒だった。
そこで磁石で吸着させる方法を思いついた。
基板ホルダーをアクリル板から削り出し、そこに埋め込んだネオジム磁石でケースの鉄板に吸着させた。
左下の写真で大きな基板の間に在る小さな基板がPMW基本周波数変換アダプターだ。


上の写真で右はステッピングモータードライバー基板のPWM出力部を拡大した。回路は在るがコネクターが無い。
ここへコネクターを半田付けした。改造らしい改造は、ここだけだ。
入力と出力ケーブルを差込みSW1の短絡ピンを外部PWM( 2-3 )へ移動して取り付け完了だ。

6、Mach3の設定

設定は前出のページと殆んど同じで差異は下記の三点だけだ。
    ① 出力ピン番号    ( Step Pin# ):   17
    ② PWM基本周波数 ( PWM Base Freq. ) :     98  Hz
    ③ 最大回転数 ( Max Speed  ):   10,000  RPM

7、特性の測定

Mach3の回転数設定を変えてスピンドルの回転数を実測した結果が下のグラフだ。


自分が良く使う2000RPMから8000RPMの範囲は誤差が5%以内に収まっている。

その範囲外で誤差が多いのはフォトカップラーの特性に起因すると思われる。
スイッチング速度が遅く、狭いパルスを潰してしまうからだろう。
PWM基本周波数を7KHz程度まで下げれば改善される筈だが、騒音が出る。

現状の特性でも充分実用になる。騒音は嫌いなのでPWM基本周波数はこのまま使う。

回転のフィードバックが無いので空転と切削中では回転数が変わる筈だ。そこで測定した。
直径2.8mmの刃を6000RPMで廻し、切込み0.5mm、F:100でアクリル板を削った。
空転中は6,029RPMで切削中は5,780RPMに4%程下がったが、無視して良い範囲だ。
これはマグネットモーターの優れた特性によるところだろう。

8、Power FETの温度上昇

従前の555によるPWMは基本周波数が16.6KHz(0%出力)から12.3KHz(100%出力) だ。
これを15.6KHzに上げたのでPower FETのスイッチング回数が増えた。
これに伴い発熱が増える可能性が在る。

そこで6000RPMで30分間連続運転し赤外線温度計でPower FETの温度を測定した。
起動前の温度で20.2℃だったのが30分経過後に27.5℃まで上昇した。7.3℃の上昇だ。
従前は2.8℃の上昇だったので4.5℃も増えたが、問題になる温度ではない。

我がCNCはPower FETをオリジナルよりも発熱が少ない東芝製に替えてある。

9、実用後の結果等

スピンドルがプログラムにより制御できるので、加工終了後に自動停止させられる。
もちろんプログラムの末尾にS0命令を入れて指示しなければならない。
気の利いたCAMソフトは、何も指示しなくともS0命令を入れてくれるらしい。

加工終了後にスピンドルが停止するので無駄にスピンドルを消耗させないばかりか
精神衛生上も良い感じだ。

不便になった点も在る。
切削中に何らかの不都合な事態でStopボタンを押すとプログラムが止まりスピンドルも止まる。
問題解消後にCycle Startボタンを押すとプログラムは再開するがスピンドルは回らない。

またボール盤のような単純な工作に使おうとした場合には、スピンドルが回らない。
箱を開けて短絡ピンを移動させれば回るが面倒だ。箱の前面に切り替えスイッチが必要かもしれない。

Mach3の画面に任意の速度でスピンドルを手動操作できる機能が用意されています。

当初、制御箱のスピンドルスイッチがONでもMach3からのPWM信号がゼロだと、当たり前だが回らなかった。
停止状態と間違えそうで危険なので、Mach3のPWM出力がゼロでも350RPM程度で回るようにソフトを改良した。

実際に使ってみたところ、スピンドルモーターから緊張感を誘う不快な金属音が消えた。
聞こえるのは、上部に付いているファンが風を切る音だけで静かだ。
改造前の金属的な騒音は、555による可聴周波数のPWMが原因だった。

従前は早く切削が終わらないかと我慢していたのだが、その感じが無くなった。
騒音が精神的なストレスになっていたのだ。
止めたかったのはスピンドルではなく騒音だったと気づいた。
いずれにしても問題は解消した。PWM基本周波数変換アダプターには大きな価値があった。