analogWrite(pin, value)函数
analogWrite()函数的作用,是输出脉宽调制信号(PWM)到指定的PWM引脚。PWM信号可以用来控制LED的亮度或者直流马达的转速,如果你使用analogWrite()函数输出PWM信号时,已自动设置引脚为输出模式,不需要再使用pinMode()函数去设置引脚模式。
为什么会这样?这是因为Arduino的analogWrite()
函数被设计为专门用于PWM支持的数字引脚。当你调用analogWrite(pin, value)
时,它会检查这个引脚是不是PWM引脚,如果pin
是有效的PWM引脚,该函数会首先确保该引脚被配置为输出模式(如果它还不是的话),然后生成具有指定占空比的PWM信号。
这种设计简化了PWM信号输出的过程,因为用户不需要关心引脚的模式设置。你只需要知道哪些引脚支持PWM,并将它们用于需要PWM信号输出的场景。
然而,值得注意的是,如果你试图在一个不支持PWM的数字引脚上使用analogWrite()
函数,Arduino IDE通常会抛出一个错误或警告,告诉你该引脚不支持PWM输出。
此外,虽然analogWrite()
自动处理了引脚的模式设置,但在编写Arduino程序时,明确地使用pinMode()
来设置引脚模式仍然是一个好习惯。这有助于提高代码的可读性和可维护性,并减少因引脚模式设置不当而导致的潜在问题。
这里需要注意的一点就是:PWM信号它并不是真正的模拟信号,这是一种模拟信号的数字近似,通过快速切换高电平和低电平来实现。所以说,PWM引脚时数字引脚,不是模拟引脚,pin不要选择模拟引脚,也不要选择非PWM引脚,多数Arduino板使用3,5,6,9,10,11共6只引脚输出PWM信号(数字的前面又波浪号)。value值为0-255。
analogRead(pin)函数
analogRead()函数的作用是读取模拟输入引脚电压0-5V,并转换成数字0-1023。pin的值就是模拟引脚的编号A0-A5。因为内部使用了10位的模拟/数字转换器,所以analogRead()函数返回值为整数0-1023。
附注
这里有一些可能的疑惑点,罗列如下:
1、我使用analogWrite()输出到PWM引脚后,可以通过analogRead()来读取该引脚的值吗?
不可以的,这是因为PWM引脚实际上是数字引脚,不是模拟引脚,而analogRead()是不能读取数字引脚的。analogWrite()`函数并不是在引脚上产生一个真正的模拟电压值,而是通过PWM(脉冲宽度调制)技术来模拟出一个平均电压值。PWM信号是由数字引脚快速切换高电平和低电平来生成的,因此它本质上是一个数字信号。
所以IDE为了防止你犯错误,你在使用analogRead()读引脚的值的时候,pin值取0-5,实际上跟取A0-A5的效果是一样的,都是模拟引脚的编号。你如果非要用数字引脚,那么Arduino可能会尝试读取一个不存在的ADC通道(因为该引脚没有连接到ADC),或者更糟糕的是,它可能会读取到错误的通道,这取决于硬件布局和微控制器的内部映射。这将导致analogRead()
返回一个无意义或随机的值。
所以,analogWrite()和analogRead()函数,实际上内部实现是很大区别的,虽然都划分为模拟信号函数这类操作。
2、我可以在使用analogWrite输出引脚了之后,又使用digitalRead来读取这个引脚吗?
digitalRead()
函数用于读取数字引脚的状态,它只能识别引脚上的电压是否高于或低于一个阈值(通常是板载电压的一半,例如对于5V Arduino来说是2.5V)。由于PWM信号是一个快速变化的电压波形,digitalRead()
在读取时可能会捕捉到波形的任何一点,这导致读取的结果是不确定的,可能是HIGH
,也可能是LOW
,或者是两者之间的快速切换,这取决于PWM信号的占空比和digitalRead()
函数调用的时刻。
然技术上你可以在使用analogWrite()
之后调用digitalRead()
来读取同一个引脚,但这样做通常不会得到有意义的结果,除非你非常清楚你正在做什么,并且你的应用场景允许这种不确定性。在大多数情况下,你应该避免这样做,并寻找更适合你需求的方法来检测或控制你的电路。
3、analogWrite输出到模拟引脚可以吗?
这个问题也是跟前面的一样的,analogWrite输出的引脚,不是什么引脚都可以的,需要该引脚具备相应的PWM电路,所以你如果使用analogWrite输出到非PWM引脚,要么没有反应,要么报错。