AB32VG1 有 16 个ADC通道,精度为 10 bit ,且有100k 的内部上拉电阻,其最大采样速度为 78k/s。
为进行A/D采集,可对硬件加以设置,见图1所示,随后在图2的对话框中选取“保存”。
图1 硬件配置
图2 保存配置
由资料可知adc0是与 PA5相对于的,因此在测试过程中将外部的模拟信号连接到该引脚即可。
在编程时,需在程序首部作如下的定义:
#define ADC_DEV_NAME "adc0"
#define ADC_DEV_CHANNEL 0
此外,在程序中还需调用rt_device_find()函数来查找设备以获取设备句柄,调用rt_adc_enable()函数来使能ADC设备,调用rt_adc_read()函数来读取ADC设备及调用rt_adc_ disable ()函数来关闭ADC设备.
结合前面已介绍的OLED屏显示功能,即可将A/D的采样值直接显示出来。
实现数据采集与显示的主程序如下:
int main(void)
{
uint32_t cnt = 0;
rt_adc_device_t adc_dev;
rt_err_t ret = RT_EOK;
rt_uint32_t value_sum,vol,vol_ave,ii;
rt_uint32_t value,CONVERT_BITS=1023;
rt_uint32_t REFER_VOLTAGE=33,
pin = rt_pin_get("PE.1");
rt_pin_mode(pin, PIN_MODE_OUTPUT);
pin_cs = rt_pin_get("PA.0");
pin_scl = rt_pin_get("PE.3");
pin_sda = rt_pin_get("PE.2");
rt_pin_mode(pin_cs, PIN_MODE_OUTPUT);
rt_pin_mode(pin_scl, PIN_MODE_OUTPUT);
rt_pin_mode(pin_sda, PIN_MODE_OUTPUT);
rt_pin_write(pin_cs, PIN_HIGH);
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AB32VG1 RISC-V",16);
OLED_ShowString(0,2,"OLED & A/D",16);
rt_thread_mdelay(2000);
OLED_Clear();
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
OLED_ShowString(0,0,"can't find",16);
while(1);
}
else{
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
}
while(1)
{
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
rt_kprintf("\nthe value is :%d \n", value);
OLED_ShowString(0,2,"value=",16);
OLED_ShowNum(50,2,value,5,16);
vol = value * REFER_VOLTAGE /CONVERT_BITS;
OLED_ShowString(0,0,"voltage= . V",16);
OLED_ShowNum(64,0,vol / 10,1,16);
OLED_ShowNum(80,0,vol % 10,1,16);
rt_pin_write(pin, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(pin, PIN_HIGH);
rt_thread_mdelay(500);
}
}
经程序的编译与下载,其运行效果如图2所示。
图2 运行效果
为了能动态地改变模拟信号量,这里是将电位器连接到PA5,通过调节电位器就可改变采样信号值。此外,为了能直观地读取采集信号的电位值,还通过转换处理完成了电压值的显示。
有了A/D采集功能,我们通过它来连接相应的模拟信号传感器来感知周围环境的状态以便进行相应的处理。
|