前段时间参加硕士复试,有一道题是pwm是什么,如何产生pwm,录取成功后接下来在这里写一下吧!
1、脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值,我们就通过使用高分辨率计数器,利用方波的占空比被调制的方法来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么是5V(ON),要么是0V(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。
2、通过上面的一段话应该已经理解了pwm是什么,pwm通俗讲就是通过占空比的方式来改变平均电压,从而使电机的转速或者led的亮度发生改变,那么pwm怎么产生呢,这里我使用arduino uno和l298n再加上从之前做的平衡车上拆下来的12v直流减速电机进行演示
(1)l298n如何连线
计算的。这个
这个是我从淘宝上下载下来的,其中12V供电即为7-12V的输入,如果你的电源电压是7-12V的话那么从这里输入,供电GND即为接地咯,5V供电的话如果你是5V电源接这里,如果是7-12那么接12v供电,这里会有一个5V的输出可以当一个5V电源。接下来通道A使能即在图上插着跳线帽的,它是输出A的使能端,这里如果不拔下来那么电机将会全速转动,如果想要控制电机的转速那么拔下来,作为pwm的输入端口,in1和in2通过高低电平的接入可以控制电机的正反转。in3、in4和使能端B控制输出B
(2)将arduino和l298n、电机连在一起,如图,将arduino上的第5、第6输入输出I/O口作为in1和in2输入,将可输出pwm的10后口作为使能端A的输入连接
需要注意的一点是arduino必须和驱动板为同一电压源输入,例如我这里就是12v的电池输入,当然除了DC口也可以通过arduino上的vim口输入(在两个接地口下方)
(3)生成pwm波
A、使用arduino中的analogWrite生产pwm波,这里analogWrite可输入的数字为0-255当然电机低于某个电压就会不转了,大家可以更改数值来试一下,这种方法的缺点是无法修改pwm的频率
int input1 = 5; // 定义uno的pin 5 向 input1 输出
int input2 = 6; // 定义uno的pin 6 向 input2 输出
int enA = 10; // 定义uno的pin 10 向 输出A使能端输出
void setup() {
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(enA,OUTPUT);
}
void loop() {
digitalWrite(input1,HIGH); //给高电平
digitalWrite(input2,LOW); //给低电平
analogWrite(enA,100);
}
B、使用延时函数来制作pwm波,这种方法大家可能比较熟悉,因为经常会用到delay函数,很简单,有一点需要注意的是平时pwm波通常为50hz即为20ms,所以我这里设置为pwm时间为20ms,即高低电平时间加起来为20,你也可以尝试不同的频率,试一下有什么效果。
int input1 = 5; // 定义uno的pin 5 向 input1 输出
int input2 = 6; // 定义uno的pin 6 向 input2 输出
int enA = 10; // 定义uno的pin 10 向 输出A使能端输出
void setup() {
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(enA,OUTPUT);
}
void loop() {
digitalWrite(input1,HIGH); //给高电平
digitalWrite(input2,LOW); //给低电平
digitalWrite(enA,HIGH);
delay(10);
digitalWrite(enA,LOW);
delay(10);
}
C、使用可确定延迟到微秒的delayMicroseconds,与上诉delay不同delayMicrosecends可延迟最小时间为1微秒,这样子就可充分的利用pwm波,因为上诉B确定到毫秒(1毫秒=1000微秒)20毫秒周期的pwm波相当于只有20种占空比方法
int input1 = 5; // 定义uno的pin 5 向 input1 输出
int input2 = 6; // 定义uno的pin 6 向 input2 输出
int enA = 10; // 定义uno的pin 10 向 输出A使能端输出
int pulsewidth; //定义脉冲高电平微秒数
void setup() {
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(enA,OUTPUT);
}
void loop() {
pulsewidth=500;
digitalWrite(input1,HIGH); //给高电平
digitalWrite(input2,LOW); //给低电平
digitalWrite(enA,HIGH);
delayMicroseconds(pulsewidth);
digitalWrite(enA,LOW);
delay(20-pulsewidth/1000);
}