日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HAL驱动库学习-ADC

發(fā)布時(shí)間:2024/10/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HAL驱动库学习-ADC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如何使用ADC驅(qū)動(dòng)庫 1 ?實(shí)現(xiàn)如下兩個(gè)函數(shù) a: HAL_ADC_MspInit()使能ADC時(shí)鐘,設(shè)置時(shí)鐘源, 使能ADC Pin,設(shè)置為輸入模式,可選 DMA,中斷 b:HAL_ADC_MspDeInit() 與?HAL_ADC_MspInit()作用相反,用來關(guān)閉ADC,可選 DMA,中斷 2 ?配置ADC參數(shù),詳細(xì)參數(shù)描述參考ADC屬性定義。通過HAL_ADC_Init()來加載參數(shù) 3 ?配置ADC通道,包括使用的通道,采樣時(shí)間等?HAL_ADC_ConfigChannel() 4 ?校準(zhǔn)ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校準(zhǔn)),必須在ADC轉(zhuǎn)換啟動(dòng)前或停止后 5 ?使用下面函數(shù)中的一個(gè)激活A(yù)DC外設(shè): HAL_ADC_Start() -- 輪詢模式 HAL_ADC_Start_IT(), -- 中斷模式 HAL_ADC_Start_DMA(). -- DMA模式 ADC屬性定義
? uint32_tClockPrescaler--時(shí)鐘源,同步PLL,異步HSI ADC_CLOCK_ASYNC,ADC_CLOCK_SYNC_PCLK_DIV2,ADC_CLOCK_SYNC_PCLK_DIV4,ADC_CLOCKPRESCALER_PCLK_DIV2,ADC_CLOCKPRESCALER_PCLK_DIV4 ? uint32_tResolution -- ADC分辨率(6,8,10,12)ADC_RESOLUTION12b........ ? uint32_tDataAlign --數(shù)據(jù)對(duì)齊方式(左,右)ADC_DATAALIGN_LEFT, ADC_DATAALIGN_RIGHT ? uint32_tScanConvMode--配置規(guī)則組序列,該參數(shù)可以關(guān)聯(lián)“DiscontinuousConvMode”對(duì)主序列細(xì)分,如果設(shè)置多個(gè)通道則序列自動(dòng)使能;如果只有一個(gè)通道,執(zhí)行單一轉(zhuǎn)換模式;如果有多個(gè)通道,執(zhí)行序列轉(zhuǎn)換模式;Rank(隊(duì)列)定義為通道號(hào),rank0->channel0,rank1-->channel1.....;掃描方向可以遞增(0-->18)或遞減(18-->0)ADC_SCAN_DIRECTION_FORWARD,ADC_SCAN_DIRECTION_BACKWARD,ADC_SCAN_ENABLE ? uint32_tEOCSelection -- EOC(EndOfConversion),用來做輪詢或中斷標(biāo)記;每個(gè)rank轉(zhuǎn)換結(jié)束,或序列轉(zhuǎn)換結(jié)束;EOC_SINGLE_CONV,EOC_SEQ_CONV,EOC_SINGLE_SEQ_CONV(保留供以后用) ? uint32_tLowPowerAutoWait ? uint32_tLowPowerAutoPowerOff ? uint32_tContinuousConvMode --定義當(dāng)選擇的觸發(fā)事件(軟件觸發(fā) or 外部觸發(fā))發(fā)生后規(guī)則組執(zhí)行單一轉(zhuǎn)換還是連續(xù)轉(zhuǎn)換 ENABLE or DISABLE ? uint32_tDiscontinuousConvMode---指定當(dāng)規(guī)則組是完整序列/非連續(xù)序列(序列分布在)時(shí)是否轉(zhuǎn)換序列;只有在Continuous禁用時(shí),DisContinuous才有效;如果ContinuousConvMode使能,則該參數(shù)拋棄 ? uint32_tExternalTrigConv --觸發(fā)方式 ADC_SOFTWARE_START 外部觸發(fā)禁止,使用軟件觸發(fā) ? uint32_tExternalTrigConvEdge --外部觸發(fā)規(guī)則,ADC_EXTERNALTRIGCONVEDGE_NONE,ADC_EXTERNALTRIGCONVEDGE_RISING,ADC_EXTERNALTRIGCONVEDGE_FALLING,ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING ? uint32_tDMAContinuousRequests--//DMA轉(zhuǎn)換請求,指定DMA執(zhí)行單次(當(dāng)轉(zhuǎn)換數(shù)達(dá)標(biāo)時(shí)停止傳送)or連續(xù)請求模式;備注:連續(xù)模式: //DMA必須配置為循環(huán)模式,否則當(dāng)DMA buffer存滿時(shí)將觸發(fā)溢出; ENABLE or DISABLE ? uint32_tOverrun--選擇數(shù)據(jù)溢出時(shí)的行為:保存數(shù)據(jù)或覆蓋數(shù)據(jù);這個(gè)參數(shù)只作用于規(guī)則組,包含DMA

?

說明:
ContinuousConvModeDiscontinuousConvMode 通道結(jié)束序列結(jié)束  
DISABLEDISABLE單次轉(zhuǎn)換EOCEOS單次轉(zhuǎn)換觸發(fā)一次,轉(zhuǎn)換一個(gè)序列(轉(zhuǎn)換所有被選通道),轉(zhuǎn)換結(jié)束后停止
ENABLE無效連續(xù)轉(zhuǎn)換EOCEOS連續(xù)轉(zhuǎn)換觸發(fā)一次,轉(zhuǎn)換一個(gè)序列(轉(zhuǎn)換所有被選通道),轉(zhuǎn)換結(jié)束后自動(dòng)重新開始
DISABLEENABLE斷續(xù)轉(zhuǎn)換EOCEOS斷續(xù)轉(zhuǎn)換觸發(fā)一次,轉(zhuǎn)換一個(gè)通道,在觸發(fā),在轉(zhuǎn)換。在所選轉(zhuǎn)換通道循環(huán)
ADC方法: 1 ?初始化函數(shù) a ?自定義初始化??????????? HAL_ADC_Init() 用戶自行調(diào)用 加載ADC屬性HAL_ADC_MspInit() 由HAL_ADC_Init()調(diào)用,對(duì)底層初始化,主要包括時(shí)鐘,IO,DMA等

