
引言:
设计一种基于Arduino直流电机PWM调速系统,
PWM电机调速是开环控制技术,精度比较低,容易实现;
更高级的自动控制技术要用到PID控制。
直流电机调速系统是电机调速控制中发展得最为成熟,应用非常广泛的电力传动系统。
硬件准备:
如图所示:
电路连接:
L298N out1,out2分别直接电机引用
L298N N1,N2分别接arduino 10,11引脚
L298N ENA使能端接arduino 6引脚,高电平有效
L298N +5V脚接arduino +5V
L298N GND脚接arduino GND
analogWrite():
功能:给端口写入一个模拟值(PWM波)。
可以用来控制LED灯的亮度变化,或者以不同的速度驱动马达。
当执行analogWrite()命令后,端口会输出一个稳定的占空比的方波。除非有下一个命令来改变它。
PWM信号的频率大约为490Hz.
在使用analogWrite()命令前,可以不使用pinMode()命令把端口定义为输出端口,当然如果定义了更好,这样利于程序语言规范。
delayMicroseconds():
作用:产生一个延时,计量单位是微秒,1000微秒=1毫秒。
目前delayMicroseconds()最大值为16383。
如果值大于1000,推荐使用delay() 命令。
PWM(Pulse-width modulation)脉宽调制
PWM是使用数字手段来控制模拟输出的一种手段。
使用数字控制产生占空比不同的方波(一个不停在开与关之间切换的信号)来控制模拟输出。
arduino的数字端口电压输出只有LOW与HIGH两个开关,
对应0V与5V的电压输出,
周期为PWM频率的倒数。
如果arduino PWM的频率是500Hz,那么两绿线之间的周期就是2毫秒。 analogWrite() 命令中可以操控的范围为0-255,
analogWrite(255)表示100%占空比(常开),
analogWrite(127)占空比大约为50%(一半的时间)。
如图所示:
传统方法实现PWM:
除了使用analogWrite()命令实现PWM,
还可以通过传统方法来控制电平的开关时间来设置。
优点:可以使用任意数字端口做输出端口,且可以自己随意设定占空比与频率;
缺点:是任何中断都会影响时钟,导致很大的抖动,除非禁用中断;
以及CPU在处理输出的时,无法做其他事情。
程序:
void setup(){
pinMode(13, OUTPUT);//设定13号端口为输出
}
void loop(){
digitalWrite(13, HIGH);
delayMicroseconds(100); // 大约10%占空比的1KHz方波
digitalWrite(13, LOW);
delayMicroseconds(900);
}
PWM直流电机调速(代码):
int i=0;
void Forward();
void Back();
void Turn_left();
void Turn_right();
void Speed_up();
void Slow_down();
void setup() {
// put your setup code here, to run once:
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
Forward();
Back();
Turn_left();
Turn_right();
Speed_up();
Slow_down();
}
void Forward(){
//you guys must understand which pin connect to VCC,which pin connect to GND
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
delay(4000);
}
void Back(){
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
delay(4000);
}
void Turn_left(){
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
delay(4000);
}
void Turn_right(){
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
delay(4000);
}
void Speed_up(){
for(i=0;i<=255;i+=5){
analogWrite(9,i);
analogWrite(10,0);
analogWrite(5,i);
analogWrite(6,0);
delay(50);
}//speed up
}
void Slow_down(){
for(i=255;i>=0;i-=5) {
analogWrite(9,i);
analogWrite(10,0);
analogWrite(5,i);
analogWrite(6,0);
delay(50);
}
}
