2019. 7.06 走行距離 12,000km ML4  デジタルポテンションメーター
これは失敗談でしたが、
2020.12.06失敗の原因が判明!! 7.の改善方法を見てくれ。
なお、デジタルポテンションメーターは、性質上、際下端の抵抗が残ってしまうので、80mVの出力が出る点が注意だ。



構  成
1、デジタルポテンションメーターとは
2、AD5220駆動用プログラム
3、マッハの設定
4、回路図
5、バラックでテスト

6、後書き



1、デジタルポテンションメーターとは
ディジタルポテンショメータとは簡単に言うと電気的に調整できる可変抵抗のことなんだそうです。
ある先達者の方から、教えて頂きました。
デジタルポテンショメータ (X9Cxxx)

自分のML4は、サーボアンプとサーボモーターでスピンドルモーターを駆動していますが、 回路図がないので、素人には、マッハ3で制御するための改造は出来ないものと諦めていましたが、 ポテンションメーターの事を聞いて、 ML4に付いている速度制御のアナログVRをデジタルポテンションメーターと換装したら、 マッハで制御できるかもと想像し始めたことでした。
実際自分が使ったデジポンは、合成写真右側です。 左側のPICで、デジポンを駆動します。




写真左端:ML4のスピンドルモーターのサーボアンプが入っている制御ボックスです。

ボックス内側から見たVR。 VRは東京コスモス製 実測 5.4kΩでした。





VRの使い方には2通りあって、電圧制御と直流制御。
ML4の場合、電圧制御でした。

VRの使い方は、 ここ
ここ
も参考になります。




既存のVRが、どういった使われ方の確認方法、左から順にやりました。
写真左端:電流は、回転速度最大で、2.7mA。

写真中:既存VRを利用しました。 Bはカットします。 電圧をかけると、早くモーターがゆっくりと回りました。

写真右:Bには10kオームの抵抗を付けて、@をML4から切り離し、電圧をかけました。 早くモーターが回りました。

こういった場合、電圧制御でVRが使われていることになります。
この実験結果で、デジポンに換装できるとも思いました。


  2、AD5220駆動プログラム
配列理解した方が良いですね。

/*201900703/AD5220駆動プログラム*/ //RB3が汎用出力14番_SEC基板ポート2のSL-18の2番ピン(出力端子)をPIC(入力端子)として受ける //UDピンをRA0へ繋ぐ //CLKピンをRA1へ繋ぐ //CSはGNDとRA7に繋ぐ //PIC16F1827 Configuration Bit Settings // 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 #define clk LATA1 #define ud LATA0 #define cs LATA7 // プロトタイプ宣言
unsigned int adconv(void); //アナログ値の変換関数
void AD5220_init(void); //初期化関数 void AD5220_down(void); //down関数 //外部変数
unsigned int target; volatile unsigned char AD5220_val; //ワイパー位置
//up関数
void AD5220_up(void) {
if (AD5220_val < target) { AD5220_val++; cs = 0; ud = 1; clk = 0; clk = 1; __delay_ms(2); } } //メイン関数
void main() { OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON = 0b01111010; //クロック周波数を16MHzに設定 PORTA = 0x00; //全てLo PORTB = 0x00; //全てLo ANSELA = 0b00000000; //全てデジタルI/Oとする ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN // 入出力設定 TRISA = 0b00000000; // RA全て出力 TRISB = 0b00001000; //RB3 ADC用入力端子 ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする// __delay_ms(1000); //AD5220安定化の為のウエイト AD5220_init(); //初期化関数呼び出し while (1) { //リップルフィルター int m[12] = {0}; // m[0]~ m[11]の12個を初期化 int sum = 0; //配列の合計値初期化 int j = 0; for (char j = 0; j < 12; j++) { m[j] = adconv(); //AD変換関数呼び出しと配列の作成 sum += m[j]; //配列の合計値 __delay_ms(1); //moving timing 1ms } target = sum / 12 / 7.99; //12個の配列を平均し1023を128stepで割合算出1023/128step=7.99 // Upper Limiter; if (target > 1023) { target = 1024; } if (target > AD5220_val) { AD5220_up(); } else if (target < AD5220_val) { AD5220_down(); //down関数呼び出し } } } //デバイス初期化関数 void AD5220_init(void) { for (char i = 0; i < 70; i++) { cs = 0; ud = 0; clk = 0; clk = 1; } __delay_us(1); for (char i = 0; i < 128; i++) { cs = 0; ud = 1; clk = 0; clk = 1; } __delay_ms(1); for (char i = 0; i < 129; i++) { cs = 0; ud = 0; clk = 0; clk = 1;
}
AD5220_val = 0;
}
//down関数
void AD5220_down(void) {
if (AD5220_val > target) {
AD5220_val--;
cs = 0;
ud = 0;
clk = 0;
clk = 1;
__delay_ms(2);
}
}
// アナログ値の変換関数
unsigned int adconv() {
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
__delay_us(20); //アクイジョン時間
ADCON0bits.GO_nDONE = 1; // アナログ値読取り開始指示
while (ADCON0bits.GO_nDONE); //読取り完了まで待つ
return ADRES;
}





3、マッハの設定
Configにある、Motor Output のタブをクリックし開く。
今回は、POrt2の1番に設定するので、
spindle を写真の様に。Step化モーターが回るという意味。 Dirは回転方向
ポート1の1番にすると、DIRとStepに両方を指定せよと、Machに言われるらしい。



Configにある、Pully Selection 最高回転は、フライス盤の最高回転に設定。



