tag 标签: ADC获取电压值

相关博文
  • 2024-1-13 19:54
    387 次阅读|
    0 个评论
    开发环境: IDE:RT-Thread Studio 2.2.7 开发板:HPM5300EVK 1 RT-Thread 的ADC简介 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 A/D转换主要包括两个内容:采样保持和量化编码,将一个模拟信号进行采样,得到的样点转化为数字量,这是整个A/D转换过程的核心,量化编码分为好多算法,这里不深入研究了。ADC主要参数如下: 1.分辨率 AD转换器输出的数字量的最低位变化一个数时,对应输入模拟量的变化量,A/D转换器的位数越多,能够分辨的最小模拟电压值就越小,分辨率就越大,GD32的A/D转换器是12位的,位数越多,表示分辨率越高,恢复模拟信号时会更精确。 2.相对精度 A/D转换器实际输出数字量与理论值之间的最大差值称为相对精度。 3.转换速度 A/D转换器完成一次转换所需要的时间,一般是us级别的。 应用程序通过 RT-Thread 提供的 ADC 设备管理接口来访问 ADC 硬件,相关接口如下所示: 函数 描述 rt_device_find() 根据ADC设备名称查找设备获取设备句柄 rt_adc_enable() 使能ADC设备 rt_adc_read() 读取ADC设备数据 rt_adc_disable() 关闭ADC设备 关于ADC的更多资料请参看RT-Thread官方手册: https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/adc/adc 2 ADC代码实现 HPM5300EVK有 2个 ADC,精度为 16 位。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 笔者这里使用ADC0的通道11,也就是PB11。 接下来配置ADC,只需要简单配置就可使用,当然也可使用其他ADC。这这里使用的是ADC0。 在applications文件夹下新建task.c文件。笔者这里使用的通道9,核心代码如下: / ** ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** * @file task.c * @author BruceOu * @version V1.0 * @date 2023-12-03 * @blog https://blog.bruceou.cn/ * @Official Accounts 嵌入式实验楼 * @Brief RTT任务 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ** */ /* Includes** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** / #include < rtthread.h #include < rtdevice.h #include "rtt _board.h" #ifdef BSP_ USING _ADC12 #include "hpm_ adc12 _drv.h" #endif #ifdef BSP_ USING _ADC16 #include "hpm_ adc16 _drv.h" #endif #define ADC_ DEV _NAME "adc0" /* ADC 设备名称 */ #define ADC_ DEV _CHANNEL 11 /* ADC 通道 */ #define REFER_ VOLTAGE 330 / * 参考电压 3.3V,数据精度乘以100保留2位小数* / #ifdef BSP _USING_ ADC16 #define CONVERT _BITS (1 << 16) /*16 bit*/ #endif #ifdef BSP_ USING _ADC12 #define CONVERT_ BITS (1 << 12) / *162 bit* / #endif 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 命令列表中 */ MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample); 编译下载,调试信息如下: 从以上打印信息可以看出,adc0已经使能,然后使用MSH命令‘adc_vol_sample’即可使能ADC线程。 笔者这里将PB08接到3.3V电压上,和实际的电压是相符的。