1.前言

    还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化。在Arduino中,常用0~5v的电压来表示模拟信号。

1.1 模拟输入功能

    在Arduino,编号前带有“A”的引脚是模拟输入引脚,Arduino可以读取这些引脚上输入的模拟值,也就是可以读取引脚上输入的电压大小。
    模拟输入引脚带有ADC功能(ADC:Analog-to-Digital Converter 模数转换)。它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读取模拟值的功能。

  • 使用AVR芯片的Arduino模拟输入功能有10位精度,意味着0~5V电压会转换成0~1023的整数形式表示。

    模拟输入功能需要使用analogRead(pin)函数,其中pin是读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。

1.2 模拟输出功能

    要使用analogWrite()函数来实现模拟输出功能。

注意:

  • 该函数并不是输出真正意义上的模拟值,而是以一种特殊的方式来达到输出模拟值的效果,也就是我们经常听到的“PWM”(脉冲宽度调制 Pulse Width Modulation)。

    当使用analogWrite函数,指定引脚会通过高低电平的不断转换来输出一个周期固定(约490Hz)的方波,通过改变高低电平在每个周期中所占比例(占空比),而得到近似输出不同电压的效果。

    analogWrite(pin,value):参数pin为要输出的PWM波的引脚,参数value是PWM的脉冲宽度,范围为0~255。
    大多数Arduino控制器的PWM引脚都会用“~”标识,可以查看一下自己的板子。常见几款板子PWM引脚为:

    基础知识介绍好了,那么就开始接下来的实验了。

2.实验内容

    主要实现两个实验内容:

  • 固定呼吸灯
  • 可调呼吸灯

2.1 固定呼吸灯

实验介绍:
    将LED连接到PWM引脚,主要利用模拟输出功能 analogWrite 函数输出电压,呼吸频率固定。

实验代码:

/**
* @Desc  固定呼吸灯
* @author 单片机菜鸟
* @Date  2016/12/8
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/

#define LED 9
#define DELAY_TIME 30 //延时时间

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  //从暗到亮,每次亮度值加5,直到最亮
  for(int fadeValue = 0;fadeValue<=255;fadeValue+=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     delay(DELAY_TIME);
  }

  //从亮到暗 每次亮度-5直到最暗
  for(int fadeValue=255;fadeValue>=0;fadeValue-=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     delay(DELAY_TIME);
  }
}

2.2 可调呼吸灯

实验介绍:
    在固定呼吸灯基础上,通过读入的模拟电压大小(模拟输入我们采用一个电位器来分压)来调整频率,同时利用analogRead以及analogWrite函数。

实验代码:

/**
* @Desc  可调呼吸灯
* @author 单片机菜鸟
* @Date  2016/12/8
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/

#define LED 9

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  //从暗到亮,每次亮度值加5,直到最亮
  for(int fadeValue = 0;fadeValue<=255;fadeValue+=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     int delaytime = analogRead(A0)/5;//读取电位器输出电压 用于延时
     delay(delaytime);
  }

  //从亮到暗 每次亮度-5直到最暗
  for(int fadeValue=255;fadeValue>=0;fadeValue-=5){
     //输出PWM
     analogWrite(LED,fadeValue);
     //延时一下
     int delaytime = analogRead(A0)/5;
     delay(delaytime);
  }
}

    当然,上面电位器可以换成光敏电阻之类的,这样就可以考虑做一个晚上呼吸白天熄灭的呼吸灯。

3.总结

    这一课,相对很简单,我们主要学习模拟IO口的使用。以后当我们遇到光敏电阻、热敏电阻、温度传感器、气体传感器之类的可以产生模拟信号的,就应该想到模拟IO口了。

最新文章

  1. Sql Server分割字符串函数
  2. Incorrect string value异常解决
  3. HDU 5234 DP背包
  4. centeros iptable模板文件
  5. 单词游戏-基于SQLite+Qt的C++项目
  6. 1.5.6 Filters
  7. 跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量
  8. ll 命令不好用了,ls 命令没有颜色了怎么办
  9. C与C++不同
  10. nginx的 CPU参数worker_processes和worker_cpu_affinity使用说明
  11. POJ 2977 Box walking
  12. HUST - 1599 Multiple
  13. 新手如何快速入门Python
  14. 20164304姜奥——Exp1 PC平台逆向破解
  15. MySQL基于ROW格式的数据恢复
  16. Python 词典增加和删除
  17. Spring@Autowired注解与自动装配(转发)
  18. luogu P1593 因子和
  19. winbox添加dhcp和nat
  20. WAS6.1连接SQL Server2008数据库连接池配置

热门文章

  1. C#基础知识总结(二)--泛型
  2. 译 .NET Core 3.0 发布
  3. uboot学习之uboot启动流程简述
  4. 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵、服务器 CPU 100%、被 DDoS 攻击
  5. .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础
  6. 编程范式 --- 面向协议编程(Protocol Oriented Programming,简称POP)
  7. pycharm远程代码调试
  8. gcc编译命令总结
  9. aapt的具体使用
  10. Spring BeanDefinition的加载