Arduino常用的函数解释-analogWrite,anglogRead

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引脚,要么没有反应,要么报错。

回答: Arduino常用函数包括analogWrite()和analogRead()。analogWrite()函数用于实现PWM输出功能,可以在Arduino Uno的引脚3、5、6、9、10、11上提供PWM功能。该函数内部已经完成了引脚的初始化,不需要在Setup()函数中进行初始化操作。参数pin指定要输出PWM波的引脚,参数value指定PWM的脉冲宽度,范围为0~255。返回值是Arduino Uno模拟输入功能的10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。\[1\] 另外,Arduino中的输出低电平为0V,输出高电平为当前Arduino的工作电压。例如,Arduino UNO的工作电压为5V,其高电平输出也是5V;Arduino Due的工作电压为3.3V,所以高电平输出也是3.3V。\[2\] 对于输入电压的识别,Arduino UNO会将大于3V的输入电压视为高电平,小于1.5V的电压视为低电平。即使输入电压不太准确,Arduino UNO也可以正常识别。但需要注意的是,超过5V的输入电压可能会损坏Arduino UNO。\[3\] #### 引用[.reference_title] - *1* [Arduino常用函数](https://blog.csdn.net/LYXlyxll/article/details/124318790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Arduino常用函数(一)](https://blog.csdn.net/m0_57656758/article/details/123368399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值