/********Trapezoid Nucleo-F302R8 IHM07 BR2804@Speed+Current PWM ADC DMA DirectRegistor**************************/
#include "mbed.h"
DigitalOut shuki(PC_6);
DigitalOut ad_time(PC_4);

//PwmOut PWMu(PA_8); 
//PwmOut PWMv(PA_9); 
//PwmOut PWMw(PA_10);

//AnalogIn V_adc(PC_2); 

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

DigitalIn  HU(PA_15);
DigitalIn  HV(PB_3);
DigitalIn  HW(PB_10);

InterruptIn  HA(PA_15);
InterruptIn  HB(PB_3);
InterruptIn  HC(PB_10);

AnalogOut SWAVE(PA_4);


//AnalogIn Curr_ui(PA_0);
//AnalogIn Curr_vi(PC_1);
//AnalogIn Curr_wi(PC_0); 

Serial pc(USBTX,USBRX);

Timer uTimer;
Timer vTimer;
Timer wTimer;

Timer Timer1;

#define I_Directive 1.4  /* dwߍől[A] */
#define V_Directive  12.0    /* dwߍől[V]*/
/********Softwear Edge***************/
unsigned short edge_UP=1;
unsigned short edge_UN=1;
unsigned short edge_VP=1;
unsigned short edge_VN=1;
unsigned short edge_WP=1;
unsigned short edge_WN=1;
/*******************************************/
/*******************************************/
unsigned int scnt_m=0,scount=0; 
unsigned char  HUVW;
unsigned char  VMODE;
float   Vr_adc_i,vr1_ad,vr_ad,vr1_ad_p;
float   PWM_freq=700,Width;
unsigned char UP,VP,WP;
unsigned char kukei_U,kukei_V,kukei_W;
unsigned char EN_U,EN_V,EN_W;
unsigned char  R_DR = 1; /* R_DR -> 1:CWA0:CCW*/

/*********************************************/
unsigned int t_cnt = 0; /* Lv`Ԃcnt */
unsigned int Wrise_t = 0; /* Lv`̒l */
unsigned int Urise_t = 0; /* Lv`̒l */
unsigned int Vrise_t = 0; /* Lv`̒l */
unsigned int Wrise_t_1 = 0; /* Lv`̒lold */
unsigned int Urise_t_1 = 0; /* Lv`̒lold */
unsigned int Vrise_t_1 = 0; /* Lv`̒lold */
/**********************************************/
/* **************** */
/*     x     */
/* **************** */
float   kaiten=0;
float   Nerr = 0.0,Nerr_fil=0.0; /* x덷 */
float  kpSpeed = 0.001;  /*  QC */
float  kiSpeed = 0.0005; /*  ϕQC */
float  s_kiSpeed = 0.0; /* ϕ풆g */
float   Nrpm = 0;/* ][r/min] */
float   Nrpm_1 = 0;/* ][r/min]old  */
float   Nrpm_s = 0;/* ] ɐ[r/min]  */
float   Nref0=0;
float   Nref1 = 15000.0;/* xwߍől */
float   Nrpm_ref = 0.0; /* xw[r/min] */
float   Nrpm_ref0 = 0.0; /* xw[r/min] */
float   dN_HI_P = 0.5; /* Cg*/
float   dN_HI_N = 0.5; /* Cg */
float   N_LOW_MAX=5;
float   ijou=1500;
unsigned int t_cnt_min= 500; /* Lv`Ԃ̍Œcnt */
float I_Order=0;
float Speed,obj_Speed;
/*********************************************/
/* **************** */
/*     d     */
/* **************** */

float kpCurrent ;/* QC */
float kiCurrent ; /* ϕQC */
float s_kiCurrent=0;
float I_err=0;
float I_Shunt=0;
float curr_ub,curr_vb,curr_wb,curr_u,curr_v,curr_w;
float  V_order=0; 
 /********************************************/
 uint16_t ADC_buffer[4];
 
 /* Hall_uɃLv` */
void Hall_u()
    {
              
    Urise_t = uTimer.read_us();
    t_cnt = Urise_t - Urise_t_1;
    if(t_cnt<t_cnt_min){t_cnt=t_cnt_min;}
    else{}
    Nrpm = (float)(8571429/ t_cnt);
    if( ((Nrpm-Nrpm_1)<ijou) && ((Nrpm-Nrpm_1)>(-ijou)) )
    { /* xُ */
           Nrpm_1 = Nrpm;
    }
    else
    {
       Nrpm = Nrpm_1;
    }
    Urise_t_1 = Urise_t;
    }
    
    /* Hall_vɃLv` */
