UVW 3 phases Brushless DC motor control

Dependencies:   QEI mbed-rtos mbed

Fork of BLDCmotor by manabu kosaka

Files at this revision

API Documentation at this revision

Comitter:
kosakaLab
Date:
Thu Jun 13 06:41:16 2013 +0000
Parent:
13:791e20f1af43
Child:
15:427f5ae8e957
Commit message:
BLDCmotor;

Changed in this revision

controller.cpp Show annotated file Show diff for this revision Revisions of this file
controller.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
--- a/controller.cpp	Sun Mar 03 09:09:34 2013 +0000
+++ b/controller.cpp	Thu Jun 13 06:41:16 2013 +0000
@@ -145,7 +145,8 @@
 void current_loop(){    // 電流制御マイナーループ
     float  th, c, s, Cdq[2][2], iu, iv, iab[2], idq_act[2], vab_ref[2], tmp, prev[2];
   if( f_find_origin==1 ){
-    th = 0;
+//    th = 0;
+    th = debug[2];
   }else{
     th = p.th[0];
   }
@@ -287,6 +288,7 @@
     duty_u = p.vuvw[0]/vdqMAX+0.5; // dutyを計算
     duty_v = p.vuvw[1]/vdqMAX+0.5; // dutyを計算
     duty_w = p.vuvw[2]/vdqMAX+0.5; // dutyを計算
+duty_u*=5;duty_v*=5;duty_w*=5;//koko
     uvw[0].duty = duty_u;  // dutyをPWM発生関数に渡す
     uvw[1].duty = duty_v;  // dutyをPWM発生関数に渡す
     uvw[2].duty = duty_w;  // dutyをPWM発生関数に渡す
@@ -419,14 +421,15 @@
     // モータシミュレータ
     sim_motor();    // IPM, dq座標
  #else
-//koko    p.th[0] = (float)encoder.getPulses()/(float)N_ENC*2.0*PI;   // get angle [rad] from encoder
-    // 位置θをセンサで検出
 #ifdef DOUKI
 led1=1;
 p.th[0] += 2*PI*TS0 * 1; if(p.th[0]>4*PI){   p.th[0]-=4*PI;}
 debug[0]=p.th[0]/PI*180;
 analog_out=debug[0]/180*PI/4/PI;
 led1=0;
+#else
+    // 位置θをセンサで検出
+    p.th[0] = (float)encoder.getPulses()/(float)N_ENC*2.0*PI;   // get angle [rad] from encoder
 #endif
  #endif
     current_loop(); // 電流制御マイナーループ(idq_ref to vuvw)
--- a/controller.h	Sun Mar 03 09:09:34 2013 +0000
+++ b/controller.h	Thu Jun 13 06:41:16 2013 +0000
@@ -4,7 +4,7 @@
 //#define PI 3.14159265358979 // def. of PI
 /*********** User setting for control parameters (begin) ***************/
 #define SIMULATION          // Comment this line if not simulation
-#define USE_CURRENT_CONTROL // Current control on. Comment if current control off.
+//#define USE_CURRENT_CONTROL // Current control on. Comment if current control off.
 #define DEADZONE_PLUS   1.  // deadzone of plus side
 #define DEADZONE_MINUS -1.5 // deadzone of minus side
     // encoder
@@ -26,7 +26,7 @@
 //    Thread ThreadTimerTS3(CallTimerTS3,NULL,osPriorityBelowNormal);
 //    Thread ThreadTimerTS4(CallTimerTS4,NULL,osPriorityLow);
 #define TMAX    3.0          // [s], experiment starts from 0[s] to TMAX[s]
-#define TMAX_FIND_ORIGIN    0.1//1.0          // [s], finding th origin starts from 0[s] to TMAX[s]
+#define TMAX_FIND_ORIGIN    30//0.1//1.0          // [s], finding th origin starts from 0[s] to TMAX[s]
 
     // 電流制御マイナーループ
 #define iKPd    10./2     // 電流制御d軸PIDのPゲイン (d-axis)
@@ -36,7 +36,7 @@
 #define iKIq    100./2    // 電流制御q軸PIDのIゲイン (q-axis)
 #define iKDq    0         // 電流制御q軸PIDのDゲイン (q-axis)
 
-#define vdqMAX  300.
+#define vdqMAX  3.3     // Vcc
 #define SQRvdqMAX (vdqMAX*vdqMAX)   // [V^2] vdqの大きさの最大値の二乗
 
     // 速度制御メインループ
@@ -51,7 +51,7 @@
 #endif
 
 #define iLPF    0.9     // 0-1, 速度に対する1次LPF; Low Pass Filter, G(z)=(1-a)/(z-a)
-#define iqMAX   100       // [A], q軸電流指令のMAX制限(異常に大きい指令値を制限する)
+#define iqMAX   4//100       // [A], q軸電流指令のMAX制限(異常に大きい指令値を制限する)
 
 /*********** User setting for control parameters (end) ***************/
 
@@ -117,6 +117,6 @@
 extern velocity_loop_parameters    vl; // 速度制御メインループの定数、変数
 
 extern float data[][5];    // memory to save data offline instead of "online fprintf".
-extern unsigned short _count_data;    // counter for data[1000][5]
-
+extern unsigned short _count_data;  // counter for data[1000][5]
+extern float   debug[20];           // for debug
 #endif
\ No newline at end of file
--- a/main.cpp	Sun Mar 03 09:09:34 2013 +0000
+++ b/main.cpp	Thu Jun 13 06:41:16 2013 +0000
@@ -79,7 +79,8 @@
 //  osPriorityError         =  0x84        ///< system cannot determine priority or thread has illegal priority
 
     // 指令速度
-    float  w_ref_req[2] = {20* 2*PI, 40* 2*PI};        // [rad/s](第2要素は指令速度急変後の指令速度)
+//    float  w_ref_req[2] = {20* 2*PI, 40* 2*PI};        // [rad/s](第2要素は指令速度急変後の指令速度)
+    float  w_ref_req[2] = {0.5* 2*PI, 0.5* 2*PI};        // [rad/s](第2要素は指令速度急変後の指令速度)
     // 指令dq電流位相
     float  beta_ref = 30*PI/180;   // [rad], 電流位相指令βを30度に
     float  tan_beta_ref1;
@@ -117,6 +118,8 @@
         il.idq_ref[0] = iqMAX/1.0;  // idをプラス、iqをゼロにして、
         il.idq_ref[1] = 0;          // 無負荷のときにθ=0とさせる。
 
+//pc2.scanf("%f",&debug[2]);
+debug[2]=3*2*PI*t*1;
 #ifdef OLD
         timerTS0();
         //current_loop(); // 電流制御マイナーループ(idq_ref to vuvw)
--- a/mbed-rtos.lib	Sun Mar 03 09:09:34 2013 +0000
+++ b/mbed-rtos.lib	Thu Jun 13 06:41:16 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed-rtos/#9654a71f5a90
+http://mbed.org/users/mbed_official/code/mbed-rtos/#58b30ac3f00e