关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

今天发现rt系统的adc有一个缺陷(也可能是我移植的方法有问题,这就不得而知了!),就是只能单次转换,事情是这样的:

我在stm32的RT-Thread系统bsp上添加了adc相关驱动,但是在写完验证程序在板子上跑的时候,我发现用下面的程序是只会转换一次adc的,也就是说,只会测量第一次的电压值,之后再调用rt_adc_read函数,得到的一直都是第一次的值。

我当时的rt应用程序如下:

c 复制代码
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define ADC_DEV_NAME        "adc1"  /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     6       /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */

void my_adc_test(void)
{
	rt_adc_device_t adc_dev;            /* ADC 设备句柄 */
	rt_uint32_t value;
	float vol;
	
	/* 查找设备 */
	adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
	if(adc_dev==RT_NULL)
	{
		rt_kprintf("can't find adc!\r\n");
		return;
	}
	rt_kprintf("find adc successfully!\r\n");

	/* 使能设备 */
	rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

	while(1)
	{
		/* 读取采样值 */
		value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
		/* 转换为对应电压值 */
		vol = (float)value * REFER_VOLTAGE / CONVERT_BITS;
		rt_kprintf("the voltage is :%d.%02d \n", (int)vol / 100, (int)vol % 100);
		rt_kprintf("value=%d\r\n",value);
		rt_thread_delay(500);
	}
	/* 关闭通道 */
	rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
}

void show_adc1_pin(void)
{
	rt_kprintf("\r\n");
	rt_kprintf("The adc1 pins:\r\n");
	rt_kprintf("IN6--->A6\r\n");
	rt_kprintf("IN7--->A7\r\n");
	rt_kprintf("IN8--->B0\r\n");
	rt_kprintf("IN9--->B1\r\n");
}
MSH_CMD_EXPORT(show_adc1_pin, show_adc1_pin);

很明显,RT-Thread系统的bsp驱动并没有开启stm32的连续adc转换。解决办法只能是每次转换前都失能,使能一次adc。我不可能再去更改bsp驱动的,因为下一次重新使用env工具一配置,之前写的都被清除了。所以只能用这种笨的办法,哪位仁兄有更好的解决办法可以探讨一下哈

解决之后的程序如下:

c 复制代码
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define ADC_DEV_NAME        "adc1"  /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     6       /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */

void my_adc_test(void)
{
	rt_adc_device_t adc_dev;            /* ADC 设备句柄 */
	rt_uint32_t value;
	float vol;
	
	/* 查找设备 */
	adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
	if(adc_dev==RT_NULL)
	{
		rt_kprintf("can't find adc!\r\n");
		return;
	}
	rt_kprintf("find adc successfully!\r\n");

	/* 使能设备 */
	rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

	while(1)
	{
		/* 读取采样值 */
		value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
		/* 转换为对应电压值 */
		vol = (float)value * REFER_VOLTAGE / CONVERT_BITS;
		rt_kprintf("the voltage is :%d.%02d \n", (int)vol / 100, (int)vol % 100);
		rt_kprintf("value=%d\r\n",value);
		rt_thread_delay(500);
		
		//加上下面两行就可以连续转换
		rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
		rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
	}
	/* 关闭通道 */
	rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
}

void show_adc1_pin(void)
{
	rt_kprintf("\r\n");
	rt_kprintf("The adc1 pins:\r\n");
	rt_kprintf("IN6--->A6\r\n");
	rt_kprintf("IN7--->A7\r\n");
	rt_kprintf("IN8--->B0\r\n");
	rt_kprintf("IN9--->B1\r\n");
}

MSH_CMD_EXPORT(show_adc1_pin, show_adc1_pin);

实验现象:

相关推荐
dlwlrma_5163 小时前
NUCLEO-G0B1RE STM32G0B1RET6的学习(1)——STM32CubeIDE的安装、新建工程和配置硬件SPI
stm32
weixin_427771613 小时前
css font-size 的妙用
前端·css
凤凰战士芭比Q4 小时前
web中间件——Nginx
前端·nginx·中间件
三品吉他手会点灯4 小时前
stm32f103学习笔记-16-RCC(第2节)-讲解系统时钟配置函数SetSysClockTo72()
笔记·stm32·单片机·嵌入式硬件·学习
一 乐4 小时前
点餐|智能点餐系统|基于java+ Springboot的动端的点餐系统小程序(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·小程序·论文
视图猿人4 小时前
RxJS基本使用及在next.js中使用的例子
开发语言·javascript
bitbitDown5 小时前
从零打造一个 Vite 脚手架工具:比你想象的简单多了
前端·javascript·面试
liangshanbo12155 小时前
CSS 数学函数完全指南:从基础计算到高级动画
前端·css
码上成长6 小时前
GraphQL:让前端自己决定要什么数据
前端·后端·graphql
冴羽6 小时前
为什么在 JavaScript 中 NaN !== NaN?背后藏着 40 年的技术故事
前端·javascript·node.js