控制直流电机比较简单,主要利用Lm298n构成H桥来控制电机正反转。。
器件:
LM298N模块1块;arduino uno 1块;直流电机 1个。
接线:
LM298n除了控制部分和电机输入电源线各2根外,输入In1~In4,分别对应输出OUT1~OUT4. 接直流电机时OUT1、2接电机1的两条电源线;OUT3、4接电机2。这里只用了一个直流电机所以直接out1、2.
输入端还有两条线EnA、EnB分别用于输入pwm波对两个电机调速。
In1:High,In2:Low 时,电机正传(其实无所谓方向正负)。反之,反转。
In1--》P13;in2--》p12; EnA--》P11(需要可以输出pwm波的端口)
程序:
对网上找的的程序进行修改,实测可用:
#define motor1pin1 13 //定义IN1引脚
#define motor1pin2 12 //定义IN2引脚
#define motor1pwm 11 //定义ENA引脚(我的是Mega2560的板子)
#define motor2pin1 9 //定义IN3引脚
#define motor2pin2 8 //定义IN4引脚
#define motor2pwm 10 //定义ENB引脚
unsigned long lastMillis =0;
unsigned long currentMillis =0;
unsigned long lastMicros =0;
unsigned long currentMicros =0;
unsigned long intervalMillis =0 ;
unsigned long intervalMicros =0;
void motor(int motorpin1,int motorpin2,int motorpwm,int val) //定义一个电机转动函数
{
pinMode(motorpin1,OUTPUT); //输出第一个引脚
pinMode(motorpin2,OUTPUT); //输出第二个引脚
digitalWrite(motorpin2,0); //将第二个引脚置低
digitalWrite(motorpin1,1); //将第一个引脚抬高
analogWrite(motorpwm,val); //给EN引脚设定模拟值,设定转速
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
int i;
currentMicros=micros();
intervalMicros = currentMicros - lastMicros;
Serial.println(intervalMicros);
lastMicros=currentMicros;
// for(i=100;i<=255;i++) //让电机的转速从100到255转动,A,B转速不一样,完成转向
// {
// // motor(motor2pin1,motor2pin2,motor2pwm,255); //电机B保持255匀速转动
// motor(motor1pin1,motor1pin2,motor1pwm,i); //电机A从100到255转动
// delay(500); //间隔500ms
// }
// for(i=100;i<=255;i++) //让电机从100到255转动,功能同上
// {
// motor(motor1pin1,motor1pin2,motor1pwm,255);
// // motor(motor2pin1,motor2pin2,motor2pwm,i);
// delay(500);
// }
motor(motor1pin1,motor1pin2,motor1pwm,125); //电机A以 转速转动
delay(500);
motor(motor1pin1,motor1pin2,motor1pwm,0);
delay(500);
motor(motor1pin2,motor1pin1,motor1pwm,125); //电机A反向转动
delay(500);
motor(motor1pin1,motor1pin2,motor1pwm,0);
delay(500);
}
结论:
对直流电机的方向和速度控制简单。一个电机需要3个I/o口,因此一片arduino uno 只能控制4个电机,而且无法增加反馈。实际测量A0~A5也是可以输出数字信号的,如果可以加入,最多可控制6个电机,这个以后看看avr的接口再说。
电机自带一个霍尔元件构成的码盘,测量成功,但还没用于电机速度位置控制,在网上搜了一下闭环控制的内容,发现首先需要采集足够多的编码器信号,如果对编码器进行4倍频,又需要占用1个中断2个接口,多个电机时处理速度上不知道是否可以保证;pid控制方面的例子也比较少,只好拔了一下arduino.cc,发现有人提供了库函数。后面有时间试试。