现实生活中大量存在的是模拟量,而数字量则广泛用于计算机系统,为了能测量模拟量(如:电压),通常会使用AD转换器来实现模数转换。Rainbow板载MCU有两个AD转换器,每个转换器支持16个通道进行AD转换,在设计Rainbow开发库的时候,我们只使用了ADC1,可以在以下这16个管脚实现AD转换:
PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PB0, PB1, PC0, PC1,PC2, PC3, PC4, PC5
AD转换的参考电压和MCU的工作电压一致,为3.3V;AD转换器的分辨率是12bit;为了尽可能提高AD转换的准确度,我们采用了多次转换结果求平均值的方式,默认转换10次后求平均值。
使用开发包来进行AD转换非常简单,按照下列步骤即可:
1、将模拟量输入管脚的模式设置为:GPIO_Mode_AIN,如:pinMode(PA4, GPIO_Mode_AIN);
2、调用analogRead()读取指定模拟量的数值
在软件包的“Projects\Analog”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。来看看main.cpp的代码:
#include "WProgram.h"
//模拟量输入的管脚
#define AIN_PIN PA4
void setup()
{
//初始化开发板
boardInit();
Serial.begin();
//设置模拟量输入管脚模式
pinMode(AIN_PIN, GPIO_Mode_AIN);
}
void loop()
{
//读取指定管脚的模拟量值
int16_t val = analogRead(AIN_PIN);
//返回-1表示指定管脚非模拟量输入管脚
if(val < 0)
return;
else
{
Serial.print("Analog Value:");
Serial.println(val);
//每3秒取一次转换结果
delay(3000);
}
}
int main(void)
{
setup();
while(1) loop();
}
程序首先对模拟量输入管脚进行相应模式设置,然后调用analogRead()方法读取模拟值,如果返回-1表示管脚并非ADC模拟量输入通道,有效的模拟量值将通过串口,在上位机中进行显示。
上面的程序编译无误后,将程序烧写到Rainbow中,将USB-TTL模块接入,在上位机上打开串口调试工具。在VCC、GND接入一个电位器,电位器输出接到PA4,然后我们转动电位器到某一个位置,软件将每隔3秒采集一次电压值并输出到串口调试工具。如果要得到相应的电压值,可以用这个公式来求:电压 = value / 4096 * 3.3
