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を参照してください。

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));
-}