網(wǎng)站建設(shè)包含哪些網(wǎng)站模板套用教程
關(guān)于使用RT-Thread系統(tǒng)讀取stm32的adc無法連續(xù)轉(zhuǎn)換的問題解決
今天發(fā)現(xiàn)rt系統(tǒng)的adc有一個缺陷(也可能是我移植的方法有問題,這就不得而知了!),就是只能單次轉(zhuǎn)換,事情是這樣的:
我在stm32的RT-Thread系統(tǒng)bsp上添加了adc相關(guān)驅(qū)動,但是在寫完驗證程序在板子上跑的時候,我發(fā)現(xiàn)用下面的程序是只會轉(zhuǎn)換一次adc的,也就是說,只會測量第一次的電壓值,之后再調(diào)用rt_adc_read函數(shù),得到的一直都是第一次的值。
我當(dāng)時的rt應(yīng)用程序如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define ADC_DEV_NAME "adc1" /* ADC 設(shè)備名稱 */
#define ADC_DEV_CHANNEL 6 /* ADC 通道 */
#define REFER_VOLTAGE 330 /* 參考電壓 3.3V,數(shù)據(jù)精度乘以100保留2位小數(shù)*/
#define CONVERT_BITS (1 << 12) /* 轉(zhuǎn)換位數(shù)為12位 */void my_adc_test(void)
{rt_adc_device_t adc_dev; /* ADC 設(shè)備句柄 */rt_uint32_t value;float vol;/* 查找設(shè)備 */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");/* 使能設(shè)備 */rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);while(1){/* 讀取采樣值 */value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);/* 轉(zhuǎn)換為對應(yīng)電壓值 */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);}/* 關(guān)閉通道 */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系統(tǒng)的bsp驅(qū)動并沒有開啟stm32的連續(xù)adc轉(zhuǎn)換。解決辦法只能是每次轉(zhuǎn)換前都失能,使能一次adc。我不可能再去更改bsp驅(qū)動的,因為下一次重新使用env工具一配置,之前寫的都被清除了。所以只能用這種笨的辦法,哪位仁兄有更好的解決辦法可以探討一下哈
解決之后的程序如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define ADC_DEV_NAME "adc1" /* ADC 設(shè)備名稱 */
#define ADC_DEV_CHANNEL 6 /* ADC 通道 */
#define REFER_VOLTAGE 330 /* 參考電壓 3.3V,數(shù)據(jù)精度乘以100保留2位小數(shù)*/
#define CONVERT_BITS (1 << 12) /* 轉(zhuǎn)換位數(shù)為12位 */void my_adc_test(void)
{rt_adc_device_t adc_dev; /* ADC 設(shè)備句柄 */rt_uint32_t value;float vol;/* 查找設(shè)備 */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");/* 使能設(shè)備 */rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);while(1){/* 讀取采樣值 */value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);/* 轉(zhuǎn)換為對應(yīng)電壓值 */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);//加上下面兩行就可以連續(xù)轉(zhuǎn)換rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);}/* 關(guān)閉通道 */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);
實驗現(xiàn)象: