DC motor control program using TA7291P type H bridge driver and rotary encoder with A, B phase.

Dependencies:   QEI mbed-rtos mbed

Fork of DCmotor by manabu kosaka

Committer:
kosaka
Date:
Fri Jan 04 12:00:48 2013 +0000
Revision:
12:459af534d1ee
Child:
13:ba71733c11d7
DC motor control program using TA7291P type H bridge driver and rotary encoder with A, B phase.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kosaka 12:459af534d1ee 1 #ifndef __controller_h
kosaka 12:459af534d1ee 2 #define __controller_h
kosaka 12:459af534d1ee 3
kosaka 12:459af534d1ee 4 #define PI 3.14159265358979 // def. of PI
kosaka 12:459af534d1ee 5 /*********** User setting for control parameters (begin) ***************/
kosaka 12:459af534d1ee 6 //#define SIMULATION // Comment this line if not simulation
kosaka 12:459af534d1ee 7 //#define USE_CURRENT_CONTROL // Current control on. Comment if current control off.
kosaka 12:459af534d1ee 8 #define CONTROL_MODE 0 // 0:PID control, 1:Frequency response, 2:Step response, 3. u=Rand to identify G(s), 4) FFT identification
kosaka 12:459af534d1ee 9 #define DEADZONE_PLUS 0//1. // deadzone of plus side
kosaka 12:459af534d1ee 10 #define DEADZONE_MINUS 0//-1.5 // deadzone of minus side
kosaka 12:459af534d1ee 11 #define GOOD_DATA // Comment this line if the length of data TMAX/TS2 > 1000
kosaka 12:459af534d1ee 12 // encoder
kosaka 12:459af534d1ee 13 #define N_ENC (24*4) // "*4": QEI::X4_ENCODING. Number of pulses in one revolution(=360 deg) of rotary encoder.
kosaka 12:459af534d1ee 14 #define CH_A p29 // A phase port
kosaka 12:459af534d1ee 15 #define CH_B p30 // A phase port
kosaka 12:459af534d1ee 16
kosaka 12:459af534d1ee 17 #define DA_PORT p18 // analog out (DA) port of mbed
kosaka 12:459af534d1ee 18
kosaka 12:459af534d1ee 19 #define PWM_FREQ 20000.0 //[Hz], pwm freq. (> 1/(DEAD_TIME*10))
kosaka 12:459af534d1ee 20 #define DEADTIME 0.0001 // [s], deadtime to be set between plus volt. to/from minus
kosaka 12:459af534d1ee 21 #define TS0 0.002//0.001 // [s], sampling time (priority highest: Ticker IRQ) of motor current i control PID using timer interrupt
kosaka 12:459af534d1ee 22 #define TS1 0.002//0.01 // [s], sampling time (priority high: RtosTimer) of motor angle th PID using rtos-timer
kosaka 12:459af534d1ee 23 #define TS2 0.2 // [s], sampling time (priority =main(): precision 4ms) to save data to PC using thread. But, max data length is 1000.
kosaka 12:459af534d1ee 24 #define TS3 0.002 // [s], sampling time (priority low: precision 4ms)
kosaka 12:459af534d1ee 25 #define TS4 0.2 // [s], sampling time (priority lowest: precision 4ms) to display data to PC tera term
kosaka 12:459af534d1ee 26 //void timerTS1(void const *argument), CallTimerTS3(void const *argument), CallTimerTS4(void const *argument);
kosaka 12:459af534d1ee 27 // RtosTimer RtosTimerTS1(timerTS1); // RtosTimer priority is osPriorityAboveNormal, just one above main()
kosaka 12:459af534d1ee 28 // Thread ThreadTimerTS3(CallTimerTS3,NULL,osPriorityBelowNormal);
kosaka 12:459af534d1ee 29 // Thread ThreadTimerTS4(CallTimerTS4,NULL,osPriorityLow);
kosaka 12:459af534d1ee 30 #define TMAX 5.0 // [s], experiment starts from 0[s] to TMAX[s]
kosaka 12:459af534d1ee 31
kosaka 12:459af534d1ee 32 // 電流制御マイナーループ
kosaka 12:459af534d1ee 33 #define iKP 10./2 // 電流制御PIDのPゲイン
kosaka 12:459af534d1ee 34 #define iKI 100./2 // 電流制御PIDのIゲイン
kosaka 12:459af534d1ee 35
kosaka 12:459af534d1ee 36 #define vMAX 3.3
kosaka 12:459af534d1ee 37
kosaka 12:459af534d1ee 38 // 速度制御メインループ
kosaka 12:459af534d1ee 39 #ifdef USE_CURRENT_CONTROL
kosaka 12:459af534d1ee 40 #define wKp 0.05 // 速度制御PIDのPゲイン
kosaka 12:459af534d1ee 41 #define wKi 2.50 // 速度制御PIDのIゲイン
kosaka 12:459af534d1ee 42 #else
kosaka 12:459af534d1ee 43 #define wKp 0.05 // 速度制御PIDのPゲイン
kosaka 12:459af534d1ee 44 #define wKi 0.5//2.50 // 速度制御PIDのIゲイン
kosaka 12:459af534d1ee 45 #endif
kosaka 12:459af534d1ee 46
kosaka 12:459af534d1ee 47 #define iLPF 0.95 // 0-1, 速度に対する1次LPF; Low Pass Filter, G(z)=(1-a)/(z-a)
kosaka 12:459af534d1ee 48 #define iMAX 3.3 // [A], q軸電流指令のMAX制限(異常に大きい指令値を制限する)
kosaka 12:459af534d1ee 49
kosaka 12:459af534d1ee 50 #define R_SHUNT 1.25 // [Ohm], shunt resistanse
kosaka 12:459af534d1ee 51 /*********** User setting for control parameters (end) ***************/
kosaka 12:459af534d1ee 52
kosaka 12:459af534d1ee 53
kosaka 12:459af534d1ee 54 typedef struct struct_motor_parameters{
kosaka 12:459af534d1ee 55 // モータの定数、信号など
kosaka 12:459af534d1ee 56 #ifdef SIMULATION // シミュレーションのとき
kosaka 12:459af534d1ee 57 float L; // [H], インダクタンス
kosaka 12:459af534d1ee 58 float R; // [Ω], モータ巻線抵抗
kosaka 12:459af534d1ee 59 float phi; // [V s], 永久磁石の鎖交磁束
kosaka 12:459af534d1ee 60 float Jm; // [Nms^2], イナーシャ
kosaka 12:459af534d1ee 61 float Tm; // [Nm], モータトルク
kosaka 12:459af534d1ee 62 float TL; // [Nm], 負荷トルク
kosaka 12:459af534d1ee 63 #endif
kosaka 12:459af534d1ee 64 float th[2]; // [rad]. ロータの位置, th[0]=th(t), th[1]=th(t-TS0)
kosaka 12:459af534d1ee 65 float w; // [rad/s], モータ速度
kosaka 12:459af534d1ee 66 float w_lpf; // [rad/s], フィルタで高周波ノイズを除去したモータ速度
kosaka 12:459af534d1ee 67 float i; // [A], αβ軸電流 iab = [iα;iβ];
kosaka 12:459af534d1ee 68 float v; // [V], motor 電圧
kosaka 12:459af534d1ee 69 float p; // 極対数
kosaka 12:459af534d1ee 70 }motor_parameters;
kosaka 12:459af534d1ee 71
kosaka 12:459af534d1ee 72 typedef struct struct_current_loop_parameters{
kosaka 12:459af534d1ee 73 // 電流制御マイナーループの定数、変数
kosaka 12:459af534d1ee 74 float i_ref; // iの目標値
kosaka 12:459af534d1ee 75 float v_ref; // vdqの目標値
kosaka 12:459af534d1ee 76 float eI_i; // 電流制御用偏差の積分値(積分項)
kosaka 12:459af534d1ee 77 }current_loop_parameters;
kosaka 12:459af534d1ee 78
kosaka 12:459af534d1ee 79 typedef struct struct_velocity_loop_parameters{
kosaka 12:459af534d1ee 80 // 速度制御メインループの定数、変数
kosaka 12:459af534d1ee 81 float w_lpf; // [rad/s], モータ速度(LPF通過後)
kosaka 12:459af534d1ee 82 float w_ref; // [rad/s], モータ目標速度
kosaka 12:459af534d1ee 83 float tan_beta_ref; // [rad], モータ電流位相
kosaka 12:459af534d1ee 84 float i_ref; // 電流指令[A]
kosaka 12:459af534d1ee 85 float eI_w; // 速度制御用偏差の積分値(積分項)
kosaka 12:459af534d1ee 86 }velocity_loop_parameters;
kosaka 12:459af534d1ee 87
kosaka 12:459af534d1ee 88 extern void timerTS0(); // timer called every TS0[s].
kosaka 12:459af534d1ee 89 extern void timerTS1(void const *argument); // timer called every TS1[s].
kosaka 12:459af534d1ee 90 extern void timerTS2(); // timer called every TS2[s].
kosaka 12:459af534d1ee 91 extern void timerTS3(); // timer called every TS3[s].
kosaka 12:459af534d1ee 92 extern void timerTS4(); // timer called every TS4[s].
kosaka 12:459af534d1ee 93
kosaka 12:459af534d1ee 94 extern void init_parameters(); // IPMSMの機器定数等の設定, 制御器の初期化
kosaka 12:459af534d1ee 95
kosaka 12:459af534d1ee 96 extern unsigned long _count; // sampling number
kosaka 12:459af534d1ee 97 extern float _time; // time[s]
kosaka 12:459af534d1ee 98
kosaka 12:459af534d1ee 99 extern motor_parameters p; // モータの定数、信号など
kosaka 12:459af534d1ee 100 extern current_loop_parameters il; // 電流制御マイナーループの定数、変数
kosaka 12:459af534d1ee 101 extern velocity_loop_parameters vl; // 速度制御メインループの定数、変数
kosaka 12:459af534d1ee 102
kosaka 12:459af534d1ee 103 extern float data[][5]; // memory to save data offline instead of "online fprintf".
kosaka 12:459af534d1ee 104 extern unsigned short _count_data; // counter for data[1000][5]
kosaka 12:459af534d1ee 105
kosaka 12:459af534d1ee 106 #endif