MDC2018のデータ量を削減したプログラムのマスタ側(メインマイコン)のプログラム
モータドライバコントローラ2018(MDC)
モータドライバコントローラ(MDC2018)は、2018年に開発されたモータドライバを制御するためのドライバ回路です。
基本データ
分類 | 名称など |
CPU | STM32F303K8T6 |
主用途 | 3ピン型MDの駆動とABZ相出力型インクリメンタルエンコーダの読み取り |
製作年 | 2018年 |
通信方式 | I²C(Slave)・UART |
使用方法
- ST-LINK V2にmdc_simpleのソースコードを書き込むか、main.cppを参考にしてオリジナルのファームウェアを作成して、書き込みます。
- I²Cコネクタ経由でメインマイコンから制御します。
- 5V駆動インクリメンタルエンコーダとモータドライバ(2018年)制御端子を接続します。
詳しくは、readme.txtを参照してください。
Diff: mdc.cpp
- Revision:
- 9:a3a2fb1a3ba7
- Parent:
- 8:f62e19b0c76e
- Child:
- 10:1bbe0d41813e
--- a/mdc.cpp Thu Apr 11 02:38:27 2019 +0000 +++ b/mdc.cpp Tue Apr 30 04:54:26 2019 +0000 @@ -2,7 +2,7 @@ #include "math.h" #include "mdc.h" -motor::motor(int addr) +motor::motor(I2C &i2c, int addr): mdc_i2c(i2c) { address = addr; data[0] = 0; @@ -14,45 +14,57 @@ val = 1; } -int motor::move(int spd){ - if(spd == 1000){ +int motor::move(float pwm){ + write_pwm = (int)(pwm*125); + if(pwm == 1000){ md_data[0] = MOTOR_FREE; - spd = 0; + write_pwm = 0; } - else if(spd < 0){ + else if(write_pwm < 0){ md_data[0] = MOTOR_BACK; - spd = abs(spd); + write_pwm = abs(write_pwm); } - else if(spd > 0){ + else if(write_pwm > 0){ md_data[0] = MOTOR_FORWARD; } - else if(spd == 0){ + else if(write_pwm == 0){ md_data[0] = MOTOR_STOP; - spd = 0; + write_pwm = 0; } - md_data[1] = spd; + md_data[1] = write_pwm; - int val = i2c.write(address,md_data,2,false); + int val = mdc_i2c.write(address,md_data,2,false); return (val); } -void motor::reset_enc(){ - i2c.write(address,data_reset,2); +void motor::reset(){ + mdc_i2c.write(address,data_reset,2); } -//回転回数を数える + //スピードを算出して、スピードの値を返却 -float motor::spd_e(){ - val = i2c.read(address,data,10,false); - spd = (double)data[SPD_H] + (double)data[SPD_M]/100 + (double)data[SPD_L]/10000; +float motor::spd(){ + val = mdc_i2c.read(address,data,10,false); + encoder_spd = (double)data[SPD_H] + (double)data[SPD_M]/100 + (double)data[SPD_L]/10000; if(data[SPD_MINUS] == 1){ - spd *= -1; + encoder_spd *= -1; } - return spd; + return encoder_spd; } + +float motor::position(){ + val = mdc_i2c.read(address,data,10,false); + position_angle = ((double)data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000); + if(data[ANGLE_MINUS] == 1){ + position_angle *= -1; + position_angle += DPI; + } + return position_angle; +} + //角度を算出して角度を返す(回転数も考慮 -float motor::angle_e(){ - val = i2c.read(address,data,10,false); +float motor::angle(){ + val = mdc_i2c.read(address,data,10,false); count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN]; float angle_conv = ((double)data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000); @@ -62,10 +74,3 @@ return(angle_conv+count*6.28); } - -void motor::read(){ - val = i2c.read(address,data,10,false); - //spd = ((data[SPD_MINUS])?(-1):(1))*((double)(data[SPD_H])+((double)data[SPD_M]/100)+((double)data[SPD_L]/10000)); - //count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN]; - //angle = ((data[ANGLE_MINUS])?(-1):(1))*((double)(data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000)); -}