做企业网站设计与实现,阳江公司网站建设,安徽谷歌seo,西安网站建设哪家专业关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决
今天发现rt系统的adc有一个缺陷#xff08;也可能是我移植的方法有问题#xff0c;这就不得而知了#xff01;#xff09;#xff0c;就是只能单次转换#xff0c;事情是这样的#xff1a; 我在stm32的RT-T…关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决
今天发现rt系统的adc有一个缺陷也可能是我移植的方法有问题这就不得而知了就是只能单次转换事情是这样的 我在stm32的RT-Thread系统bsp上添加了adc相关驱动但是在写完验证程序在板子上跑的时候我发现用下面的程序是只会转换一次adc的也就是说只会测量第一次的电压值之后再调用rt_adc_read函数得到的一直都是第一次的值。
我当时的rt应用程序如下 #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_devRT_NULL){rt_kprintf(cant 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工具一配置之前写的都被清除了。所以只能用这种笨的办法哪位仁兄有更好的解决办法可以探讨一下哈
解决之后的程序如下 #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_devRT_NULL){rt_kprintf(cant 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);
实验现象