如何用树莓派驱动一个马达

admin 泰里仪器网 2025-03-26 04:57 0 阅读

第一步,我先将树莓派的系统安装好, 确定gcc编译器,GPIO口都能正常使用.这些操作大家都可以在design spark中搜到,此处就不细讲.

图2

第二步,准备一个小的马达,再到买一个L298N 电机驱动板. L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。

图3

将树莓派上的GPIO 0 1 2 3 分别接到电机驱动板上的IN1、IN2、IN3、IN4口.我们使用的马达连接驱动板后,IN1 IN2 是控制底盘左边的马达, IN3 IN4是控制底盘右边的马达. 控制的原理拿左边的电机来讲: 依次把驱动板的IN1~IN2置为高电平,就可以驱动马达,也就是说,要把树莓派的2个GPIO输出口依次置为高电平。例如,假设用0代表低电平,1代表高电平的话,GPIO 0、1口的电平第一次被置为1、0,第二次被置为0、1,持续下去,电机就会运作。

我修改好的代码如下:

#include

#include

#include

#include

#define CLOCKWISE 1

#define COUNTER_CLOCKWISE 2

void delayMS(int x);

void rotate(int* pins, int direction);

int main(int argc,char* argv[]) {

if (argc < 4) {

printf(Usage example: ./motor 0 1 2 3 \n);

return 1;

}

/* number of the pins which connected to the stepper motor driver board */

int pinA = atoi(argv[1]);

int pinB = atoi(argv[2]);

int pinC = atoi(argv[3]);

int pinD = atoi(argv[4]);

int pins[4] = {pinA, pinB, pinC, pinD};

if (-1 == wiringPiSetup()) {

printf(Setup wiringPi failed!);

return 1;

}

/* set mode to output */

pinMode(pinA, OUTPUT);

pinMode(pinB, OUTPUT);

pinMode(pinC, OUTPUT);

pinMode(pinD, OUTPUT);

int i;

delayMS(50); // wait for a stable status

for (i = 0; i < 500; i++) {

rotate(pins, CLOCKWISE);

}

return 0;

}

/* Suspend execution for x milliseconds intervals.

* @param ms Milliseconds to sleep.

*/

void delayMS(int x) {

usleep(x * 1000);

}

/* Rotate the motor.

* @param pins A pointer which points to the pins number array.

* @param direction CLOCKWISE for clockwise rotation, COUNTER_CLOCKWISE for counter clockwise rotation.

*/

void rotate(int* pins, int direction) {

int i=0;

int j=0;

for (i = 0; i < 2; i++) {

if (CLOCKWISE == direction) {

for (j = 0; j < 2; j++) {

if (j == i) {

digitalWrite(pins[3 - j], 1); // 控制GPIO 2 3为高电平

digitalWrite(pins[1 - j], 1); // 控制GPIO 0 1为高电平

} else {

digitalWrite(pins[3 - j], 0); // 控制GPIO 2 3为低电平

digitalWrite(pins[1 - j], 0 );// 控制GPIO 0 1为低电平

}

}

} else if (COUNTER_CLOCKWISE == direction) {

for (j = 0; j < 2; j++) {

if (j == i) {

digitalWrite(pins[j+2], 1); // 控制GPIO 2 3为高电平

digitalWrite(pins[j], 1); // 控制GPIO 0 1为高电平

} else {

digitalWrite(pins[j+2], 0); // 控制GPIO 2 3为低电平

digitalWrite(pins[j], 0); // 控制GPIO 0 1为低电平

}

}

}

delayMS(4);

}

The End
上一篇 上海电机技术高等专科学校地址 下一篇 002249大洋电机股票价最低时是多少

相关阅读