akiyoshi oguro
/
Nucleo_Hall_rect_sin
CCW CW Control BLDC
Diff: main.cpp
- Revision:
- 0:faa58403944a
- Child:
- 1:333d2cdd26d0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Feb 17 02:58:08 2019 +0000 @@ -0,0 +1,306 @@ +//Vector制御 工事中 2月末 公開予定 +//矩形波かから正弦波に移行 Speedの範囲を118行、173行目を +//変更して矩形波→正弦波 への移行回転数を制御します。 +// ボリュームを中間値設定後、電源投入またはリセットしてください +//ボリューム前後操作で正転/逆転を制御できます。 + +#include "mbed.h" +#include <math.h> + +#include <IO_define.h> +#include <kukei.h> +#include <sin.h> +#include <cos.h> +#include <vector.h> + + +int main(){ + // pc.baud(128000); + /* RtosTimer RtosTimerTS1(timerTS1); + RtosTimerTS1.start((unsigned int)(TS1*5000));//2000 + Thread::wait(100);//1000*/ + + uT.start(); + vT.start(); + wT.start(); + + PWM_IN1_U.period_us(50); + PWM_IN2_V.period_us(50); + PWM_IN3_W.period_us(50); + + zt.attach_us(&ztr, tau); + ztc.attach_us(&ztrc,tau); + + Vr_adc_i=V_adc.read(); + wait_ms(100); + SH=HALL_U<<2|HALL_V<<1|HALL_W; + EN1_U=1; + EN2_V=1; + EN3_W=1; + +while(1){ + + SH=HALL_U<<2|HALL_V<<1|HALL_W; + + Vr_adc=V_adc.read(); + y=Vr_adc- Vr_adc_i; + ay=fabs(y); + power=ay; + if(y>0.1){ + frd=0; + //aout=0.5; + } + if(y<-0.1){ + frd=1; + //aout=0.9; + } + + if(ay<0.1){ + q=0; + aout=0.0; + //SH=HALL_U<<2|HALL_V<<1|HALL_W; + //power=0.0; + } + /************起動********************/ +if(((y<-0.1)||(y>0.1))&&(q==0)){ +//if(q==0){ + while(q<20){ + SH=HALL_U<<2|HALL_V<<1|HALL_W; + +/*****Forword 起動******/ + if((frd==0)){ + //SH=HALL_U<<2|HALL_V<<1|HALL_W; + if(SH==5){ + start_F5(); + } + if(SH==4){ + start_F4(); + } + if(SH==6){ + start_F6(); + } + if(SH==2){ + start_F2(); + } + if(SH==3){ + start_F3(); + } + if(SH==1){ + start_F1(); + } + } + +/*******Reversal 起動************/ + if((frd==1)){ + //SH=HALL_U<2|HALL_V<<1|HALL_W; + if(SH==3){ + start_R3(); + } + if(SH==2){ + start_R2(); + } + if(SH==6){ + start_R6(); + } + if(SH==4){ + start_R4; + } + if(SH==5){ + start_R5(); + } + if(SH==1){ + start_R1(); + } + } + q++; + } + } + + if(Speed<1000){//2000 + /**************矩形波駆動始動***************/ + /*******Forward******************/ + if(frd==0){ + switch(SH){ + case 5: PWM_W();//W + break; + case 4: EN_W();//W + break; + case 6: PWM_U();//U + break; + case 2: EN_U();//U + break; + case 3: PWM_V();//V + break; + case 1: EN_V();//V + break; + default :PWM_W();//W + break; + } + HALL_Ui.rise(time_WP); + HALL_Wi.fall(time_VN); + HALL_Vi.rise(time_UP); + HALL_Ui.fall(time_WN); + HALL_Wi.rise(time_VP); + HALL_Vi.fall(time_UN); + } +/*******Reversal******************/ + if(frd==1){ + switch(SH){ + case 5: PWM_W(); + break; + case 1: EN_W(); + break; + case 3: PWM_V(); + break; + case 2: EN_V(); + break; + case 6: PWM_U(); + break; + case 4: EN_U(); + break; + default :PWM_W(); + break; + } + HALL_Ui.rise(time_UP); + HALL_Wi.fall(time_WN); + HALL_Vi.rise(time_VP); + HALL_Ui.fall(time_UN); + HALL_Wi.rise(time_WP); + HALL_Vi.fall(time_VN); + } + + }//Speed<2000 + + if((Speed>=1000)){//&&(Speed<4000)){//2000 +/************sin drive Forward************/ +if(frd==1){ + HALL_Ui.rise(&PWM_sinU); + HALL_Wi.fall(&EN_sinW); + HALL_Vi.rise(&PWM_sinV); + HALL_Ui.fall(&EN_sinU); + HALL_Wi.rise(&PWM_sinW); + HALL_Vi.fall(&EN_sinV); + + } + +/*******sin drive Reversal******************/ +if(frd==0){ + HALL_Ui.rise(&PWM_sinW); + HALL_Wi.fall(&EN_sinV); + HALL_Vi.rise(&PWM_sinU); + HALL_Ui.fall(&EN_sinW); + HALL_Wi.rise(&PWM_sinV); + HALL_Vi.fall(&EN_sinU); + + } + /****************************/ + + if((uz[2])<=-16383){ //飽和処理 + uz[2]=-16383; + } + if(uz[2]>=16383){ + uz[2]=16383; + } + + if(vz[2]<=-16383){ //飽和処理 + vz[2]=-16383; + } + if(vz[2]>=16383){ + vz[2]=16383; + } + if(wz[2]<=-16383){ //飽和処理 + wz[2]=-16383; + } + if(wz[2]>=16383){ + wz[2]=16383; + } + PWM_IN1_U.write(((float(uz[2])/(16383*2))*(power*STOP))+0.5); + PWM_IN2_V.write(((float(vz[2])/(16383*2))*(power*STOP))+0.5); + PWM_IN3_W.write(((float(wz[2])/(16383*2))*(power*STOP))+0.5); + + aout=(float(uz[2])/(16383*2))*(power*STOP)+0.5;//16383 + //filterCurrent(); + //aout=Curr_wf; + //HALL_Ui.rise(&cosU); + //HALL_Ui.fall(&cosUN); + +}//sin + +//if(Speed>=4000){ + + //HALL_Ui.rise(&PWM_sinU); + //HALL_Ui.fall(&EN_sinU); + // HALL_Ui.rise(&cosU); + // HALL_Ui.fall(&cosUN); + + //filterCurrent(); + + + // sinth=(float(uz[2])/(16383*2))+0.5; + //costh=(float(uc[2])/(16383*2))+0.5; + + //aout=sinth; + + /* ia=(iu+iv*cos23+iw*cos43)*zet; + ib=(iv*sin23+iw*sin43)*zet; + + id=costh*ia+sinth*ib; + iq=-sinth*ia+costh*ib; + + id_p=0; + iq_p=Vr_adc; + id_diff=id_p-id; + iq_diff=iq_p-iq; + + */ + + /********PI Control id,iq*********************/ + /* s_ki_id += ki_id*id_diff; + Vd = s_ki_id + kp_id*id_diff; + + s_ki_iq += ki_iq*(iq_diff+Vr_adc); + Vq = s_ki_iq + kp_iq*(iq_diff+Vr_adc);*/ + /*******************************************/ +/****** detect rotor position*************/ + /* Wz=(2*PI)/(2*vst*1E-6); + Ed= (Vq)-0.11f*iq-Wz*0.018E-3*id; + phm=Ed/(Wz); + dth=(Vd-0.11f*(id)+Wz*0.018E-3*(iq))/(Wz*phm); + derrth=asin(dth);*/ + + /*****PID error θ *****/ + + /* float ki_PLL=0.01; + float kp_PLL=0.2; + s_ki_errth += ki_PLL*derrth; + therr = s_ki_errth + kp_PLL*errth;*/ + + /*******PLL W ***********/ + /* if(therr>0.01){ + W=(2*PI)/((2*vst*1E-6)+(therr/Wz)); + } + if(therr<-0.01){ + W=(2*PI)/((2*vst*1E-6)-(therr/Wz)); + } */ + /************************************/ + /* th += W*zint; + Va=cos(th)*Vd-sin(th)*Vq; + Vb=sin(th)*Vd+cos(th)*Vq; + + SVPWM(); + + aout=iq; + + + }//vector*/ +/*******************************************************************/ + usi=2*(ut2-ut1); + vsi=2*(vt2-vt1); + wsi=2*(wt2-wt1); + usic=2*(ut2c-ut1c); + Speed=60*(1/(6.0*fabs(usi)*1E-6));//CQ 6 + /************************************************************/ + + + } +} \ No newline at end of file