カーネルスピードは、周波数が高い方が良いと思います。実際は、60,000Hz.



PWMを使い場合の設定です。 PWM基本周波数は、1000Hz、あまり低いと、ローパスフィルターとの関係もあるので、これくらいにした。



SmoothSteooer Config PWM周波数は、合わせておいた。



モーターを回すには、切削プログラムでもいいし、
後は、 Spindle Speedをクリックし、テンキーから回転数を入力しエンター
Spindle CW F5をクリックするだけだ。これで、回る。
緑の縦棒をクリックしスライドさせると回転数が変化する。



    4、回路図
マッハ3から出されるPWM信号でデジポンを制御するには、PWM信号を受けるPIC(AD5220駆動)にあるAD変換機能を使うので、
ローパスフィルターで、一度、矩形波の山を均してやるために、ローパスフィルターを使います。

ここでの目玉は、ローパスフィルターです。
ローパスフィルターは、ここを真似ました。  ただ、ローパスに使っている抵抗は、高すぎると思います。
電圧が抵抗に食われてしまって、PICに印可される電圧が下がり引いては、デジポンにも影響します。 抵抗値はなるべく低い方が良いと思います。ここを真似ました。
オペアンプとローパスを使う場合はここが参考になります

計算ツール





SEC基板のポート2の1番ピンからPWMの信号を取り出すことにしました。

プルアップになっていたので、プラス側をカットしGNDさせました。

緑端子が、ポート2の1番です。 プルダウンさせた抵抗は赤矢印です。基板写真の矢印側をカットします。



5、バラックでテスト
仮配線でテストする場合、うっかりするとショートさせてしまうことがあったりしますので、
最初は、LEDなどで配線確認をした方が良いです。




コンデンサーは、良く分かりませんが、高周波ノイズが少ないといわれていた、オーディオ用の電解コンデンサーを使いました。 セラミックコンデンサーが、こういった高周波を扱う場合は一般的に使われるようです。
秋月のオーディオ用無極性電解コンデンサー10μF50V85℃ ニチコンMUSE・ES
10μファラッドを並列にし20μFで使いました。




6、後書
20190708
試運転もし、作った基板もよく確認し、実機で軽くテストをした。 試運転をしながらのプログラムの調整もした。 回転も一定している、何事もなかった。 いよいよ、試験切削、順調に思えた。 約1500rpmであった、急にML4の基板が、、、、。
作った基盤を再度配線の確認、問題ない。 通電テスト、おかしい、ワイパとGND間の電圧が、 いきなり電源電圧となってしまう。 壊れている。 AD5220が壊れた原因不明。



7、改善方法
原因はある時ふと分かった、単純ミスの誤配線でした。
写真がそれ、ローパスフィルター用のコンデンサーと抵抗が結線されていなかった。
なおしたら、オシロの右写真を見ると。綺麗に直流の線となっていた。左は、改善前
これを契機に図面とテストに使ったX9cの駆動プログラムも整理。






X9cの駆動プログラム
/*RB3で電圧読み取り*/
//RB3が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//UDピンをRA0へ繋ぐ
//INCピンをRA1へ繋ぐ
//CSはGNDに繋ぐ
//PIC16F1827 Configuration Bit Settings
// 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 //
#include
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ 1000000 #define inc LATA1
#define ud LATA0
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数
//外部変数
char x9c_val; //ワイパ位置
//外部変数
unsigned int target;
//デバイス初期化関数
void x9c_init(void) {//ワイパを下降させ0に
ud = 0;
__delay_us(3);
for (char i = 0; i < 100; i++) {//上限の100ポジション
inc = 1;
__delay_us(1);
inc = 0;
__delay_us(600); //抵抗値変更にかかる時間
}
x9c_val = 0;
}

//U/D_up関数
void x9c_up(void) {
ud = 1;
__delay_us(3);
for (x9c_val; x9c_val + 1 < target; x9c_val++) {//プラス1により、targetとX9C_valが等しくなるまで計算させる
inc = 1;
__delay_us(1);
inc = 0;
__delay_us(600);
}
}
//U/Ddown関数
void x9c_dowm(void) {
ud = 0;
__delay_us(3);
for (x9c_val; x9c_val + 1 > target; x9c_val--) {
inc = 1;
__delay_us(1);
inc = 0;
__delay_us(600);
}
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON = 0b01011010; //クロック周波数を1MHzに設定
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // SEC基板~ローパス経由でアナログ化信号をRB3でIN
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(RB3から読込む)
ADCON1 = 0b11000000; // 読取値は右寄せ、A/D変換クロックはFOSC/4、VDDをリファレンスとする
x9c_init(); //初期化関数呼び出し
while (1) {
//リップルフィルター
int m[12] = {0}; //配列12個の宣言と0で初期化
target = 0;
for (char i = 0; i < 12; i++) {
m[i] = adconv(); //AD変換値を12個の配列mに代入する
target += m[i]; //上の式により作られた配列の値を代入演算子によりtargetに足される
__delay_us(1026); //MACHからのPWM周期を考慮して、サンプリング間隔を決る。マッハのPWM周波数974Hzなら、1/974=1026μs
}
target = target / 12 / 2.55;
//12個の配列を平均し8bit255を100stepで割合算出255/100step=2.55
if (target > x9c_val) {
x9c_up();
} else if (target < x9c_val) {
x9c_dowm(); //down関数呼び出し
}
}
}
// アナログ値の変換関数
unsigned int adconv() {
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES / 4;
}


【このページのTOPに戻る】 inserted by FC2 system