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


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

    今天发现rt系统的adc有一个缺陷(也可能是我移植的方法有问题,这就不得而知了!),就是只能单次转换,事情是这样的:
    我在stm32的RT-Thread系统bsp上添加了adc相关驱动,但是在写完验证程序在板子上跑的时候,我发现用下面的程序是只会转换一次adc的,也就是说,只会测量第一次的电压值,之后再调用rt_adc_read函数,得到的一直都是第一次的值。

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

    
    #include 
    #include 
    #include 
    #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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

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

    解决之后的程序如下:

    
    #include 
    #include 
    #include 
    #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);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    实验现象:
    adc

  • 相关阅读:
    Java 网络编程
    如何获取淘宝sku详细信息 API接口
    FOR ALL ENTRIES 优化
    leetcode刷题方法总结—数组全解
    第七章:命令行操作基础
    JavaScript设计模式中的单一职责原则
    java 入门-使用eclipse、javaFX、SceneBuilder进行图形界面开发
    Chapter3.2:时域分析法
    Python编程 数值类型 数学计算
    Nginx 核心配置文 nginx.conf介绍
  • 原文地址:https://blog.csdn.net/hhhbdbfb/article/details/132624698