[MCU] 平頭哥RVB2601測評:ADC輪詢單通道與DMA多通道采集

xiyue521 樓主
2021-8-31 22:19

前陣子因為住院還有養傷耽誤了測評太久了,拖更了一個多月。實在不好意思。。。

想想當時是在測評ADC的,然后因為ADCDMA采樣有了疑問就去阿里云提交工單 ,然后就沒有然后了。。

 

    由于ADC沒有文檔介紹也沒有歷程所以就只能靠著他所給的API來用,對照著PWM一步一步的來,

最后還是調通了。也總結了不少技巧,比如他所提供的API前面有static的就是他文件內部是函數,

給自己調用的,到最后就剩下了幾個。比如初始化的,adc通道配置的,adc開始停止的,

adc模式的函數,還有給DMA用的緩沖區還有他相應的配置函數等等。

 

1.內部盜用的API,可以不用管他,剛開始還研究了好久。

static void wj_adc_channel_conv_end_irq(csi_adc_t *adc)

static void wj_adc_irqhandler(void *args)

static csi_error_t wj_adc_start_intr(csi_adc_t *adc)

static csi_error_t wj_adc_start_dma(csi_adc_t *adc)

static csi_error_t wj_adc_stop_intr(csi_adc_t *adc)

static csi_error_t wj_adc_stop_dma(csi_adc_t *adc)

static int adc_channel_delete(uint8_t *channels, uint8_t nums, uint8_t channel)

 

2.ADC初始化,開始停止,通道配置,采樣頻率、時間,回調函數,ADC讀取值等等

 

csi_error_t csi_adc_init(csi_adc_t *adc, uint32_t idx)

void csi_adc_uninit(csi_adc_t *adc)

csi_error_t csi_adc_start(csi_adc_t *adc)

csi_error_t csi_adc_stop(csi_adc_t *adc)

csi_error_t csi_adc_channel_enable(csi_adc_t *adc, uint8_t ch_id, bool is_enable)

csi_error_t csi_adc_channel_sampling_time(csi_adc_t *adc, uint8_t ch_id, uint16_t clock_num)

csi_error_t csi_adc_sampling_time(csi_adc_t *adc, uint16_t clock_num)

uint32_t csi_adc_freq_div(csi_adc_t *adc, uint32_t div)

int32_t csi_adc_read(csi_adc_t *adc)

csi_error_t csi_adc_get_state(csi_adc_t *adc, csi_state_t *state)

uint32_t csi_adc_get_freq(csi_adc_t *adc)

csi_error_t csi_adc_attach_callback(csi_adc_t *adc, void *callback, void *arg)

void csi_adc_detach_callback(csi_adc_t *adc)

csi_error_t csi_adc_start_async(csi_adc_t *adc)

csi_error_t csi_adc_stop_async(csi_adc_t *adc)

csi_error_t csi_adc_continue_mode(csi_adc_t *adc, bool is_enable)

 

3.ADC DMA相關配置函數:

void wj_adc_dma_event_cb(csi_dma_ch_t *dma, csi_dma_event_t event, void *arg)

csi_error_t csi_adc_set_buffer(csi_adc_t *adc, uint32_t *data, uint32_t num)

csi_error_t csi_adc_link_dma(csi_adc_t *adc, csi_dma_ch_t *dma)

 

一、先來說說用查詢的方法對adc單通道采樣的:

創建一個ADC任務

static void adc_task(void *arg)
{
    csi_pin_set_mux(EXAMPLE_ADC_CH0, PA3_ADC_A1);
    csi_adc_init(&adc1, 0);
    uint32_t freq_value = csi_adc_freq_div(&adc1, 128);
    printf("get freq_value: %d\n", freq_value);
    csi_adc_sampling_time(&adc1, 2);
    csi_adc_continue_mode(&adc1, 1);//這句是連續采樣,不使能只能采樣一次
   csi_adc_channel_enable(&adc1, 0, true);

    /*******************/
    while(1)
{
    lv_task_handler();
    aos_msleep(400);
    lv_tick_inc(1);
    i = csi_adc_read(&adc1);
    printf("adc1:%d   ", i);
}
}

image-20210831221047-1.png

 

    二、那怎么用查詢的方法對多通道采樣呢?這個問題開始也是想了很久,因為讀取adc函數就只有一個adc的句柄,這個句柄是初始化函數過來得到的,沒有包含通道的相關操作,這我就聯想到了atm32sac的幾種模式,就是掃描模式,多通道讀取完一個自動對下一個進行讀取,然后我就按照這個

image-20210831221047-2.png

 

   csi_adc_channel_enable(&adc1, 0, true);
   csi_adc_channel_enable(&adc1, 1, true);
   csi_adc_channel_enable(&adc1, 2, true);

  //  注冊了幾個端口,連續讀取三次果然是三個端口的值:

i = csi_adc_read(&adc1);
printf("adc1:%d  ", i);

i = csi_adc_read(&adc1);
printf("adc1:%d  ", i);

i = csi_adc_read(&adc1);
 printf("adc1:%d  ", i);

 

    結果就是依次讀取那個PA3-5adc值。

image-20210831221047-3.png

 

    三、實際上我們比較多用DMA采樣多通道的adc值,這樣可以釋放cpu也可以很好的隨時讀取:

我們加上DMA的配置代碼

csi_adc_set_buffer(&adc1,  buff0,  3);
csi_adc_link_dma( &adc1, &dma1);  
csi_adc_channel_enable(&adc1, 0, true);
csi_adc_channel_enable(&adc1, 1, true);
csi_adc_channel_enable(&adc1, 2, true);
csi_adc_start_async(&adc1);
while(1)
{
    lv_task_handler();
    aos_msleep(400);
    lv_tick_inc(1);
    i=buff0[0];
    printf("adc1:%d   ", i);
    printf("adc1:%d mv\r\n", i * 3300 / 4095);
    i=buff0[1];
    printf("adc1:%d   ", i);
    printf("adc1:%d mv\r\n", i * 3300 / 4095);
    i=buff0[2];
    printf("adc1:%d   ", i);
    printf("adc1:%d mv\r\n", i * 3300 / 4095);

}

image-20210831221047-4.png

 

還可以用搖桿配合舵機來操控哈哈

image.png  

 

 

 

 

回復評論 (4)

沙發 littleshrimp

2021-8-31 22:32

不錯,[大母指]

平頭哥的問題,正常阿里云會受理嗎?

蝦扯蛋,蛋扯蝦,蝦扯蛋扯蝦

板凳 xiyue521

2021-8-31 23:35
引用: littleshrimp 發表于 2021-8-31 22:32 不錯,[大母指] 平頭哥的問題,正常阿里云會受理嗎?

會的,周末不上班,應該兩天的樣子,還可以,就是沒有群交流談論方便

4樓 xiyue521

2021-8-31 23:40

stm32 adc有一處寫錯了

5樓 soso

2021-9-1 09:10

辛苦,注意休息注意身體。

不管是哪年,都要加油!繼續為中國電子行業做出小小的貢獻吧! 扣扣 1206973913

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 京公網安備 11010802033920號
    我也要說兩句
    發送
    評論
    萝卜大香蕉