Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
brushlessController_L293D.cpp
- Committer:
- BaserK
- Date:
- 2015-07-16
- Revision:
- 3:d6e8fbc04a43
- Parent:
- 2:ac825be76379
- Child:
- 4:3f311665f813
File content as of revision 3:d6e8fbc04a43:
#include "brushlessController_L293D.h"
/* Digital Outputs */
DigitalOut en1(p18);
DigitalOut en2(p19);
DigitalOut en3(p20);
DigitalOut out1(p21);
DigitalOut out2(p22);
DigitalOut out3(p24);
/* Brushless motor control function
*
* @brief: This function can control a brushless motor with L293D.
* By changing steps of the brushless motor one after another, motor
* can be controlled in either direction.
*
* @variables:
* dir: Direction of the motor
* delay_time: Time delay between steps
* stepNum: Number of steps
*/
void brushlessControl(bool dir, int delay_time, int stepNum)
{
/* Digital outputs are initially zero */
out1 = 0; out2 = 0; out3 = 0;
/* Enable the outputs initially */
en1 = 1; en2 = 1; en3 = 1;
int stepCount = 0; // Number of step counts
/* Magical data_array to drive the brushless motor */
// HIGH:1, LOW:0, HIGH-Z:2
char data_array[]={1,2,0, 1,0,2, 2,0,1, 0,2,1, 0,1,2, 2,1,0};
char data_arrayInv[]={0,1,2, 0,2,1, 2,0,1, 1,0,2, 1,2,0, 2,1,0};
if(dir==1) // if dir = 1, reverse the motor direction
for(int k=0; k<18; k++)
data_array[k] = data_arrayInv[k];
for (int i=0; i<stepNum; i++)
{
i%=6; // Steps will be repeated at mod6
out1 = data_array[3*i]; (data_array[3*i] == 2)?(en1 = 0):(en1 = 1);
out2 = data_array[3*i+1]; (data_array[3*i+1] == 2)?(en2 = 0):(en2 = 1);
out3 = data_array[3*i+2]; (data_array[3*i+2] == 2)?(en3 = 0):(en3 = 1);
wait_ms(delay_time);
if(++stepCount == stepNum) break;
}
}
/* Brushless motor one step movement function
*
* @brief: This function can move the motor one step in either direction
* It takes the previous step as a parameter and uses it to go next.
*
* @variables:
* dir: Direction of the motor
* delay_time: Time delay between steps
* prevStep: Previous step of the motor
*/
void oneStep(bool dir, int delay_time, int* prevStep)
{
/* Digital outputs are initially zero */
out1 = 0; out2 = 0; out3 = 0;
/* Enable the outputs initially */
en1 = 1; en2 = 1; en3 = 1;
/* Magical data_array to drive the brushless motor */
// HIGH:1, LOW:0, HIGH-Z:2
char data_array[]={1,2,0, 1,0,2, 2,0,1, 0,2,1, 0,1,2, 2,1,0};
if(dir==1)
*prevStep = *prevStep + 1; // Increase prevStep for next step || WARNING: *prevStep++ did not work
else
*prevStep = *prevStep - 1;
int i = *prevStep;
if (i<0) // Mod operation for the negative number
{
i*=(-1); i%=6; i=6-i;
i%=6; // if i=6, it should be zero.
}
else
i%=6; // Steps will be repeated at mod6
out1 = data_array[3*i]; (data_array[3*i] == 2)?(en1 = 0):(en1 = 1);
out2 = data_array[3*i+1]; (data_array[3*i+1] == 2)?(en2 = 0):(en2 = 1);
out3 = data_array[3*i+2]; (data_array[3*i+2] == 2)?(en3 = 0):(en3 = 1);
wait_ms(delay_time);
}