void Hall_v()
    {
              
    Vrise_t = vTimer.read_us();
    t_cnt = Vrise_t - Vrise_t_1;
    if(t_cnt<t_cnt_min){t_cnt=t_cnt_min;}
    else{}
    Nrpm = (float)(8571429/ t_cnt);//P=7 
    if( ((Nrpm-Nrpm_1)<ijou) && ((Nrpm-Nrpm_1)>(-ijou)) )
    { /* xُ */
           Nrpm_1 = Nrpm;
    }
    else
    {
       Nrpm = Nrpm_1;
    }
    Vrise_t_1 = Vrise_t;
    }
     
    /* Hall_WɃLv` */
void Hall_w()
    {           
    Wrise_t = wTimer.read_us();
    t_cnt = Wrise_t - Wrise_t_1;
    if(t_cnt<t_cnt_min){t_cnt=t_cnt_min;}
    else{}
    Nrpm = (float)(8571429/ t_cnt);
    if( ((Nrpm-Nrpm_1)<ijou) && ((Nrpm-Nrpm_1)>(-ijou)) )
    { /* xُ */
           Nrpm_1 = Nrpm;
    }
    else
    {
       Nrpm = Nrpm_1;
    }
    Wrise_t_1 = Wrise_t;
    } 
/*********************************/
unsigned char UVW_In(void)
{
    unsigned char temp8;
    temp8 = HW;  //W 
    temp8 = (temp8+temp8) + HV; //V
    temp8 = (temp8+temp8) + HU; //U
    
    return temp8;
}   
     
       
void Function() {
   //pc.printf( "%d\r", SystemCoreClock );
   UP=HU; VP=HV; WP=HW;
   EN_U=EN1;EN_V=EN2;EN_W=EN3;
   //pc.printf("%d,%d,%d,%d,%d,%d \r" ,kukei_W,kukei_V,kukei_U,WP,VP,UP);
   //pc.printf("%d,%d,%d,%d,%d,%d \r" ,kukei_W,kukei_V,kukei_U,EN_W,EN_V,EN_U);
   //pc.printf("%d \r" ,scnt_m);
   //pc.printf("%.1f,%.1f\r" ,Speed,obj_Speed);
/*********VgdǍ*******************/
      curr_u += ((curr_ub) - curr_u )*0.05;
      curr_v += ((curr_vb) - curr_v )*0.05;
      curr_w += ((curr_wb) - curr_w )*0.05;
   
/*******{[dǍ************/
   //vr_ad=ADC_buffer[3]/4095.0;//V_adc.read(); 
   vr1_ad_p=(vr_ad-Vr_adc_i);
   vr1_ad+=(vr1_ad_p-vr1_ad)*0.1;
   
/**********[_t߂̐ݒ***********/
    if(fabs(vr1_ad)<0.05)
    {   
        I_Order= 0;
        Nerr=0;
        Nrpm=0;
        Nrpm_ref = 0.0;
        Nrpm_1 = 0;/* ][r/min]old  */
        Nrpm_s = 0;
        s_kiSpeed = 0.0;
        s_kiCurrent = 0.0;
        Width=0;
        Nrpm_ref0 = 0.0;  
        t_cnt=0; 
        V_order=0;
        I_Shunt=0;
           I_err=0; 
           Nref0=0;
    }else{}
/**************************************/ 
/********dPIϐݒ******************/  
 #if 1
    if( Nrpm>100){
                kpCurrent= 0.00001; /* QC*/
                kiCurrent =0.000005; /* ϕQC 0*/
                
        }else{
             kpCurrent=0.001; 
             kiCurrent =0.0002;
             
            }
   #endif     
    /* ------------ */
    /* z[ZTǍ */
    /* ------------ */
    HUVW = UVW_In(); /* ZTtEz[ICM */
     if(R_DR==1){
          switch (HUVW)
            {
                case 1: VMODE = 2;  break;
                case 2: VMODE = 4;  break;
                case 3: VMODE = 3;  break;
                case 4: VMODE = 6;  break;
                case 5: VMODE = 1;  break;
                case 6: VMODE = 5;  break;
                default: VMODE = 1; break;
               } 
                }
   if(R_DR==0){
   switch (HUVW)
    {
        case 1: VMODE = 5;      break;
        case 2: VMODE = 1;      break;
        case 3: VMODE = 6;      break;
        case 4: VMODE = 3;      break;
        case 5: VMODE = 4;      break;
        case 6: VMODE = 2;      break;
        default: VMODE = 1;     break;
    }
     } 
 
     //PWM_freq=fabs(vr1_ad);
  
/* *********************************************** */    
/* [ 1 ] xo */
/* *********************************************** */ 
#if 1 
  HA.rise(&Hall_u);
  //HA.fall(&Hall_u);
  HB.rise(&Hall_v);
  //HB.fall(&Hall_v);
  HC.rise(&Hall_w);
  //HC.fall(&Hall_w);
#endif   
#if 0 
if(R_DR==0){
 if((HU==1)&&(edge_UP==1)){
     Hall_u();
     edge_UP=0;
    edge_VP=1;
    edge_WP=0;
   
 }   

if((HV==1)&&(edge_VP==1)){
     Hall_v();
     edge_UP=0;
    edge_VP=0;
    edge_WP=1;
   
 }
if((HW==1)&&(edge_WP==1)){
     Hall_w();
    edge_UP=1;
    edge_VP=0;
    edge_WP=0;
   
 } 
}

if(R_DR==1){
 if((HU==1)&&(edge_UP==1)){
     Hall_u();
     edge_UP=0;
    edge_VP=0;
    edge_WP=1;
    
 }    
if((HV==1)&&(edge_VP==1)){
     Hall_v();
     edge_UP=1;
    edge_VP=0;
    edge_WP=0;
    
 }
if((HW==1)&&(edge_WP==1)){
     Hall_w();
    edge_UP=0;
    edge_VP=1;
    edge_WP=0;
    
 } 
} 
#endif 
  
/************* CW CCW ******/   
    if(vr1_ad>0.05){//cw
          R_DR=1; 
          }else{}
            
     if(vr1_ad<-0.05){//ccw
          R_DR=0;   
        }else{}
        
    /* ] ɐ@ */
    if(R_DR==1)/* CW */
    {
        Nrpm_s = Nrpm;
    }
    else/* CCW */
    {
        Nrpm_s = -Nrpm;  
    }
  
 /************************************************ */
 /* [ 2 ] x  */
 /* *********************************************** */     
        
    Nrpm_ref0 = fabs(Nref1*vr1_ad); //aki
        
      if(Nrpm_ref0>0){      
        if(Nref0 > Nrpm_ref0)
        {
                Nref0 -= dN_HI_N; //aki -
                if(Nref0 < Nrpm_ref0)
                {
                Nref0 = Nrpm_ref0;
                }
                else{}
        }
        else{}
        
        if(Nref0 < Nrpm_ref0)
        {
            Nref0 += dN_HI_P;  //aki +
                if(Nref0 > Nrpm_ref0)
                {
                Nref0 = Nrpm_ref0;
            }
                else{}
        }
        else{}
     if(Nref0<N_LOW_MAX)
        {
            Nref0 = N_LOW_MAX;/**/
        }
        else{}
      } 
      else{}
        
        Nrpm_ref = Nref0; 
        
        if(R_DR==1) { 
            Nerr =( Nrpm_ref-Nrpm_s);
        }
        else {
            Nerr = Nrpm_ref+Nrpm_s;
        }  
   Nerr_fil=(Nerr-Nerr_fil)*0.01;     
    /* ----------- */
    /* xPI */
    /* ----------- */
    s_kiSpeed += kiSpeed*Nerr_fil;
    if(s_kiSpeed > I_Directive)
    {
    s_kiSpeed = I_Directive;
    }
    else
    {
    if(s_kiSpeed < (-I_Directive))
    {
       s_kiSpeed = -I_Directive; 
    }else{}
    }
    
    I_Order = s_kiSpeed + kpSpeed*Nerr;
    
    if(I_Order > I_Directive)
    {
    I_Order = I_Directive;
    }
    else
    {
    if(I_Order < (-I_Directive))
    {
        I_Order = -I_Directive; 
    }else{}
    }   
/* *********************************************** */
/* [ 3 ] d  */
/* *********************************************** */

    /* ----------- */
    /* ACRPI */
    /* ----------- */
     if(R_DR==1){
     switch (VMODE)
    {
        case 1: I_Shunt = (curr_v);// - curr_u )/2.0; /* (U-V)/2 */
        break;
        case 2: I_Shunt = (curr_w );//- curr_u )/2.0; /* (U-W)/2 */
        break;
        case 3: I_Shunt = (curr_w);//- curr_v)/2.0; /* (V-W)/2 */
        break;
        case 4: I_Shunt = (curr_u );//- curr_v)/2.0; /* (V-U)/2 */
        break;
        case 5: I_Shunt = (curr_u );//- curr_w )/2.0; /* (W-U)/2 */
        break;
        case 6: I_Shunt = (curr_v);// - curr_w )/2.0; /* (W-V)/2 */
        break;
        default:I_Shunt = 0.0;
      }
    }
if(R_DR==0){
     switch (VMODE)
    {
        case 1: I_Shunt = (curr_w);// - curr_u )/2.0; /* (U-V)/2 */
        break;
        case 2: I_Shunt = (curr_w );//- curr_u )/2.0; /* (U-W)/2 */
        break;
        case 3: I_Shunt = (curr_u);//- curr_v)/2.0; /* (V-W)/2 */
        break;
        case 4: I_Shunt = (curr_u );//- curr_v)/2.0; /* (V-U)/2 */
        break;
        case 5: I_Shunt = (curr_v );//- curr_w )/2.0; /* (W-U)/2 */
        break;
        case 6: I_Shunt = (curr_v);// - curr_w )/2.0; /* (W-V)/2 */
        break;
        default:I_Shunt = 0.0;
      }
    }
    
    I_err = I_Order - I_Shunt;
    s_kiCurrent += kiCurrent*I_err;
    if(s_kiCurrent > V_Directive)
    {
    s_kiCurrent = V_Directive;
    }
    else
    {
    if(s_kiCurrent < (-V_Directive))
    {
       s_kiCurrent = -V_Directive; 
    }else{}
    }
    
    
    V_order = s_kiCurrent + kpCurrent*I_err;
    
    if(V_order > V_Directive)
    {
    V_order = V_Directive;
    }
    else
    {
    if(V_order < (-V_Directive))
    {
        V_order = -V_Directive; 
    }else{}
    } 
     Width= V_order*0.3;  
 /************* PWM 쓮********/
  if(R_DR==1){
   switch (VMODE)
    {
    case 1:   
              TIM1->CCR1 = Width*PWM_freq; TIM1->CCR2 = 0; TIM1->CCR3 = 0;
              EN1=1; EN2 = 1; EN3= 0;//0:Active 1:High inpeedance
            
        break;
    case 2:  
              TIM1->CCR1 = Width*PWM_freq; TIM1->CCR2 = 0; TIM1->CCR3 = 0;
              EN1=1; EN2 = 0; EN3 = 1;
             
        break;
    case 3:      
              TIM1->CCR1 = 0; TIM1->CCR2 = Width*PWM_freq; TIM1->CCR3 = 0;
              EN1=0; EN2 = 1; EN3 = 1;
             
        break;
    case 4:       
              TIM1->CCR1 = 0; TIM1->CCR2 = Width*PWM_freq; TIM1->CCR3 = 0;
              EN1=1; EN2 = 1; EN3 = 0;
             
        break;
    case 5:                 
              TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = Width*PWM_freq;
              EN1=1; EN2 = 0; EN3 = 1;
             
        break;
    case 6:      
              TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = Width*PWM_freq;
              EN1=0; EN2 = 1; EN3 = 1;
              
        break;
    default: 
              TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = 0;
              EN1=0; EN2 = 0; EN3 = 0;
             
    break;
    }
}

 if(R_DR==0){
    switch (VMODE)
    {
    case 1:   
              TIM1->CCR1 = Width*PWM_freq; TIM1->CCR2 = 0; TIM1->CCR3 = 0;
              EN1=1; EN2 = 0; EN3= 1;//0:Active 1:High inpeedance
              
        break;
    case 2:   
              TIM1->CCR1 = 0; TIM1->CCR2 = Width*PWM_freq; TIM1->CCR3 = 0;
              EN1=0; EN2 = 1; EN3 = 1;
             
        break;
    case 3:   
              TIM1->CCR1 = 0; TIM1->CCR2 = Width*PWM_freq; TIM1->CCR3 = 0;
              EN1=1; EN2 = 1; EN3 = 0;
             
        break;
    case 4:  
              TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 =Width *PWM_freq;
              EN1=1; EN2 = 0; EN3 = 1;
             
        break;
    case 5:  
              TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = Width*PWM_freq;
              EN1=0; EN2 = 1; EN3 = 1;
             
        break;
    case 6:   
              TIM1->CCR1 = Width*PWM_freq; TIM1->CCR2 = 0; TIM1->CCR3 = 0;
              EN1=1; EN2 = 1; EN3 = 0;
              
        break;
    default:  
              TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = 0;
              EN1=0; EN2 = 0; EN3 = 0;
             
    break;
    }
}
 Speed=(Nrpm);
 obj_Speed=(Nrpm_ref0);
/********s************/
scnt_m=scount%2; 
if(scnt_m==0){
   shuki=0;
  }else{
   shuki=1;
  }
   scount++;
/*************************/
}//Function
   
     
/********main***********/

