Arduino:直流电机PWM调速

Arduino:直流电机PWM调速

引言:

设计一种基于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);

}

}