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@10:1bbe0d41813e, 2019-06-27 (annotated)
- Committer:
- DaichiArai
- Date:
- Thu Jun 27 07:56:29 2019 +0000
- Revision:
- 10:1bbe0d41813e
- Parent:
- 9:a3a2fb1a3ba7
2019/06/07
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 | 10:1bbe0d41813e | 5 | extern I2C mdc_i2c; |
DaichiArai | 10:1bbe0d41813e | 6 | |
DaichiArai | 9:a3a2fb1a3ba7 | 7 | motor::motor(I2C &i2c, int addr): mdc_i2c(i2c) |
DaichiArai | 3:acec9ffd0ac0 | 8 | { |
DaichiArai | 3:acec9ffd0ac0 | 9 | address = addr; |
DaichiArai | 3:acec9ffd0ac0 | 10 | data[0] = 0; |
DaichiArai | 3:acec9ffd0ac0 | 11 | data[1] = 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 | 10:1bbe0d41813e | 18 | write_pwm = (int)(pwm*127); |
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::angle(){ |
DaichiArai | 10:1bbe0d41813e | 47 | val = mdc_i2c.read(address,data,2,false); |
DaichiArai | 10:1bbe0d41813e | 48 | |
DaichiArai | 10:1bbe0d41813e | 49 | count = (int)(data[0]) - 128; |
DaichiArai | 8:f62e19b0c76e | 50 | |
DaichiArai | 10:1bbe0d41813e | 51 | position_data = (int)(data[1])*3.6; |
DaichiArai | 10:1bbe0d41813e | 52 | angle_data = (float)count*36 + position_data/10; |
DaichiArai | 8:f62e19b0c76e | 53 | |
DaichiArai | 10:1bbe0d41813e | 54 | return angle_data; |
DaichiArai | 3:acec9ffd0ac0 | 55 | } |