DC motor control program using TA7291P type H bridge driver and rotary encoder with A, B phase.
Fork of DCmotor2 by
Hbridge.cpp
- Committer:
- kosaka
- Date:
- 2013-01-04
- Revision:
- 12:459af534d1ee
- Child:
- 13:ba71733c11d7
File content as of revision 12:459af534d1ee:
#include "mbed.h" #include "controller.h" #include "Hbridge.h" #define DEADTIME_US (unsigned long)(DEADTIME*1000000) // [us], deadtime to be set between plus volt. to/from minus Timeout pwm; DigitalOut pwm_upper = UPPER_PORT; DigitalOut pwm_lower = LOWER_PORT; pwm_parameters IN; // UVW pwm の定数、変数 DigitalOut debug_p24(p24); // p17 for debug //DigitalOut Led3(LED3); #if PWM_WAVEFORM==0 // 0: saw tooth wave comparison #if 1 void pwm_out() { // pwm out using timer //debug_p24=1; IN.mode += 1; //IN.duty=0.9;IN.fReverse[0]=1; if( IN.fDeadtime==1 && IN.mode==1){ pwm.attach_us(&pwm_out, DEADTIME_US); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 0; IN.fDeadtime = 0; IN.fReverse[1] = IN.fReverse[0]; IN.mode = 0; }else if( IN.mode==1 ){ if( IN.fReverse[1]==0 ){ pwm_upper = 1; pwm_lower = 0; }else{ pwm_upper = 0; pwm_lower = 1; } IN.upper_us = IN.duty*1000000/PWM_FREQ; // ON time of pwm if( IN.upper_us < TMIN ){ IN.upper_us=TMIN;} pwm.attach_us(&pwm_out, IN.upper_us); // setup pwmU to call pwm_out after t [us] IN.lower_us = 1000000/PWM_FREQ -IN.upper_us; // OFF time of pwm if( IN.lower_us < TMIN ){ IN.lower_us=TMIN;} }else{// if( IN.mode==2 ){ pwm.attach_us(&pwm_out, IN.lower_us); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 0; IN.mode = 0; } //debug_p24=0; } #else void pwm_out() { // pwm out using timer IN.mode += 1; if( IN.mode==1 ){ pwm_upper = 1; pwm_lower = 0; IN.upper_us = IN.duty*1000000/PWM_FREQ - DEADTIME_US; // ON time of Uupper if( IN.upper_us < TMIN ){ IN.upper_us=TMIN;} pwm.attach_us(&pwm_out, IN.upper_us); // setup pwmU to call pwm_out after t [us] IN.lower_us = 1000000/PWM_FREQ -IN.upper_us - 2*DEADTIME_US; // ON time of Ulower if( IN.lower_us < TMIN ){ IN.lower_us=TMIN;} }else if( IN.mode==2 ){ pwm.attach_us(&pwm_out, DEADTIME_US); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 0; }else if( IN.mode==3 ){ pwm.attach_us(&pwm_out, IN.lower_us); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 1; }else{// if( u.mode==4 ){ pwm.attach_us(&pwm_out, DEADTIME_US); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 0; IN.mode = 0; } } #endif #elif PWM_WAVEFORM==1 // 1: triangler wave comparison void pwm_out() { // pwm out using timer IN.mode += 1; if( IN.fDeadtime==1 && IN.mode==1){ pwm.attach_us(&pwm_out, DEADTIME_US); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 0; IN.fDeadtime = 0; IN.fReverse[1] = IN.fReverse[0]; IN.mode = 0; }else if( IN.mode==1 ){ IN.upper_us = IN.duty*1000000/PWM_FREQ; // ON time of Uupper IN.lower_us = 1000000/PWM_FREQ -IN.upper_us; // ON time of Ulower IN.lower_us /= 2; if( IN.lower_us < TMIN ){ IN.lower_us=TMIN;} pwm.attach_us(&pwm_out, IN.lower_us); // setup pwmU to call pwm_out after t [us] if( IN.upper_us < TMIN ){ IN.upper_us=TMIN;} pwm_upper = 0; pwm_lower = 0; }else if( IN.mode==2 ){ pwm.attach_us(&pwm_out, IN.upper_us); // setup pwmU to call pwm_out after t [us] if( IN.fReverse[1]==0 ){ pwm_upper = 1; pwm_lower = 0; }else{ pwm_upper = 0; pwm_lower = 1; } }else{// if( IN.mode==3 ){ pwm.attach_us(&pwm_out, IN.lower_us); // setup pwmU to call pwm_out after t [us] pwm_upper = 0; pwm_lower = 0; IN.mode = 0; } } #endif void start_pwm(){ IN.duty = 0.0; pwm_upper = pwm_lower = 0; IN.mode = 0; IN.fDeadtime = 1; IN.fReverse[0] = 0; pwm_out(); } void stop_pwm(){ IN.duty = 0.0; pwm_upper = pwm_lower = 0; IN.mode = 0; pwm.detach(); }