【中科蓝讯AB32VG1 RISC-V板“碰上”RTT测评】三:ADC外设的使用
[复制链接]
本帖最后由 数码小叶 于 2021-4-18 20:50 编辑
对于ADC,RT-Thread 提供了四个 ADC 设备管理接口函数来访问 ADC 硬件
看上去和之前的按键GPIO一样,这就得益于RT-Thread 提供了一套简单的 I/O 设备模型框架,“I/O 设备管理层实现了对设备驱动程序的封装。应用程序通过 I/O 设备层提供的标准接口访问底层设备,设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。”
对于adc,rt_device_find一般返回值是adc0、adc1。。。使用之前需要确认一下,adc设备是否已经注册到系统中
#define ADC_DEV_NAME "adc0"
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("can't find %s device!\n", ADC_DEV_NAME);
return RT_ERROR;
}
这里新建一个新的adc_a0工程
因为是模板工程,所以ADC是没有打开的,直接使用上面的rt_device_find,肯定会返回RT_ERROR,所以要先打开ADC设备
这样就OK了,先测试一下ADC工作正常不,直接在main线程里添加操作
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("can't find %s device!\n", ADC_DEV_NAME);
return RT_ERROR;
}
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
rt_kprintf("\nthe value is :%d \n", value);
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the vol is :%d \n", vol);
rt_kprintf("the voltage is :%d.%03d \n", vol / 1000, vol % 1000);
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
先拿3v3和GND测试一下测量结果
下载完成后,通过串口界面可以看到测试结果
看着很稳定啊,把结果再精确一位试试,因为这精度应该可以达到0.003
结果还是相当稳定啊,换掉输入源3v3和GND,加上分压来测试下动态电压
可以看到,测量分压的时候,就可以显出精度的跳变了
ADC测试OK,那就可以把这部分写到一个独立的线程里去了,并且把多次测量,求平均加上,最大值最小值暂时就不剔除了
void adc_a0_entry(void *parameter)
{
rt_err_t ret = RT_EOK;
rt_uint32_t value[10], value_sum,vol,vol_ave,ii;
rt_adc_device_t adc_dev;
while(1)
{
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("can't find %s device!\n", ADC_DEV_NAME);
return ;
}
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
for(ii=0;ii<10;ii++)
{
value[ii] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
}
for(ii=0;ii<10;ii++)
{
rt_kprintf("%d;",value[ii]);
}
for(ii=0;ii<10;ii++)
{
value_sum += value[ii];
}
vol_ave =value_sum /10;
vol=vol_ave* REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the vol is :%d \n", vol);
rt_kprintf("the voltage is :%d.%03d \n", vol / 1000, vol % 1000);
value_sum=0;
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
rt_thread_mdelay(1000);
}
}
经过这几次的操作,对于AB32VG1_Register和AB32VG1_DataSheet目前发现的唯一作用,就是让你知道有多少个管脚,每个管脚的作用是啥,除此之外,再也没有其它了。要不是rt_thread封装了底层,这个根本就无法进行任何操作么,AB32VG1_Register 32页和AB32VG1_DataSheet 13页,你想看着手册去操作,完全是不可能的。
|