2018.12.24 ninja1000 走行距離 9,500km ML4 DCポンプ制御
2020.10.12ポンプのプログラム一部改良。「400/1023=1.9Vでwhileを抜け出す。つまり1.9VからAD開始」
秋月電子のPWMを核に制御していましたが、壊れたのを契機に、内容をグレードアップして
、DCポンプ制御について書き替えました。
構 成
1、故障個所の特定
2、動作と回路図
3、PIC
4、MACH3 設定
5、作業中
6、作業を終えて
1、故障個所の特定
先ずは故障個所の特定です。
基板からPWM出力を取り出して、LEDに繋げてみたら、LEDは点滅しませんでした。
写真右:IC555だけテストをしました。 結果、LED]は点滅。
どうも、IC555以外のどこからしい。 諦めて、買い換えることにした。
そして、水中ポンプも単体で、動作確認をすると、これも動かず!
今回は、方針として、PICも使えて可変制御できますし、MOSFETのスイッチングも分かってきたので、
全て自作することにしました。 この方が、後々、故障しても、自分で治せます。
2、回路図・動作
回路図
ドレインの上側に誘導体がありますが、こういった繋ぎ方をオープンドレインといいます。
SEC基板、スムースステッパーと今回のボードは同じ電源にします。
PICにより連続的にポンプの回転数を制御します。
MACH3の操作パネルからSEC基板とスムースステッパー経由でこの基盤をインターフェースとしてポンプを駆動します。
操作パネルには可変抵抗器を付けて回転数を制御する。
2020/02/22追記
PICについて
ポンプをPICのPWMを使って制御している。
SEC基板からの出力信号をPIC側を入力端子として受けている。
最近、このPICについて、びっくりの気付きがあった。
PICの電源端子を印加しない状態で、PICの入力端子に電圧を印加すると、
PICの入力に応じて出力する端子に電圧が発生する。
自分のポンプ制御に使っているPICの例
入力端子に電圧が印加されると、この入力端子に応じて出力端子に電圧が発生し、
子の出力端子に繋がっているFETが動作する。
同様に、このPICの電源端子にも電圧が発生する。
従って、このPICの電源端子に繋がっている配線にも電流が流れる。
具体
PWM制御基盤のPICの電源に何もつながっていないのに、
SEC基板からの信号がONの時、PIC電源に繋がっている回転計の液晶ディスプレイが点灯する。
併せて、SEC基板からの信号を受けるPICの入力端子に応じて動作する出力端子も動作してしまう。
対処方針
1、ポンプ制御のPWM基板の電源は回転計の電源と分ける。
また、PICの電源端子に印加しなくても、PICが動作しても、
PICが電源不足とならないように、PICの電源に給電する。
2、前途の様にポンプ制御のPWM基板に使われているPICは、電源無しでも動作するので、
ポンプが誤作動しないように、ポンプの電源とPWM基板の電源も分ける。
詳細
・ポンプのDC12V電源-----主軸側からとり、誤作動の危険性を無くす。
・PWM制御に使っているPICのDC5V電源-----主軸側からではなく、3軸側からとり、回転計の誤作動を無くす。
部品の選定方法
モーター用コイルに発生する逆起電力対策
バリスタ
オムロン>
KOA株 の金属酸化物バリスタの選定
2)回路電圧VE(V)から?式を用いて必要な最大許容回路電圧を求めます。
VE≦VA(1−α) …?
VE:回路電圧
VA:最大許容回路電圧
α:設計マージン(α=0.2)
バリスタ電圧
VV(min.)≧(12×1.1)/(1−0.2)
≧16.5(V)
直近上位の27vを選定とも思ったんですが、 無難な清流ダイオードにしました。
ゲート抵抗は、続トランジスタ回路の設計から出しましたし、実験の結果、やはり1MΩじゃないと、
GND側に引っ張り切れなくて、ドレインから電流が流れてしまいました。
抜粋
ゲート抵抗について
MOS FETは、素子の入力インピーダンスが非常に高いので、ゲートをオープンにしておくと、静電気により破壊されるとのこと。
FET方向への3.9kΩは、実験の結果、一番安定していました。
ただ、参考文献でもハッキリとしませんでした。
パワーMOS FET IRLI520NPBF
仕様(@TJ=25℃)
・V(BR)DSS:100V(VGS=0,ID=250μA)
・ID:8.1A(TC=25℃)
・RDS(ON):0.18Ω(VGS=10,ID=6A)
・PD:30W(TC=25℃)
・VGS(th):1.0V〜2.0V(VDS=VGS,ID=250μA)
・Qg:20nC(VDS=80V,VGS=5V,ID=6A)
・tr:35ns(VDD=28V,ID=25A,RG=12Ω,RD=1.1Ω)
・tf:22ns(VDD=28V,ID=25A,RG=12Ω,RD=1.1Ω)
スレッショルド電圧Vgsga1.0〜2.0Vと、PICにはうってつけ。
ドレイン電流Idポンプが3Aのところ余裕の8.1A
つまみ開度0から何ボルトをかけるかについては、実験の結果、2.5Vは必要だった。
Idは、0.6A位になる。 実験は無負荷なので、負荷時の調整は必要だろう。
写真の赤ラインは、参考程度に。
2.5Vとなると、PICは、8ビットで1023になるから、2.5/5V×1023=約500から、AD変換の読み取りを開始すればいい。
使用するポンプです。 この品も恐らく中華です。 アマゾンで売っていました。
3、PIC
PICは、16F1827
メ モ
使わないI/Oピンは出力モードとし、0(Low)を出力しておく
出力モードの場合には、上記問題は発生しません。
ピンもLowレベルですから、特に問題になるようなことはありません。
動作表示用LEDは、点滅させ且つ、低中高の3段階表示にした。
低は、点灯、中高は点滅させ、点滅間隔を中、高と分けた。高は中より、点滅間隔は短い。
このプログラムで、Mach3にあるポンプボタンをクリックすれば、動作する。
プログラム
/*RB4で電圧読み取りし、RB3からPWM出力端子*/
//RB7がSEC基板ポート2のSL-13の1番ピン(出力端子)を入力端子として受ける
//RA1からPWM出力表示を操作盤のLEDで点滅させる
//RA0から基盤上のLEDにより点滅させる
//PIC16F1827 Configuration Bit Settings
//202010プログラム改良
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ 16000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void); //ADC読み込み関数
// メイン関数
void main(void) {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON = 0b0111001; //クロック周波数を16MHzに設定
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00010000; // 可変抵抗の電圧読み込み用にRB4のみアナログ
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b10010000; //RB4 可変抵抗用ADC用入力端子、実験RB7を入力端子に
// ADコンバータ設定
ADCON0 = 0b00100001; // アナログ変換情報設定(RB4から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
//変数宣言
long num;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
num = adconv(); //adc 読み込み関数呼び出し
num = (num - 50)*(1023 - 390) / 1023 + 390;
//3段階動作表示用LED点滅とbreakによりwhileから抜けてSEC基板の微弱出力電圧に対応
if (RB7 == 1 && num < 440) {//440以下の電圧1.9V+アルファ(50)に対しRB3は出力しない390=1.9V/5/1023
LATA1 = LATA0 = 1;
num = 0;
RB3 = 0;
} else if (RB7 == 1 && 440 <= num && num < 850) {
LATA1 = LATA0 = 1;
__delay_ms(25);
LATA1 = LATA0 = 0;
__delay_ms(10);
} else if (RB7 == 1 && 850 <= num) {
LATA1 = LATA0 = 1;
__delay_ms(7);
LATA1 = LATA0 = 0;
__delay_ms(5);
} else if (RB7 == 0 | num < 440) {
__delay_ms(10);
break;
}
CCPR1L = num >> 2; //右寄せ2bitし上位8bit取り出し
CCP1CONbits.DC1B = num & 0b11; //下位2bit取り出し
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
ADCON0bits.GO_nDONE = 1; // アナログ値読取り開始指示
while (ADCON0bits.GO_nDONE); // 読取り完了まで待つ
return ADRES;
}
// PWMモード設定関数
void InitPWM(void) {
APFCON0bits.CCP1SEL = 0; // RB3端子をPWM出力端子に設定
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 255; //PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.DC1B = 0; //PWM出力RB3
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動しPWMをスタート
T2CONbits.TMR2ON = 1;}
4、Mach3 の設定
MACH3の設定をします。
ポンプは、SEC基板(ポート2基板)の出力信号〜1番ピンに設定
SEC基板(ポート2基板)
4、作業中
2018/12/28 この日やっと、プログラムがまとまって、LEDを使いPWMの加減や動作の確認をした。
実機完成
実機が完成し、テスト、、、結線ミス。 何度か見渡して、完成。
左側の新型は、PICで制御しますので、リレーやフォトカプラーは無し
コンパクトになりました。
また、以前は、ボリュームがモーターの回転と同期していなくて、VRをかなり回さないとポンプが回りませんでした。
こういった点もPIC利用によりプログラムで解消しました。
5、作業を終えて
フライス盤に取り付けての確認作業中です。
今回取り付けたPWM制御基板により、ポンプが回りだすと、LED赤が点灯します。
基板の方でも、同様に確認できるようにしました。あとあと、故障個所特定に役立ちます。
しかし、プログラムを途中で先達者の方に助けてもらいましたが、ここまで出来て、感無量です。
【このページのTOPに戻る】