ADC模數轉換(二) 獨立模式多通道電壓採集實驗

2022-06-24 13:48:09 字數 3662 閱讀 8333

接上篇文章adc模數轉換(一)——獨立模式單通道電壓採集實驗,這篇講了adc的基礎以及獨立模式單通道採集實驗。現在將介紹獨立模式的多通道採集實驗,還會有一篇文章介紹雙重adc模式的採集實驗。

這個實驗和上篇文章相比,只是通道多了,使用了dma代替中斷讀取的方式,所以在上個實驗的基礎上,稍加修改即可。

現在我們需要先確定adc和dma的配置關係。

查閱參考手冊dma篇章可得,adc1對應dma1的通道1,adc3對應dma2的通道5,而adc2則沒有dma功能。如圖22-1,圖22-2。所以,這裡我們選擇adc1,其對應了dma1的通道1。

圖22-1

圖22-2

接下來確定使用adc1的哪些通道。查閱資料手冊(table 5. high-density stm32f103xx pin definitions)可知,pc0~pc3對應adc1/2/3_in10~adc1/2/3_in13,我們就選這4個引腳。然後可以開始配置了。

pc0~pc3四個引腳都需要配置,引腳模式都是模擬輸入。

/**

* @brief adc的gpio配置

* @param 無

* @retval 無

*/static void adc1_gpio_config(void)

包括dma和adc1的配置說明,比較簡單,有關dma也在之前的文章有介紹,所以直接在下面的程式裡通過注釋簡單說明了。

__io uint16_t adc_convertedvalue[4] = ;

/*** @brief adc配置

* @param 無

* @retval 無

*/static void adc1_mode_config(void)

{ /*------------------- dma配置 -------------------*/

dma_inittypedef dma_initstructure;

rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable);

dma_deinit(dma1_channel1); // 復位dma

dma_initstructure.dma_peripheralbaseaddr = (uint32_t)(&(adc1->dr)); // 外設基位址為adc1_dr暫存器位址

dma_initstructure.dma_memorybaseaddr = (uint32_t)adc_convertedvalue; // 記憶體儲存位址,即adc_convertedvalue陣列的首位址

dma_initstructure.dma_dir = dma_dir_peripheralsrc; // 資料**於外設

dma_initstructure.dma_buffersize = 4; // 緩衝區大小,這裡為adc_convertedvalue陣列的長度

dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable; // 只有adc1乙個外設,所以位址不遞增

dma_initstructure.dma_memoryinc = dma_memoryinc_enable; // 記憶體儲存位址遞增

dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_halfword; // 外設資料大小為半字,即兩個位元組

dma_initstructure.dma_memorydatasize = dma_memorydatasize_halfword; // 記憶體儲存大小也為半字,即兩個位元組

dma_initstructure.dma_mode = dma_mode_circular; // 迴圈傳輸

dma_initstructure.dma_priority = dma_priority_high; // dma通道優先順序為高,當使用乙個dma通道時,優先順序設定不受影響

dma_initstructure.dma_m2m = dma_m2m_disable; // 外設到記憶體模式

dma_init(dma1_channel1, &dma_initstructure);

dma_cmd(dma1_channel1, enable);

/*------------------- adc配置 -------------------*/

adc_inittypedef adc_initstruct;

rcc_apb2periphclockcmd(rcc_apb2periph_adc1, enable);

adc_initstruct.adc_mode = adc_mode_independent; // 獨立模式,只使用乙個adc

adc_initstruct.adc_scanconvmode = enable; // 掃瞄模式

adc_initstruct.adc_continuousconvmode = enable; // 連續轉換

adc_initstruct.adc_externaltrigconv = adc_externaltrigconv_none; // 不使用外部觸發,用軟體觸發

adc_initstruct.adc_dataalign = adc_dataalign_right; // 轉換結果右對齊

adc_initstruct.adc_nbrofchannel = 4; // 轉換通道數量

adc_init(adc1, &adc_initstruct);

rcc_adcclkconfig(rcc_pclk2_div8); // 8分頻,9mhz

adc_regularchannelconfig(adc1, adc_channel_10, 1, adc_sampletime_55cycles5); // adc轉換通道10,轉換順序1,取樣週期55.5

adc_regularchannelconfig(adc1, adc_channel_11, 2, adc_sampletime_55cycles5); // adc轉換通道11,轉換順序2,取樣週期55.5

adc_regularchannelconfig(adc1, adc_channel_12, 3, adc_sampletime_55cycles5); // adc轉換通道12,轉換順序3,取樣週期55.5

adc_regularchannelconfig

ADC模數轉換

adc模數轉換 1.1 什麼是adc 1 adc analog digital converter,ad轉換,模數轉換 也就是模擬轉數字 2 ad型別 積分型,逐次比較型,並行比較 序列比較型,調製型,電容陣列逐次比較型,壓頻變換型。2 cpu本身是數字的,而外部世界變數 如電壓 溫度 高度 壓力 ...

ADC模數轉換實驗

1 adc初始化函式adc init 3 adc使能軟體轉換函式 adc softwarestartconvcmd 1 開啟pa口時鐘和adc1時鐘,設定pa1為模擬輸入。gpio init apb2periphclockcmd 2 復位adc1,同時設定adc1分頻因子。rcc adcclkcon...

ADC0809模數轉換

將模擬電壓通過ad轉換,通過at89c51微控制器接數碼管顯示轉換結果。adc0809的晶元介紹 adc0809的晶元簡介 include reg52.h char code shumaguan 16 共陰 define led p0 p1埠控制數碼管段選端 define wei p2 p3埠控制位...