Bring down Resolution to have a easier code. We could give it a shot. I think it will help our Identification of DC motor for it can run faster (maybe).

Dependencies:   mbed

ID_motor.cpp

Committer:
bobolee1239
Date:
2017-03-20
Revision:
1:307e6821d26f
Parent:
0:aa69084e1cae

File content as of revision 1:307e6821d26f:

#include "mbed.h"
 
 // numbers will be defined as double in default, add f after numbers will denfined it as float
 // IDEA: to observe and control two motors seperatedly 
 
 #define Ts = 0.01f  // sampling interval ( sec.)
 
 Serial pc(USBTX, USBRX) ;  // serial (tx, rx) 
 Ticker timer1 ;            // Timer
 
 // DC motor complement PWM parameter 
 PwmOut pwm1 (D7) ;
 PwmOut pwm1n (D11) ;
 PwmOut pwm2 (D8) ;
 PwmOut pwm2n (A3) ;

// Hall sensor for motor 1
InterruptIn HallA_1 (A1) ;
InterruptIn HallB_1 (A2) ; 
int HallA_1_state = 0 ;
int HallB_1_state = 0 ;

// Hall sensor for motor 2
InterruptIn HallA_2 (D13) ;
InterruptIn HallB_2 (D12) ;
int HallA_2_state = 0 ;
int HallB_2_state = 0 ;


// defination of functions 
void init_I0() ;
void init_TIMER() ;
void timer1_ITR() ;
void init_CN() ;
void CN_ITR_1() ;
void CN_ITR_2() ;
void init_PWM() ;

// Speed estimator for DC motor
int speed_count_1 = 0 ;
int speed_count_2 = 0 ; 
float rotation_speed_1 = 0.0 ;
float rotation_speed_2 = 0.0 ;
float pwm1_duty = 0.5 ;
float pwm2_duty = 0.5 ; 




int main() 
{
    init_TIMER() ;
    init_PWM() ;
    init_CN() ;
    
    while(true)
    {
    }
}

void init_TIMER()
{
 timer1.attach_us(&timer1_ITR, 10000.0);   // address of function to be attached (timer1_ITR) and interval (in us)   
}

void init_PWM()
{
 // INPUT SIG. to motor 1
 pwm1_duty = 0.7f ;
 pwm1.write(pwm1_duty) ;  // Volts = 5* pwm1_duty (volts)
 TIM1->CCER |= 0x4 ;      // Complement PWM
 
 // INPUT SIG. to motor 2
 pwm2_duty = 0.7f ;
 pwm2.write(pwm2_duty) ;  // Volts = 5* pwm1_duty (volts)
 TIM1->CCER |= 0x40 ;      // Complement PWM
}



void init_CN()        // Rising and Falling Trig for ONLY ONE HALL sensor 
{
   HallA_1.rise(&CN_ITR_1); 
   HallA_1.fall(&CN_ITR_1);
   
   HallA_2.rise(&CN_ITR_2);
   HallA_2.fall(&CN_ITR_2);
    
}

void CN_ITR_1()   // judge direction and speed_count for motor 1
{   
    // read wat hall measured
    HallA_1_state = HallA_1.read() ;    
    HallB_1_state = HallB_1.read() ;
    
    // to judge rotation direction
    if (HallA_1_state == HallB_1_state)
    speed_count_1 += 1 ;
    else
    speed_count_1 -= 1 ;
    
}

void CN_ITR_2()    // judge direction and speed_count for motor 2
{
  // read wat hall measured
  HallA_2_state = HallA_2.read() ;
  HallB_2_state = HallB_2.read() ;
  
  // judge rotation direction
  if (HallA_2_state == HallB_2_state)
  speed_count_2 += 1 ;
  else 
  speed_count_2 -= 1 ;
     
}

void timer1_ITR()
{
 // monitor for motor 1
 rotation_speed_1 = (float)speed_count_1*100.0f/ 12.0f* 60.0f/ 29.0f ; // unit: rpm
 speed_count_1 = 0 ;                                                   // initialize for another time
 pc.printf("Wm1 = %f (rpm) \n", rotation_speed_1) ;                        // Serial print to know Wm    
 // read Data to Matlab
 // pc.printf("%f ",rotation_speed_1);
    
// monitor for motor 2
rotation_speed_2 = (float)speed_count_2*100.0f/ 12.0f* 60.0f/ 29.0f ; // unit: rpm
speed_count_2 = 0 ;                                                   // initialize for next time
pc.printf("Wm2 = %f (rpm) \n", rotation_speed_2) ;                    // Serial print to know Wm
// read Data to Matlab
//pc.printf("%f ", rotation_speed_2) ; 
}