过往分享
【国民技术N32项目移植】1. 新建工程+LED与按键跳坑总结
【国民技术N32项目移植】2. 硬件IIC驱动OLED
【国民技术N32项目移植】3. 硬件IIC驱动RT-Thread OS SSD1306软件包
【国民技术N32项目移植】4. 硬件定时器实现2ms定时
前言
本文讲解如何使用N32G45x的ADC。
在N32G45XVL-STB上使用ADC有一个坑, 这也是导致我调试ADC花费了很多时间的原因,关于这部分本文会细说。
本文基于RT-Thread studio开发,搭载RT-Thread OS。
硬件连接
N32G45x有4路ADC,没录ADC有多个通道,可以参考数据手册了解。
我的项目中只会使用到1个ADC,选取了ADC1的IN2,也就是PA1端口作为ADC输入端口。
硬件连接:
ADC1 IN2 - PA1
软件开发
打开配置界面,使能ADC硬件中的ADC1。
使用adc1,channel为2,代码如下:
#include <rtthread.h>
#include <rtdevice.h>
#define ADC_DEV_NAME "adc1"
#define ADC_DEV_CHANNEL 2
#define REFER_VOLTAGE 330
#define CONVERT_BITS (1 << 12)
static int adc_vol_sample(int argc, char *argv[])
{
rt_adc_device_t adc_dev;
rt_uint32_t value, vol;
rt_err_t ret = RT_EOK;
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("adc sample run failed! 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("the value is :%d \n", value);
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
return ret;
}
MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
编译下载之后打开串口调试助手,输入adc_vol_sample就可以采集一次ADC1 IN2的值。
注意:adc_vol_sample后边需要跟一个回车,一起发送,不然不会被识别。
测试效果
代码编写好了之后,直接测试,但是发现不管ADC输入电压是多少,采集出来都是4095或者0。
最开始以为是RT-Thread适配的底层驱动代码初始化有问题,但是梳理了一遍之后没发现有什么问题,然后使用了官方提供的ADC驱动示例下载到板子里面去也是一样的情况。
最后查看了数据手册,发现有VERF+以及VERF-引脚,结合原理图,尝试了将VERF+(VERFP)接3.3V,VERF-(VERFN)接GND,之后才能够正常采集ADC数据了。
怎么说呢?这知道这样设计的目的是什么,但是对使用者而言,确实不便,而且这两个引脚也没有焊接排针,过程简直一言难尽。
下面是测试效果:
|