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

mdc.cpp

Committer:
DaichiArai
Date:
2018-10-09
Revision:
6:6b81003405dd
Parent:
5:3693a9e7b2ad
Child:
7:6d3ea87a81c7

File content as of revision 6:6b81003405dd:

#include "mbed.h"
#include "math.h"
#include "mdc.h"

motor::motor(int addr)
{
    address = addr;
    data[0] = 0;
    data[1] = 0;
    data[2] = 0;
    data[3] = 0;
    val = 1;
}

int motor::move(int spd){
    if(spd == 1000){
        md_data[0] = MOTOR_FREE;
        spd = 0;
    }
    else if(spd < 0){
        md_data[0] = MOTOR_BACK;
        spd = abs(spd);
    }
    else if(spd > 0){
        md_data[0] = MOTOR_FORWARD;
    }
    else if(spd == 0){
        md_data[0] = MOTOR_STOP;
        spd = 0;
    }
    
    md_data[1] = spd;
    
    int val = i2c.write(address,md_data,2,false);
    return (val);
}
int motor::count_e(){
    val = i2c.read(address,data,10,false);
    count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN];
    return count;
}

float motor::spd_e(){
    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));
    return spd;
}
float motor::angle_e(){
    val = i2c.read(address,data,10,false);
    count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN];
    return((data[ANGLE_MINUS])?(-1):(1))*((double)(data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000)+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));
}