【Arduino学习笔记07】模拟信号的输入与输出 analogRead() analogWrite() map() constrain()

  • 模拟信号:Arduino中的模拟信号就是0v~5v的连续的电压值
  • 数字信号:Arduino中的数字信号就是高电平(5V)或者低电平(0V),是两个离散的值

 

模拟信号->数字信号:ADC(模数转换器)

  ADC是用于将模拟信号转换为数字信号的电路。将输入的模拟信号通过ADC转换为数字信号,处理器才能对其进行处理。

  这里讲的模拟输入是指0~5v的电压值。在Arduino上,ADC具有10位分辨率,这意味着它可以通过1,024个数字表示模拟电压。相当于将连续的电压值0~5v映射到离散的数值0~1023。将0 ~ 5V的电压分成1024份(2^10),算出来约为4.882mV的测量精度。即:0~4.882mV之间的电压值映射到数字0,4.883mV~9.764mV之间的电压值映射到数字1......

 

  这里的转换关系如下:

  数字i对应的模拟电压区间为:

  

 

 

   如果用区间的中位数来代表数字i对应的模拟电压:

  

 

 

 

模拟输入:analogRead(pin)

                         - 用analogRead()读取到的输入值就是0~1023之间的数值

                         - pin = 0~5 / A0~A5

 

模拟输出:analogWrite(pin, outputVal)

                  - pin = 3,5,6,9,10,11(PWM引脚)

                  - outputVal的取值范围:0~255(对应0V~5V)

 

  这里的映射关系比较多,用一个图示说明一下:

  

 

 

 

  这种映射关系可以方便地借助map()函数实现:

 

map(value, fromLow, fromHigh, toLow, toHigh):

  - value : 要处理的数值,在这里就是指模拟输入端读的数值

       - fromLow, fromHigh : 输入的上下限

       - toLow, toHigh : 想要映射到的数值范围的上下限

       - 这里的fromLow和fromHigh,toLow和toHigh没有明确的大小关系。map函数做的只是得到一个把fromLow映射到toLow,fromHigh映射到toHigh的线性映射关系,不在乎toLow和toHigh哪个大哪个小。

       - 返回值:根据得到的线性映射关系将value映射到的那个值

      

  值得注意的是:map()函数并没有限制value的大小必须在fromLow和fromHigh之间,它只是根据得到的线性映射关系来输出一个相对应的值。因此使用map()的时候可能会借助constrain()函数来限制输出值的范围:

constrain(value, min, max) :

       - value < min : return min

       - value > max : return max

       - min <= value <= max : return value

 

posted @   zhuyuxi333  阅读(7059)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示