03-1 模拟输出管脚
(一)模拟信号的形式
周围世界中的声音、色彩、温度等都是一模拟信号存在,信号连续变化,可以有多个数值,如0.3,2.6等。
数字信号只有5V和0V两种状态。
(二)PWM(Puslse Width Modulation,脉冲宽度调制)—将数字信号转换成模拟信号
PWM信号通过调整一个信号周期中,高电位持续的时间,所占的比例,模拟出介于0V~5V之间的电压信号,这个比例称为占空比。
下图中高电位占50%的PWM信号,相当于5V X 50% = 2.5V的电压值的模拟信号。占空比越大,等效的平均模拟电压值就越大,反之,越小。
(三)模拟信号PWM输出函数:
analogWrite(管脚编号,模拟数值)
*analogWrite()
是 Arduino 中的一个函数,用于向一个支持脉宽调制(PWM)的引脚输出模拟值(实际上是一个特定占空比的方波)。
语法为:analogWrite(pin, value)
。
pin
:要进行模拟输出的引脚编号。value
:一个介于 0 和 255 之间的值,表示输出的占空比。0 表示完全关闭(低电平),255 表示完全打开(高电平),中间的值表示不同的占空比,从而产生不同程度的模拟输出。
例如,analogWrite(9, 128)
将在引脚 9 上输出占空比为 50%左右的方波,可用于控制 LED 的亮度或电机的速度等。*
03-2 实验:PWM改变LED灯亮度
(一)接线图
(二)程序
仿真图
发光二极管会逐渐点亮逐渐熄灭
控制代码
void setup() {
pinMode(3, OUTPUT);
}
void loop() {
//第1个循环
for (int i = 0; i <= 256; i++) {
analogWrite(3, i);
delay(5);
}
//第2个循环
for (int i = 256; i > 0; i--) {
analogWrite(3, i - 1);
delay(5);
}
}
(三)功能解释
程序。其功能是让连接在数字引脚 3 上的设备(比如 LED)逐渐变亮然后再逐渐变暗,不断循环这个过程。
1:void setup():
pinMode(3, OUTPUT);:将数字引脚 3 设置为输出模式,以便后续可以通过这个引脚输出高电平或低电平来控制连接的设备。
2.void loop():
这个函数中的代码会不断重复执行。
第1个循环:
for (int i = 0; i <= 256; i++):从 0 开始逐步递增到 256。
analogWrite(3, i),将引脚 3 的PWM输出模拟数值设置为当前循环变量 i 的值。由于 i 的值在每次循环中逐渐增大,输出的模拟信号大小也逐步增大,这会使连接在该引脚上的LED发光二极管逐渐变亮。delay(5)是每次循环暂停 5 毫秒,以控制变化的速度,避免变化过快。
第2个循环:
for (int i = 256; i > 0; i–):从 256 开始逐步递减到 1。analogWrite(3, i - 1)将引脚 3 的输出模拟数值设置为 i - 1 的值,使连接在该引脚上的LED逐渐变暗。delay(5)是同样每次循环暂停 5 毫秒。
03-3 模拟量输入管脚
(一)电阻分压原理
在串联电路中,电阻分配到的电压会与电阻成正比,电阻值占比越大,分配到的电压就越大。
两个电阻串联电路中,R1电阻分配到的电压计算公式:
V
1
=
R
1
R
1
+
R
2
∗
V
总
V_1= \frac{R1}{R1+R2}*V_总
V1=R1+R2R1∗V总
(二)可变电阻
可变电阻器照片,内部结构,电路符号
(三)模拟信号测量函数:
analogRead(模拟管脚编号)
analogRead()是用于读取模拟输入引脚的电压值,回传一个 0 到 1023 之间的整数值,对应到0~5V的模拟信号。
模拟管脚的编号是:A0,A1,A2,A3,A4…
例如,如果要读取模拟引脚 A0 的值,可以这样写:
int value = analogRead(A0);
返回的整数值与输入的电压成正比,即 0 对应 0V,1023 对应参考电压(通常为 5V 或 3.3V,取决于 Arduino 板的类型)。
这个函数在需要读取传感器的模拟输出值(如光敏电阻、电位器等)时非常有用。通过读取模拟输入引脚的值,可以获取传感器测量的物理量,并根据需要进行进一步的处理和控制。
03-4 实验:显示可变电阻值
(一)接线图:
(二)程序
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT); //将A0管脚设定成输入模式
}
void loop() {
//将模拟管脚读到的数值存储在value变量中
int value = analogRead(A0);
//将读到的数值显示在串口监视器中,每行显示一次测量数值
Serial.println(value);
delay(100);
}
(三)实测
转动可变电阻器的旋钮,可以看到从0~1023不停变化的模拟数值。
03-5 实验7 Arduino 的模拟输入
从指定的模拟引脚读取值。Arduino 主板有 6 个通道(A0,A1,A2,A3,A4,A5) 。
这6个管脚连接到芯片内部的10 位 AD(模拟信号到数字信号的转换器)。
这意味着模拟输入电压: 0-5 伏,转换到0-1023 的数字数据的范围,这个就是 AD转换器的原理。
转换精度为:5 伏/1024 ,约等于每个数字单位 相当于0.049 伏电压(4.9 毫伏)。
(一)连线图
(二)程序代码
int analogPin = A5;
int val = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
val = analogRead(analogPin);
Serial.println(val);
Delay(1000);
}
(三)程序运行结果验证
03-6 实验8 Arduino 的模拟输出
Arduino 的 PWM 频率约为 500Hz。
analogWrite() 的括号里面的参数范围是: 0- 255
例如:
analogWrite( 255)需要 100%占空比 (常开)
analogWrite( 127)是 50%占空比(一半的时间)。
Arduino板(带有 ATmega168 或 ATmega328) ,这个analogWrite() 函数工作在数字信号引脚 3, 5 ,6 ,9 ,10 和 11。
(一)连线图
(二)程序代码
int ledPin = 3;
int analogPin = A5;
int val = 0;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
val = analogRead(analogPin);
analogWrite(ledPin, val / 4);
}
(三)程序运行结果验证
当旋转电位器时,LED发光二极管会随着电位器的变化而发生亮度的改变。
3-7 伺服电机
(一)伺服舵机是一种直流电机,可以固定在0-180度内旋转。
舵机有一个三线的接口。
黑色(或棕色)线接GND ,
红线接电压正5V,
黄线(或是白色或橙色)接控制信号端。
控制方式采用 PWM 信号
(二)旋钮控制伺服舵机(实验十六)
接线图
建议在wokwi仿真网站上的案例基础上改,从空白工程进行设计会导致编译不通过。
程序代码
#include <Servo.h> //调用 arduino 自带的Servo.h舵机 库
Servo myservo; //定义一个名为myservo的Servo类的对象
void setup() {
myservo.attach(9); //将9号管脚指定为控制舵机的管脚
}
void loop() {
int value = analogRead(A0); //将可变电阻的模拟数值存到value中
int angle = map(value, 0, 1023, 0, 180); //将模拟值转为角度值
myservo.write(angle); //使舵机转动到特定角度myservo.write(角度)
delay(15);
}
程序运行调试
转动可变电阻器的旋钮,使伺服舵机的转轴随之转动。
map()函数
需要将读到的模拟数值(0-1023)等比例缩小到伺服舵机的角度范围(0-180),可以使用Arduino中的map()函数:
int value = analogRead(A0); //将可变电阻的模拟数值存到value中
int angle = map(value, 0, 1023, 0, 180); //将模拟值转为角度值
参考wokwi.com上的伺服舵机应用案例
链接: wokwi上的超声波传感器伺服舵机演示项目链接
打开链接后,点击开始仿真按钮,然后进入仿真,再点击“超声波传感器”,拖动滑条,改变超声波传感器检测的距离数据。可以看到伺服舵机的控制效果。
超声波传感器伺服舵机演示操作