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を参照してください。
mdc.cpp@5:3693a9e7b2ad, 2018-10-09 (annotated)
- Committer:
- DaichiArai
- Date:
- Tue Oct 09 13:40:44 2018 +0000
- Revision:
- 5:3693a9e7b2ad
- Parent:
- 3:acec9ffd0ac0
- Child:
- 6:6b81003405dd
mdc_2018
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:acec9ffd0ac0 | 37 | |
DaichiArai | 3:acec9ffd0ac0 | 38 | float motor::spd_e(){ |
DaichiArai | 3:acec9ffd0ac0 | 39 | val = i2c.read(address,data,10,false); |
DaichiArai | 3:acec9ffd0ac0 | 40 | spd = ((data[SPD_MINUS])?(-1):(1))*((double)(data[SPD_H])+((double)data[SPD_M]/100)+((double)data[SPD_L]/10000)); |
DaichiArai | 3:acec9ffd0ac0 | 41 | return spd; |
DaichiArai | 3:acec9ffd0ac0 | 42 | } |
DaichiArai | 3:acec9ffd0ac0 | 43 | float motor::angle_e(){ |
DaichiArai | 3:acec9ffd0ac0 | 44 | val = i2c.read(address,data,10,false); |
DaichiArai | 3:acec9ffd0ac0 | 45 | count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN]; |
DaichiArai | 5:3693a9e7b2ad | 46 | 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 | 47 | } |
DaichiArai | 3:acec9ffd0ac0 | 48 | |
DaichiArai | 3:acec9ffd0ac0 | 49 | void motor::read(){ |
DaichiArai | 3:acec9ffd0ac0 | 50 | val = i2c.read(address,data,10,false); |
DaichiArai | 3:acec9ffd0ac0 | 51 | spd = ((data[SPD_MINUS])?(-1):(1))*((double)(data[SPD_H])+((double)data[SPD_M]/100)+((double)data[SPD_L]/10000)); |
DaichiArai | 3:acec9ffd0ac0 | 52 | count = ((data[COUNT_MINUS])?(-1):(1))*data[COUNT_SPIN]; |
DaichiArai | 5:3693a9e7b2ad | 53 | angle = ((data[ANGLE_MINUS])?(-1):(1))*((double)(data[ANGLE_H])+((double)data[ANGLE_M]/100)+((double)data[ANGLE_L]/10000)); |
DaichiArai | 3:acec9ffd0ac0 | 54 | } |