MDC2018のデータ量を削減したプログラムのマスタ側(メインマイコン)のプログラム

Dependents:  

モータドライバコントローラ2018(MDC)

モータドライバコントローラ(MDC2018)は、2018年に開発されたモータドライバを制御するためのドライバ回路です。

基本データ

分類名称など
CPUSTM32F303K8T6
主用途3ピン型MDの駆動とABZ相出力型インクリメンタルエンコーダの読み取り
製作年2018年
通信方式I²C(Slave)・UART

使用方法

  • ST-LINK V2にmdc_simpleのソースコードを書き込むか、main.cppを参考にしてオリジナルのファームウェアを作成して、書き込みます。
  • I²Cコネクタ経由でメインマイコンから制御します。
  • 5V駆動インクリメンタルエンコーダとモータドライバ(2018年)制御端子を接続します。

詳しくは、readme.txtを参照してください。

Committer:
DaichiArai
Date:
Tue Apr 30 04:54:26 2019 +0000
Revision:
9:a3a2fb1a3ba7
Parent:
8:f62e19b0c76e
Child:
10:1bbe0d41813e
"float position()" function is now available.; Added "angle()" & "spd()" & "position()" & "position_e()".; Corrected readme.txt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DaichiArai 3:acec9ffd0ac0 1 #include "mbed.h"
DaichiArai 3:acec9ffd0ac0 2 #include "math.h"
DaichiArai 3:acec9ffd0ac0 3 #include "mdc.h"
DaichiArai 3:acec9ffd0ac0 4
DaichiArai 9:a3a2fb1a3ba7 5 motor::motor(I2C &i2c, int addr): mdc_i2c(i2c)
DaichiArai 3:acec9ffd0ac0 6 {
DaichiArai 3:acec9ffd0ac0 7 address = addr;
DaichiArai 3:acec9ffd0ac0 8 data[0] = 0;
DaichiArai 3:acec9ffd0ac0 9 data[1] = 0;
DaichiArai 3:acec9ffd0ac0 10 data[2] = 0;
DaichiArai 3:acec9ffd0ac0 11 data[3] = 0;
DaichiArai 7:6d3ea87a81c7 12 data_reset[0] = 0xff;
DaichiArai 7:6d3ea87a81c7 13 data_reset[1] = 0;
DaichiArai 3:acec9ffd0ac0 14 val = 1;
DaichiArai 3:acec9ffd0ac0 15 }
DaichiArai 3:acec9ffd0ac0 16
DaichiArai 9:a3a2fb1a3ba7 17 int motor::move(float pwm){
DaichiArai 9:a3a2fb1a3ba7 18 write_pwm = (int)(pwm*125);
DaichiArai 9:a3a2fb1a3ba7 19 if(pwm == 1000){
DaichiArai 3:acec9ffd0ac0 20 md_data[0] = MOTOR_FREE;
DaichiArai 9:a3a2fb1a3ba7 21 write_pwm = 0;
DaichiArai 3:acec9ffd0ac0 22 }
DaichiArai 9:a3a2fb1a3ba7 23 else if(write_pwm < 0){
DaichiArai 3:acec9ffd0ac0 24 md_data[0] = MOTOR_BACK;
DaichiArai 9:a3a2fb1a3ba7 25 write_pwm = abs(write_pwm);
DaichiArai 3:acec9ffd0ac0 26 }
DaichiArai 9:a3a2fb1a3ba7 27 else if(write_pwm > 0){
DaichiArai 3:acec9ffd0ac0 28 md_data[0] = MOTOR_FORWARD;
DaichiArai 3:acec9ffd0ac0 29 }
DaichiArai 9:a3a2fb1a3ba7 30 else if(write_pwm == 0){
DaichiArai 3:acec9ffd0ac0 31 md_data[0] = MOTOR_STOP;
DaichiArai 9:a3a2fb1a3ba7 32 write_pwm = 0;
DaichiArai 3:acec9ffd0ac0 33 }
DaichiArai 3:acec9ffd0ac0 34
DaichiArai 9:a3a2fb1a3ba7 35 md_data[1] = write_pwm;
DaichiArai 3:acec9ffd0ac0 36
DaichiArai 9:a3a2fb1a3ba7 37 int val = mdc_i2c.write(address,md_data,2,false);
DaichiArai 3:acec9ffd0ac0 38 return (val);
DaichiArai 3:acec9ffd0ac0 39 }
DaichiArai 7:6d3ea87a81c7 40
DaichiArai 9:a3a2fb1a3ba7 41 void motor::reset(){
DaichiArai 9:a3a2fb1a3ba7 42 mdc_i2c.write(address,data_reset,2);
DaichiArai 7:6d3ea87a81c7 43 }
DaichiArai 9:a3a2fb1a3ba7 44
DaichiArai 8:f62e19b0c76e 45 //スピードを算出して、スピードの値を返却
DaichiArai 9:a3a2fb1a3ba7 46 float motor::spd(){
DaichiArai 9:a3a2fb1a3ba7 47 val = mdc_i2c.read(address,data,10,false);
DaichiArai 9:a3a2fb1a3ba7 48 encoder_spd = (double)data[SPD_H] + (double)data[SPD_M]/100 + (double)data[SPD_L]/10000;
DaichiArai 8:f62e19b0c76e 49 if(data[SPD_MINUS] == 1){
DaichiArai 9:a3a2fb1a3ba7 50 encoder_spd *= -1;
DaichiArai 8:f62e19b0c76e 51 }
DaichiArai 9:a3a2fb1a3ba7 52 return encoder_spd;
DaichiArai 3:acec9ffd0ac0 53 }
DaichiArai 9:a3a2fb1a3ba7 54
DaichiArai 9:a3a2fb1a3ba7 55 float motor::position(){
DaichiArai 9:a3a2fb1a3ba7 56 val = mdc_i2c.read(address,data,10,false);
DaichiArai 9:a3a2fb1a3ba7 57 position_angle = ((double)data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000);
DaichiArai 9:a3a2fb1a3ba7 58 if(data[ANGLE_MINUS] == 1){
DaichiArai 9:a3a2fb1a3ba7 59 position_angle *= -1;
DaichiArai 9:a3a2fb1a3ba7 60 position_angle += DPI;
DaichiArai 9:a3a2fb1a3ba7 61 }
DaichiArai 9:a3a2fb1a3ba7 62 return position_angle;
DaichiArai 9:a3a2fb1a3ba7 63 }
DaichiArai 9:a3a2fb1a3ba7 64
DaichiArai 8:f62e19b0c76e 65 //角度を算出して角度を返す(回転数も考慮
DaichiArai 9:a3a2fb1a3ba7 66 float motor::angle(){
DaichiArai 9:a3a2fb1a3ba7 67 val = mdc_i2c.read(address,data,10,false);
DaichiArai 3:acec9ffd0ac0 68 count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN];
DaichiArai 8:f62e19b0c76e 69
DaichiArai 8:f62e19b0c76e 70 float angle_conv = ((double)data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000);
DaichiArai 8:f62e19b0c76e 71 if(data[ANGLE_MINUS] == 1){
DaichiArai 8:f62e19b0c76e 72 angle_conv *= -1;
DaichiArai 8:f62e19b0c76e 73 }
DaichiArai 8:f62e19b0c76e 74
DaichiArai 8:f62e19b0c76e 75 return(angle_conv+count*6.28);
DaichiArai 3:acec9ffd0ac0 76 }