本帖最后由 董董soul 于 2016-10-27 10:52 编辑
前面我们学过了怎样使用ADC获取模拟电压的数值,获取ADC数值其实是把模拟信号转变成数字信号。
模拟信号指幅度的取值是连续的(幅值可由无限个数值表示)。人们说话发出的声音就是一种模拟信号。
数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。二进制码就是一种最常用的数字信号。
二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛的应用。
这节课我们就学一下怎样通过数字引脚来获取数字信号0,1。
在数字通信中我们的0,1信号其实是一个相对量。我们通常会把高于某个阀值的电压信号认定为1,低于某个阀值的电压定义为0。不同供电系统中的阀值都是有区别的,所以一般而言进行数字通信我们都要求通信双方电平是同一系统之内。
我们就在这节课中实际测试一下,在5V电平的MANGO控制板中0,1阀值到底是多少。
获取数字信号我们会用到digitalRead()函数。使用digitalRead()之前,我们需要使用pinMode()把所用引脚初始化为输入状态。
digitalRead()
描述
读取指定引脚的值,HIGH或LOW。
语法
digitalRead(PIN)
参数
pin:你想读取的引脚号(int)
返回
HIGH 或 LOW
为了验证在MANGO中具体是大于多少是1,小于多少是0。我们使用电位器来调节输出的电压,输出引脚接入D5,同时用A0口采集输入的电压大小,通过转动电位器来确定一下电压在什么区间内我们会认为信号为高电平,什么区间内为低电平。如图:
- void setup() {
- pinMode(5, INPUT); //设置引脚5为输入状态
- Serial.begin(9600); //初始化串口,波特率为9600
- }
- void loop() {
- int sensorValue = analogRead(A0); //获取A0口ADC读数,放入变量sensorValue
- int digiValue = digitalRead(5); //获取D5口读数,放入变量digiValue
- Serial.print(digiValue); //输出digiValue
- Serial.print(","); //输出逗号
- Serial.println(sensorValue); //输出sensorValue
- delay(200); //延时200毫秒
- }
复制代码
通过输出数值查看,我们可以粗略的认为ADC数值低于430,也就是低于2.1V MANGO会认为输入的信号为0,ADC数值高于562,也就是2.75V MANGO会认为输入的信号为1。因为USB供电不是精准的5V,外加delay(200)之后刷新率比较低,电位器漂移等,上面的结果不是很准确,但是也可以说明大概情况了。
|