Sensorless DC Blushless Motor

Dependencies:   mbed-rtos mbed

Fork of Nucleo_Sensorless_Blushless_DC_ by akiyoshi oguro

main.cpp

Committer:
oguro
Date:
2017-07-24
Revision:
0:320025ba637f

File content as of revision 0:320025ba637f:

#include "mbed.h"
#include <math.h>
#include "rtos.h"
#define TS1 0.2

int i=0,q=0,s=0,r=0,rr=0,START=3; //5
int sensorless=0;
float wsi=0,wsj=0;
float t=0,tt=0,tp=0;
float t1=0,t2=0,t3=0,t4=0,t5=0,t6=0,t7=0,t8=0,t9=0,t10=0;
float adc_s=0;
float Speed=0,Speed_h=0;
float ad_sensorless;
float power=1.0;

PwmOut mypwmA(PA_8); //PWM_OUT 
PwmOut mypwmB(PA_9); 
PwmOut mypwmC(PA_10);

PwmOut  Current_Ref(PB_4);
DigitalOut Sensorless(PC_4);

DigitalOut EN1(PC_10);
DigitalOut EN2(PC_11);
DigitalOut EN3(PC_12);
DigitalOut OUTC(PC_8);


AnalogIn V_adc(PC_2);  //Outside Volume
AnalogIn V_sinkaku(PB_1);   //Blue Volume
AnalogOut SWAVE(PA_4);


AnalogIn BEMF1(PC_3);//C7_37
AnalogIn BEMF2(PB_0);//C7_34
AnalogIn BEMF3(PA_7);//C10_26 PA_7

DigitalOut GPIO_BEMF(PC_9);

InterruptIn  HA(PA_15);

Timer timer2; 
Timer timer_uT;
float ut1=0,ut2=0,usi=0;

Serial pc(USBTX,USBRX);

DigitalOut myled(LED1);

float Vr_adc=0.0f;
float adc;
float sinkaku;

void HAH(){
   
    rr=r%2;
    if(rr==0){
    ut1=timer_uT.read_us();
    r++; 
    }
   
    if(rr==1){
    ut2=timer_uT.read_us();
    r++;
    timer_uT.reset(); 
    }  
      }
      
  void CPLT(){     
  pc.printf("%.3f , %.3f \r" ,Speed_h ,Vr_adc);
  }
     
   void timerTS1(void const*argument){
   CPLT();
  }      
 