int main() {
    pc.baud(128000); 
    Timer1.start();  
    uTimer.start();
    vTimer.start();
    wTimer.start(); 
  

RCC->AHBENR |= (1 << 17); // GPIOA
RCC->AHBENR |= (1 << 18); // GPIOB
RCC->AHBENR |= (1 << 19); // GPIOC
RCC->APB2ENR |= (1 << 11); // TIM1
RCC->CFGR3 |=(1<<8);// TIM1 PLL Choise
//RCC->CFGR  |= RCC_CFGR_MCO_SYSCLK;
RCC->CFGR  |= RCC_CFGR_MCO_HSE ;
//RCC->CFGR  |= RCC_CFGR_MCO_HSI ;
//RCC->CFGR  |=RCC_CFGR_MCO_PLL;
//RCC->CFGR  |=RCC_CFGR_MCOPRE_2;
//RCC->CFGR  |=RCC_CFGR_MCOPRE_1;
//RCC->CFGR  |=RCC_CFGR_MCOPRE_0;

GPIOA-> MODER      = 0;
GPIOB-> MODER      = 0;
GPIOC-> MODER      = 0;
GPIOC-> MODER      |= 0b01 << 8;
GPIOC-> MODER      |= 0b01 << 12;
//GPIOC-> MODER      |= 0b01 << 18;//PC_9
GPIOC-> MODER      |= 0b01 << 20;
GPIOC-> MODER      |= 0b01 << 22;
GPIOC-> MODER      |= 0b01 << 24;
/************PWM Timer Setting************/
#if 1
    TIM1->CR1 = 0; // make sure Counter is disabled before changing configuration
    TIM1->CR2 = 0;
    TIM1->PSC = 1;
    TIM1->ARR = PWM_freq;  // 500 33KHz 
    TIM1->CCMR1=0x6060;//Ch1,Ch2ANeBuݒ
    TIM1->CCMR2=0x0060;//Ch3ANeBuݒ
    TIM1->CCER |= 0x0111;// 111 NoComplemenyary 555@INV  DDD NonINV
    TIM1->BDTR |= 0x800a; // 0x80ca Dead Time
    TIM1->SR = 0;      // Clear flags.    
    TIM1->CR1 |= 0x0021; // enable counter
     TIM1 ->DIER |= TIM_DIER_UIE;
     TIM1->DIER |= TIM_DIER_CC1IE | TIM_DIER_CC2IE | TIM_DIER_CC3IE;
#endif    

/************PWM Port Setting************/
#if 1

GPIOA->MODER |= (0b10 << 16); // PA8 Alternate TIM1_CH1
GPIOA->MODER |= (0b10 << 18); // PA9 Alternate TIM1_CH2
GPIOA->MODER |= (0b10 << 20); // PA10 Alternate TIM1_CH3

GPIOB->MODER |= (0b10 << 26); // PB13 Alternate TM1_CH1N
GPIOB->MODER |= (0b10 << 28); // PB14 Alternate TM1_CH2N
GPIOB->MODER |= (0b10 << 2);  // PB1 Alternate  TM1_CH3N

GPIOA-> AFR[1] |= 0b0110 << 0;
GPIOA-> AFR[1] |= 0b0110 << 4;
GPIOA-> AFR[1] |= 0b0110 << 8;
//GPIOA-> AFR[1] |= 0b0000 << 0;

GPIOB-> AFR[1] |= 0b0110 << 20;
GPIOB-> AFR[1] |= 0b0110 << 24;
GPIOB-> AFR[0] |= 0b0110 << 4;
#endif 

/************ADC1 Analog Port Setting************/
#if 1
GPIOA->MODER |= (0b11 << 0); // PA0 for ADC1
GPIOC->MODER |= (0b11 << 0); // PC0 for ADC7
GPIOC->MODER |= (0b11 << 2); // PC1 for ADC6

GPIOC->MODER |= (0b11 << 4); // PC2 for ADC4

#endif 

/************ADC1 Setting************/

    RCC->AHBENR |= (1 << 28); // turn on ADC12 clock
    ADC1_COMMON->CCR |= (0b10 << 16); // 0b01
 #if 1   
    ADC1->CR =0;
    ADC1->CFGR=0;
     ADC1->CFGR |= ADC_CFGR_DMAEN | ADC_CFGR_DMACFG ; // enable DMA as Circular Mode.
     ADC1->CFGR |=  ADC_CFGR_CONT | ADC_CFGR_OVRMOD  ; // continuous single convert mode
   
#endif
#if 1
    ADC1->SQR1 |= 3;
    ADC1->SQR1 |= (0b00001 << 6);//PA0 1 Curr_u
    ADC1->SQR1 |= (0b00111 << 12);//PC1 7 Curr_v
    ADC1->SQR1 |= (0b00110 << 18);//PC0 6 Curr_w
    ADC1->SQR1 |= (0b01000 << 24);//PC2 8 Volume
    
    ADC1->SMPR1 |= (0b001 << 3); // 0b000 -> 2.5 clock cycles, shortest available sampling time
    ADC1->SMPR1 |= (0b001 << 6); 
    ADC1->SMPR1 |= (0b001 << 9); 
    ADC1->SMPR1 |= (0b001 << 12); 
      
    
#endif   
   
    ADC1->CR |=0x00000001;
    while (!(ADC1->ISR & (1 << 0)));
 
/************DMA Setting************/
#if 1
    RCC->AHBENR |= RCC_AHBENR_DMA1EN; // supply clock to DMA1
    DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR; // peripheral addresss
    
    DMA1_Channel1->CMAR = (uint32_t)ADC_buffer; // memory address
    DMA1_Channel1->CNDTR = 4; // 4 data 
    DMA1_Channel1->CCR |= DMA_CCR_PSIZE_0 | DMA_CCR_MSIZE_0 | DMA_CCR_CIRC;
    DMA1_Channel1->CCR |=(0b11<<12);
    // Transfer complete interrupt enable
     DMA1_Channel1->CCR |= (1 << 1);
    // Peripheral: 32bit, Memory: 16bit, Read from Peripheral, circular mode.
    DMA1_Channel1->CCR |= DMA_CCR_EN | DMA_CCR_MINC ;
     
#endif
/*****************************************************************************/
  
   wait_ms(750);
   if((TIM1->SR & TIM_SR_UIF)){//&&(TIM1->CNT>=900)) {  
           ADC1->CR |= 4; // start a/d convert
           while(!(ADC1->ISR & 8 )){}
            TIM1->SR = 0; /* clear UIF */ 
            Vr_adc_i=ADC_buffer[3]/4095.0;//V_adc.read(); 
   
         } 
 while(1){  
    
     if((TIM1->SR & TIM_SR_UIF)){ //timer UpDate
           ADC1->CR |= 4; // start a/d convert
           while(!(ADC1->ISR & 8 )){}//ADCT[L\ϊI
            TIM1->SR = 0; /* clear UIF */ 
            Function(); /*OADCϊʂ𗘗p*/
            ad_time=1;
            curr_ub=ADC_buffer[0]/(4095.0);//Curr_ui.read();
            curr_vb=ADC_buffer[1]/(4095.0);//Curr_vi.read();
            curr_wb=ADC_buffer[2]/(4095.0);//Curr_wi.read();
            vr_ad=ADC_buffer[3]/4095.0;//V_adc.read(); 
            ad_time=0;
            
         } 

         //SWAVE=Nrpm/10000;
         //SWAVE=t_cnt/15000;
         // SWAVE=vr1_ad+0.5;
         //SWAVE=Vr_adc_i;
       // SWAVE=PWM_freq;
         //SWAVE=I_Shunt;
        //SWAVE=V_order/3.3;
          SWAVE=curr_u;
     }//while
     }//main