? ?? ? ?b 缺醒初始化???

HAL_ADC_DeInit() 用戶自行調(diào)用,退出ADCHAL_ADC_MspDeInit() 由 HAL_ADC_DeInit()調(diào)用,操作底層,關(guān)閉時(shí)鐘,IO等

??? 2 ? IO操作函數(shù)(輪詢,中斷,DMA 3中編程模型)

? ? ? ? a ?激活A(yù)DC,啟動(dòng)轉(zhuǎn)換規(guī)則組??????????? ? HAL_ADC_Start()? HAL_ADC_Start_IT() 中斷模式ADC_EOC_SINGLE_CONV通道轉(zhuǎn)換結(jié)束,EOC_SEQ_CONV序列轉(zhuǎn)換結(jié)束? HAL_ADC_Start_DMA()

???????? b ?關(guān)閉ADC,停止轉(zhuǎn)換規(guī)則組

? HAL_ADC_Stop()? HAL_ADC_Stop_IT()? HAL_ADC_Stop_DMA() ? ??? ? C ?讀取ADC值 ?????????????? ?HAL_ADC_GetValue() ? ??? ? d ?其他 ? HAL_ADC_PollForConversion() 等待轉(zhuǎn)換結(jié)束,不適用一下情況:DMA模式且輪詢每個(gè)轉(zhuǎn)換(ADC_EOC_SINGLE_CONV) ? HAL_ADC_PollForEvent() ? HAL_ADC_IRQHandler() ADC中斷請求,在<stm32fxx_it.c>中調(diào)用 // 回調(diào)函數(shù),“weak”屬性,使用時(shí)再在應(yīng)用代碼中實(shí)現(xiàn) ? HAL_ADC_ConvCpltCallback() 轉(zhuǎn)換完成后回調(diào),DMA模式下DMA傳輸完成后調(diào)用 ? HAL_ADC_ConvHalfCpltCallback() 轉(zhuǎn)換過程中回調(diào) ? HAL_ADC_LevelOutOfWindowCallback() ? HAL_ADC_ErrorCallback()

????3 ?外設(shè)控制函數(shù)--動(dòng)態(tài)配置外設(shè)參數(shù)

? ??? ?HAL_ADC_ConfigChannel() ?配置規(guī)則組通道 ? ??? ??? ??? ?HAL_ADC_AnalogWDGConfig() ? ?4 ?狀態(tài)函數(shù)--返回運(yùn)行狀態(tài)獲取錯(cuò)誤信息 ? ??? ??? ??? ?HAL_ADC_GetState() ? ??? ??? ??? ?HAL_ADC_GetError() 例子,ADC工作狀態(tài)均為非阻塞? 1 ?輪詢模式?-- 非阻塞 ? ? /*##-3- Start the conversion process ######/ if(HAL_ADC_Start(&AdcHandle) != HAL_OK) { Error_Handler(); } /*##-4- Wait for the end of conversion ######/ HAL_ADC_PollForConversion(&AdcHandle, 10); if(HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG) { /*##-5- Get the converted value of channel ##*/ uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle); }

???? 2 ?中斷模式

/*##-3- Start the conversion process ######/ if(HAL_ADC_StartIT(&AdcHandle) != HAL_OK) { Error_Handler(); } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle) { /* Get the converted value of regular channel */ uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle); }

???? 3 ?DMA模式

/*##-3- Start the conversion process ######/ if(HAL_ADC_StartDMA(&AdcHandle,&uhADCxConvertedValue,1) != HAL_OK) { Error_Handler(); } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle) { /* Turn LED1 on: Transfer process is correct */ BSP_LED_On(LED1); }

使用stm32cubemx設(shè)置

? ? ?? 收集 數(shù)組設(shè)置???
  • 更進(jìn)一步將if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&uhADCxConvertedValue,1)!= HAL_OK),中的1改成6,然后將轉(zhuǎn)換后的存儲(chǔ)變量定義為二維數(shù)組uhADCxConvertedValue[2][3];再觀察串口輸出的情況如下:v
  • alue[0][0] is 0 value[0][1] is 255 value[0][2] is 255 value[1][0] is 0 value[1][1] is 255 value[1][2] is 255 value[0][0] is 0 value[0][1] is 255 value[0][2] is 255 value[1][0] is 0 value[1][1] is 255 value[1][2] is 255 value[0][0] is 0 value[0][1] is 255 value[0][2] is 255 value[1][0] is 1 value[1][1] is 255 value[1][2] is 255

    ?

  • 這樣就是把第一次掃描轉(zhuǎn)換的三個(gè)通道值存在數(shù)組的第一行的三個(gè)元素中,第二次掃描轉(zhuǎn)換的值放在第二行的三個(gè)元素中。這樣就可以方便后面的數(shù)字濾波處理了。
  • 來源:?<http://www.stm32cube.com/question/16> ?



    來自為知筆記(Wiz)



    轉(zhuǎn)載于:https://www.cnblogs.com/cat-li/p/4982510.html

    總結(jié)

    以上是生活随笔為你收集整理的HAL驱动库学习-ADC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。