int main() {
  
   EN1=1;
   EN2=1;
   EN3=1;
   
    timer2.start();
    timer_uT.start();
    mypwmA.period_us(20);
    mypwmB.period_us(20); 
    mypwmC.period_us(20);
    
   OUTC=0;
   GPIO_BEMF=0;
   pc.baud(128000);
   
  /*   RtosTimer RtosTimerTS1(timerTS1);
     RtosTimerTS1.start((unsigned int)(TS1*5000)); 
     Thread::wait(100); */
 
 while(1) {
      
      HA.rise(&HAH);
      Vr_adc=V_adc.read();
      adc= V_adc.read_u16()>>4 ; 
      
      sinkaku=((V_sinkaku.read_u16())>>7)+20;//7
      
  if(i==0){      
   mypwmA.write(0.5f);
   wait_ms(100);    
   i=1;
   }
   
    tp=3800-(adc);//  3800 3300-4000
    
   if(sensorless==0){
     t=tp;
     tt=t;
    }  
          
   
    
    if(Speed<900){ //900
      // t=tp;
       sensorless=0;
       s=1;
       }
    if(Speed>=900){ //900
          
          if(s==1){
          ad_sensorless=Vr_adc;
          s=0;      
          sensorless=1;
          t1=(abs(wsj-wsi));
          
          t=t1; 
         // tt=t;       
           }
           
       if((Speed >= 900)&&(Speed<=1500)){     
         power=0.8;  //0.5
         }
         if((Speed >= 1500)&&(Speed<=2000)){     
         power=0.6;  //0.5
         }
        if((Speed >= 2000)&&(Speed<=2500)){     
         power=0.8;  //0.6
         } 
         if((Speed >= 2500)){     
         power=1.0;  //0.7
         
         } 
       
         
        adc_s=Vr_adc-ad_sensorless; 
         
        if(adc_s < -0.01){
          t2=t1+100;
          t=t2;
          tt=t-sinkaku;
           }  
       
       if((adc_s > 0.0)&&(adc_s <= 0.05)){
          t2=t1-200; //200
          t=t2;
           tt=t-sinkaku;
           } 
       if((adc_s > 0.05)&&(adc_s <= 0.1)){
          t3=t2-150; //150
          t=t3;
           tt=t-sinkaku;
           } 
        if((adc_s > 0.1)&&(adc_s <= 0.15)){
          t4=t3-130; //130
          t=t4;
           tt=t-sinkaku;
           } 
         if((adc_s > 0.15)&&(adc_s <= 0.2)){
          t5=t4-100; //120
          t=t5;
           tt=t-sinkaku;
           }
          if((adc_s > 0.2)&&(adc_s <= 0.25)){
          t6=t5-100; //100
          t=t6;
           tt=t-sinkaku;
          }
           if((adc_s > 0.25)&&(adc_s <= 0.3)){
          t7=t6-80; //80
          t=t7;
           tt=t-sinkaku;
           }
          if((adc_s > 0.3)&&(adc_s <= 0.35)){              
          t8=t7-70; //70
          t=t8;
           tt=t-sinkaku;
           }
          if((adc_s > 0.35)&&(adc_s <= 0.4)){ 
          t9=t8-70; //70
          t=t9;
           tt=t-sinkaku;
           } 
          if((adc_s > 0.4)&&(adc_s <= 0.45)){ 
          t10=t9-50; //50
          t=t10;
           tt=t-sinkaku;
           } 
          if(adc_s > 0.45){ 
          t=t10-50; //50
           tt=t-sinkaku;
           } 
       }
      
         // tt=t-100;
       
 
      
 if((Vr_adc>0.15f)&&(q==0)){     
  while(q<100){   
   
    EN1=1; 
    EN2=1;
    EN3=0;
    mypwmA.write(0.5f);//0.5
    mypwmB=0;
    mypwmC=0;
   
    wait_ms(START);
    
    EN1=1;  
    EN2=0;  
    EN3=1;
    
    wait_ms(START);
    
    EN1=0; 
    EN2=1;
    EN3=1;
    mypwmA=0;
    mypwmB.write(0.5f);
    mypwmC=0;
    wait_ms(START);
   
    EN1=1; 
    EN2=1;
    EN3=0;
    
    wait_ms(START);
    
    EN1=1; 
    EN2=0;
    EN3=1;
    
    mypwmA=0;
    mypwmB=0;
    mypwmC.write(0.5f);
    
    wait_ms(START);
   
    EN1=0; 
    EN2=1;
    EN3=1;
   
    q++;
    wait_ms(START);
    
    } 
    }
      
 if(Vr_adc < 0.05f){ //0.005
          q=0;      
          s=0;
          r=0;
          rr=0;
          i=0;  
          sensorless=0;
          power=1.0;
       }  
       

       
 if(Vr_adc >0.05f){
      EN1=1; 
      EN2=1; 
      EN3=0;    
       
      mypwmA.write(Vr_adc*power); 
      mypwmB.write(0.0f);
      mypwmC.write(0.0f);
     
      wait_us(t-200); 
       EN1=1; 
       EN2=0; 
       EN3=1; 
   
    if(BEMF1>0.5f){ 
          OUTC=0;        
      wsi=timer2.read_us(); 
           }
      wait_us(tt);
      if(OUTC==0){
      wsj=timer2.read_us(); 
      }
      OUTC=1;
   
      EN1=0; 
      EN2=1; 
      EN3=1; 
     
       mypwmA.write(0.0f);
       mypwmB.write(Vr_adc*power); 
       mypwmC.write(0.0f);
      
      wait_us(t);
   
      EN1=1;
      EN2=1;
      EN3=0;
     
    if(BEMF2>0.5f){ 
          OUTC=0;        
      wsi=timer2.read_us(); 
           }
      wait_us(tt);
      if(OUTC==0){
      wsj=timer2.read_us(); 
      }
      OUTC=1;
   
       EN1=1; 
       EN2=0;
       EN3=1; 
    
       mypwmA.write(0.0f);
       mypwmB.write(0.0f);
       mypwmC.write(Vr_adc*power); 
    
        wait_us(t);
   
       EN1=0; 
       EN2=1; 
       EN3=1; 
      
     
    if(BEMF3>0.5f){ 
          OUTC=0;        
      wsi=timer2.read_us(); 
           }
      wait_us(tt);
      if(OUTC==0){
      wsj=timer2.read_us(); 
      }
      OUTC=1;   
         
   }
   
         Sensorless=sensorless;
         usi=abs(ut2-ut1);
         Speed_h=60*(1/(7.0*usi*1E-6));
         Speed=60*(1/(7.0*6.0*t*1E-6));
        
        myled = !myled;
       
    }
}