stm32f303定時器觸發ADC採樣並通過DMA傳輸

最近在做功率計,本來以爲HAL_ADC_Start和Stop一下完事,但是老闆那邊讓我用定時器觸發ADC再DMA傳輸,還得加上串口和can通信,之後通過自帶的運放,做成量程可變的功率計,最後移植到freertos上。

1.TIM+ADC+DMA

我們用ADC的規則通道(注入通道類似),首先要配置它的工作狀態:單通道還是多通道,單次轉換還是連續轉換
在這裏插入圖片描述
這裏我暫時用了ADC1和ADC2,分別一個通道,所以不用開啓掃描模式。如果是多通道,每個通道都要轉換則需要開啓掃描模式。
由於我們需要定時器去觸發ADC轉換,如果是連續模式,定時器觸發一次就不會結束了。要設置成單次模式,定時器觸發一次,轉換一次。
在這裏插入圖片描述
接下來是ADC的時鐘,ADCCLK是由PCLK分頻得到:
在這裏插入圖片描述
在這裏插入圖片描述
配置好後開啓DMA,數據長度可以爲Word或HalfWorld,設置爲circle模式,讓DMA不停搬運
在這裏插入圖片描述
配置高級定時器TIM8的TRGO爲更新事件,設置定時器計數頻率和裝載值
在這裏插入圖片描述
選擇ADC的觸發源爲TIM8 TRGO,並設置採樣週期
在這裏插入圖片描述
生成代碼打開cube,調用初始化函數。

HAL_TIM_Base_Start(&htim8);//開啓定時器
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value1,(uint32_t)AVER*ADC1_CH);//開啓ADC1 DMA1
HAL_ADC_Start_DMA(&hadc2,(uint32_t*)ADC_Value2,(uint32_t)AVER*ADC2_CH);//開啓ADC2 DMA2

對HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc,uint32_t* pData,uint32_t Length)說明:
該函數第一個參數指定了ADC的結構體,第二個指明瞭內存中存放ADC數據的位置,第三個則確定了存放數據的數組長度(若有多個通道,則此數組中數據順序爲ch1,ch2,ch3再ch1,ch2,ch3如此循環。
在這裏插入圖片描述
當你只採用1個ADC掛在一個DMA時一般不會出現什麼問題。當你開了兩個ADC的DMA時,程序可能會卡死,在一直進DMA的中斷,具體原因未知,但和ADCCLK(即分頻係數),AVER(即每個通道採樣個數)和sample time(即每通道採樣時間)有關。
經探究,讓該函數執行的時間越長,越能順利運行,即AVER越大,TCONV越大(每通道採樣時間越長,ADCCLK越小即分頻係數越大)
做ADC相關一定將上述參數調校合適

2.OPAMP

調完再寫

發佈了4 篇原創文章 · 獲贊 3 · 訪問量 701
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章