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 Oct 09 18:56:10 2018 +0000
Revision:
6:6b81003405dd
Parent:
5:3693a9e7b2ad
Child:
7:6d3ea87a81c7
formdc

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 3:acec9ffd0ac0 5 motor::motor(int addr)
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 3:acec9ffd0ac0 12 val = 1;
DaichiArai 3:acec9ffd0ac0 13 }
DaichiArai 3:acec9ffd0ac0 14
DaichiArai 3:acec9ffd0ac0 15 int motor::move(int spd){
DaichiArai 3:acec9ffd0ac0 16 if(spd == 1000){
DaichiArai 3:acec9ffd0ac0 17 md_data[0] = MOTOR_FREE;
DaichiArai 3:acec9ffd0ac0 18 spd = 0;
DaichiArai 3:acec9ffd0ac0 19 }
DaichiArai 3:acec9ffd0ac0 20 else if(spd < 0){
DaichiArai 3:acec9ffd0ac0 21 md_data[0] = MOTOR_BACK;
DaichiArai 3:acec9ffd0ac0 22 spd = abs(spd);
DaichiArai 3:acec9ffd0ac0 23 }
DaichiArai 3:acec9ffd0ac0 24 else if(spd > 0){
DaichiArai 3:acec9ffd0ac0 25 md_data[0] = MOTOR_FORWARD;
DaichiArai 3:acec9ffd0ac0 26 }
DaichiArai 3:acec9ffd0ac0 27 else if(spd == 0){
DaichiArai 3:acec9ffd0ac0 28 md_data[0] = MOTOR_STOP;
DaichiArai 3:acec9ffd0ac0 29 spd = 0;
DaichiArai 3:acec9ffd0ac0 30 }
DaichiArai 3:acec9ffd0ac0 31
DaichiArai 3:acec9ffd0ac0 32 md_data[1] = spd;
DaichiArai 3:acec9ffd0ac0 33
DaichiArai 3:acec9ffd0ac0 34 int val = i2c.write(address,md_data,2,false);
DaichiArai 3:acec9ffd0ac0 35 return (val);
DaichiArai 3:acec9ffd0ac0 36 }
DaichiArai 6:6b81003405dd 37 int motor::count_e(){
DaichiArai 6:6b81003405dd 38 val = i2c.read(address,data,10,false);
DaichiArai 6:6b81003405dd 39 count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN];
DaichiArai 6:6b81003405dd 40 return count;
DaichiArai 6:6b81003405dd 41 }
DaichiArai 3:acec9ffd0ac0 42
DaichiArai 3:acec9ffd0ac0 43 float motor::spd_e(){
DaichiArai 3:acec9ffd0ac0 44 val = i2c.read(address,data,10,false);
DaichiArai 3:acec9ffd0ac0 45 spd = ((data[SPD_MINUS])?(-1):(1))*((double)(data[SPD_H])+((double)data[SPD_M]/100)+((double)data[SPD_L]/10000));
DaichiArai 3:acec9ffd0ac0 46 return spd;
DaichiArai 3:acec9ffd0ac0 47 }
DaichiArai 3:acec9ffd0ac0 48 float motor::angle_e(){
DaichiArai 3:acec9ffd0ac0 49 val = i2c.read(address,data,10,false);
DaichiArai 3:acec9ffd0ac0 50 count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN];
DaichiArai 5:3693a9e7b2ad 51 return((data[ANGLE_MINUS])?(-1):(1))*((double)(data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000)+count*6.28);
DaichiArai 3:acec9ffd0ac0 52 }
DaichiArai 3:acec9ffd0ac0 53
DaichiArai 3:acec9ffd0ac0 54 void motor::read(){
DaichiArai 3:acec9ffd0ac0 55 val = i2c.read(address,data,10,false);
DaichiArai 3:acec9ffd0ac0 56 spd = ((data[SPD_MINUS])?(-1):(1))*((double)(data[SPD_H])+((double)data[SPD_M]/100)+((double)data[SPD_L]/10000));
DaichiArai 3:acec9ffd0ac0 57 count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN];
DaichiArai 5:3693a9e7b2ad 58 angle = ((data[ANGLE_MINUS])?(-1):(1))*((double)(data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000));
DaichiArai 3:acec9ffd0ac0 59 }