【3DP_IE】フィラメントカウンタpgmはQEIライブラリー使う<即動いた>

mbedでエンコーダをカウントするライブラリは、2010年に作られたQEIを使わせていただきました。
●使っている600ppr安物エンコーダー
https://japanese.alibaba.com/product-detail/incremental-rotary-encoder-lpd3806-600bm-g5-24c-60751052036.html

●QEIサンプルプログラム

 QEI_Helloworldです。
https://os.mbed.com/users/aberk/code/QEI_HelloWorld/docs/30696e4d196b/main_8cpp_source.html
  コンパイル通るかと思ったら、そのままだと通りませんでしたが、mbedOSだけアップデートしたら、コンパイル通りました。
Nucleo F446REです。

#include “QEI.h”
#include “mbed.h”
Serial pc(USBTX, USBRX);
//Use X4 encoding.
//QEI wheel(PC_8,PC_6, NC, 624, QEI::X4_ENCODING);
//Use X2 encoding by default.
QEI wheel (PC_8,PC_6, NC, 600);int main() {
pc.baud(115200);
while(1){
//wait(0.1);
pc.printf(“Pulses is: %i\n”, wheel.getPulses());
}}

●QEIライブラリ解説
https://os.mbed.com/users/aberk/code/QEI/docs/tip/classQEI.html

Achのポート、Bchのポート、Zchは不要です。1周にパルス数 だけ入力すれば動きます。

 

●動作確認

定義して、whileループにgetPulses()をいれれば、パルス数の絶対カウントがでてきますので、ギア径の周長を1200パルスで

割って1パルス0.0288mmステップで進む計算値をだします。正逆転も正確にカウントするので、リトラクションも大丈夫です。

QEI wheel (PC_8,PC_6, NC, 600);

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

//==================Encoder Counter==============================
len=-wheel.getPulses()*0.0288;
//=============================================================

 

 

●AD7193と合体
「0a_0IE_encoderTest_F446RE_00」

#include “QEI.h”

Serial pc(USBTX, USBRX);
SPI ad7193 (PB_15,PB_14,PB_13); //NUCLEO L432KC MOSI, MISO, SCLK
DigitalOut CS(PB_12); // Chip select
QEI wheel (PC_8,PC_6, NC, 600);
Timer t;
float len;
float len_1;
double dmV=0.196695;//μV換算
//===========AD 7193================================
//========AD 7193 Parameters===============================
int data,data0,data1,data2 ;
int sdata,sdata0,sdata1,mdata0,mdata1,mdata2,sdata_1;
int condata0,condata1,condata2;
int cReg0,cReg1;
double mV0;
double mV1;
//———-AD7193 SEtting———————
void AD7193_set()
{
CS=0;//Chip Selct Low設定
wait(1);
//set_AD7193();
//MODEレジスタへモード設定データ書き込み
ad7193.write(0x08);//MODEレジスタ書き込み指定
ad7193.write(0x08) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
ad7193.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
ad7193.write(0x01) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//mode書き込み確認
ad7193.write(0x48);//MODEレジスタ書き込み指定
mdata0=ad7193.write(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
mdata1=ad7193.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
mdata2=ad7193.write(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//pc.printf(“MAIN:mdata:%x,%x,%x\n\r”,mdata0,mdata1,mdata2);
//設定レジスタへ設定データ書き込み
ad7193.write(0x10);//設定レジスタ書き込み指定
ad7193.write(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま
ad7193.write(0x0f) ;//設定レジスタ15-8bit書き込み=1ch-4ch自動スキャン設定 AIN1+ AIN2-
ad7193.write(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
//Config書き込み確認
ad7193.write(0x50);//Configレジスタ書き込み指定
condata0=ad7193.write(0x00) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
condata1=ad7193.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
condata2=ad7193.write(0x00) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//pc.printf(“MAIN:mdata:%x,%x,%x,condata:%x,%x,%x\n\r”,mdata0,mdata1,mdata2,condata0,condata1,condata2);
}
//=——————————-AD 7193 setting finished——————————

int main() {
pc.baud(115200);
AD7193_set();
t.start();
while(1){
//MODEレジスタへモード設定データ書き込み
ad7193.write(0x08);//MODEレジスタ書き込み指定
ad7193.write(0x08) ;//MODEレジスタ23-16bit書き込み=連続変換モード+InternalClock4.8MHz
ad7193.write(0x00) ;//MODEレジスタ15-8bit書き込み=デフォルトのまま
ad7193.write(0x01) ;//MODEレジスタ7-0bit書き込み=4800Hz設定
//設定レジスタへ設定データ書き込み
ad7193.write(0x10);//設定レジスタ書き込み指定
ad7193.write(0x00) ;//設定レジスタ23-16bit書き込み=デフォルトのまま
ad7193.write(0x03) ;//設定レジスタ15-8bit書き込み=1ch3ch 自動スキャン設定 AIN1+ AIN2-
ad7193.write(0x17) ;//設定レジスタ7-0bit書き込み=BUF Gain128
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//=====================0ch==================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV0=((double)data0*65536+(double)data1*256+(double)data2)*dmV;
mV0=mV0/1000;
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//==================1ch=====================================
ad7193.write(0x58);
data0=ad7193.write(0x0);
data1=ad7193.write(0x0);
data2=ad7193.write(0x0);
mV1=((double)data0*65536+(double)data1*256+(double)data2)*dmV;
mV1=mV1/1000;
wait_ms(1);//1msec以上WaitいれないとCH切り替えできない
//==================Encoder Counter==============================
len=-wheel.getPulses()*0.0288;
//=============================================================
pc.printf(“%4.0f,%4.0f,%4.2f,%d\n\r”, mV0,mV1,len,t.read_ms());

}

}

●以後
  アマゾンからバネが届いたら、送り精度の校正実験をして、組み立てます。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です