PWM在很多场景下都能得到应用,比如调光、电机调速、音频等。在这里我们使用PWM对LED进行亮度调节,下面跟着我一步步动手完成吧。
电脑,windows系统
零知开发板
micro-usb线
LED灯一个
220Ω 电阻1个
电位器一个
面包板一个+若干跳线
1、打开零知实验室软件开发工具,然后新建项目,输入以下代码:
2、按照之前的方式先【编译】,然后【上传】到开发板中。
/**
* 文件: PWM调光测试.ino by 零知实验室(www.lingzhilab.com)
* -- 零知开源,让电子制作变得更简单! --
* 时间: 2018/06/26 09:55
* 说明: 使用电位器来调节LED灯的亮度
**/
int led = 0;//led连接到一个具有PWM引脚功能的脚上,这里连接到具有PWM功能的0脚
int port = A0;//连接电位器的引脚,测量模拟输入
int value = 0;//读取到的模拟输入值
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
value = analogRead(port);
Serial.println(value);
//因为模拟读取范围为0-4095,而pwm输出范围为0-65535,要将模拟数值和pwm值映射对应,
//因此这里把读到的模拟值扩大16倍
analogWrite(led, value*16);
delay(100);//延时一会儿
}
上面步骤成功完成后,我们就可以看到预期的结果了,打开【调试】,选择【串口调试】,调节电位计,可以看到变化:
同时,在我们调节电位计的时候,LED灯的亮度随之变化
可以使用下面代码测试结果:
/*
*12脚产生pwm测试
*/
const uint16_t pulseDelay = 200;
const uint16_t pulseWidth = 200;
//-----------------------------------------------------------------------------
void toggle_led()
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
//-----------------------------------------------------------------------------
void setup()
{
//设置 12脚 (Timer3 channel 1) 产生 pwm
pinMode(12, PWM);
Timer3.pause();
Timer3.setPrescaleFactor(1);
Timer3.setCompare(TIMER_CH1, 2);
Timer3.setOverflow(2);
Timer3.refresh();
Timer3.resume();
}
//-----------------------------------------------------------------------------
void loop()
{
}
我使用100M的逻辑分析仪测试结果是25M(可以用示波器进行更精确测试),理论上是还可以增加的,把上面两个参数从2调到1。下图为逻辑分析仪测试结果: