Full H Bridge Microstepping Stepper Motor Demo software
main.cpp
- Committer:
- jeroen3
- Date:
- 2013-10-08
- Revision:
- 0:8e4a6920a484
File content as of revision 0:8e4a6920a484:
/**
* @file main.cpp
* @brief Bipolar Steppr Motor Control with dual H Bridge
* @details Software plays stepper motor lookup tables for dual h bridge control.
*
*
* @Author Jeroen Lodder
* @Date September 2013
* @version 1
*
*/
#include "mbed.h"
#include "smclut.h"
/* MOSFET io
* FET L1 L2 H1 H2 H3 H4 L3 L4
* Motor MA MB
* mbed p21 p22 p25 p26 p27 p28 p23 p24
* ------------------------ V+
* | | | |
* \H1 \H2 \H3 \H4
* |--MA--| |--MB--|
* \L1 \L2 \L3 \L4
* | | | |
* ------------------------ V-
*/
/* Fet driver definitions */
/* Turn off time fet driver in micro seconds (uS) */
#define TURN_ON_TIME_FET_DRIVER 750
/* Control definitions */
/* Mutliplier of speed wait time setting */
#define SPEED_SCALING 0.5
/* Motor control definitions */
#define PWM_PERIOD 512 // Q15
#define PWM_AMPLITIUDE 1 // 0 to 1, equals torque
#define PHASE_SHIFT 1 // Shift in rads
#define PI 3.14159265359
AnalogOut signal(p18);
Serial pc(USBTX, USBRX);
/* IO declarations */
/* LED coil indicators */
DigitalOut LED_H1(LED1);
DigitalOut LED_H2(LED2);
DigitalOut LED_H3(LED3);
DigitalOut LED_H4(LED4);
#define SetLed() LED_H1 = FET_H1; \
LED_H2 = FET_H2; \
LED_H3 = FET_H3; \
LED_H4 = FET_H4;
/* H Bridge output IO */
PwmOut FET_L1( p21 ); // MA
PwmOut FET_L2( p22 ); // MA
PwmOut FET_L3( p23 ); // MB
PwmOut FET_L4( p24 ); // MB
DigitalOut FET_H1( p25 ); // MA
DigitalOut FET_H2( p26 ); // MA
DigitalOut FET_H3( p27 ); // MB
DigitalOut FET_H4( p28 ); // MB
/* Motor Control Ticker */
Ticker smc;
volatile int smc_walker = 0;
volatile int smc_dir = 1;
volatile int smc_steps = -1;
volatile int smc_free = 1;
void smc_routine(){
#define i smc_walker
// Phase 1 A
// If sin +, H1->L2
// If sin -, H2->L1
FET_H1 = LUT_H1[i];
FET_H2 = LUT_H2[i];
FET_L1.pulsewidth_us( LUT_L1[i] );
FET_L2.pulsewidth_us( LUT_L2[i] );
// Phase 1 A
// If sin +, H1->L2
// If sin -, H2->L1
FET_H3 = LUT_H3[i];
FET_H4 = LUT_H4[i];
FET_L3.pulsewidth_us( LUT_L3[i] );
FET_L4.pulsewidth_us( LUT_L4[i] );
// uint8_t bridge = ( FET_H1.read() << 7 )|
// ( isPositive(FET_L1.read()) << 6 )|
// ( FET_H2.read() << 5 )|
// ( isPositive(FET_L2.read()) << 4 )|
// ( FET_H3.read() << 3 )|
// ( isPositive(FET_L3.read()) << 2 )|
// ( FET_H4.read() << 1 )|
// ( isPositive(FET_L4.read()) << 0 );
SetLed();
#undef i
/* Walk */
smc_walker += smc_dir;
if(smc_walker > 31)
smc_walker = 0;
if(smc_walker < 0)
smc_walker = 31;
/* Coutdown */
if(smc_steps != -1){
if(smc_steps == 0){
if(smc_free){
// motor free
FET_L1 = 1;
FET_L2 = 1;
FET_L3 = 1;
FET_L4 = 1;
FET_H1 = 0;
FET_H2 = 0;
FET_H3 = 0;
FET_H4 = 0;
}else{
// motor locked
}
SetLed();
smc.detach();
}
smc_steps--;
}
}
void smc_dostep(int steps, int dir, float time_ms, int free){
// steps = number of microsteps (8 microsteps per full step)
// dir = -1 or 1
// time_us = completion time in s
smc_steps = steps;
smc_dir = dir;
smc_free = free;
smc.attach_us(&smc_routine, (time_ms*1000)/steps);
}
int main(void) {
pc.baud(115200);
pc.printf("hi\r\n");
/* Control declarations */
/* Direction LUT are played */
//DigitalIn direction( p20 );
/* Step pulse input if step mode */
//DigitalIn step( p18 );
/* Speed potmeter input */
//AnalogIn speed( p19 );
//AnalogIn phase( p17 );
/* PWM init */
FET_L1.period_us(PWM_PERIOD);
FET_L2.period_us(PWM_PERIOD);
FET_L3.period_us(PWM_PERIOD);
FET_L4.period_us(PWM_PERIOD);
FET_L1 = 1;
FET_L2 = 1;
FET_L3 = 1;
FET_L4 = 1;
FET_H1 = 0;
FET_H2 = 0;
FET_H3 = 0;
FET_H4 = 0;
SetLed();
//smc.attach_us(&smc_routine, 6000);
smc_dostep(1600, 1, 1000.0, 1);
/* Stepper motor control loop */
while(1){
while(!pc.readable());
while(pc.readable()) pc.getc();
smc_dostep(16, 1, 100.0, 0);
}
}