STM32的內(nèi)部自帶12位ADC,其特點如下: (1)12位分辨率,最短時鐘周期為14個,時鐘周期可調(diào),分別可以調(diào)整為14、20、26、41、54、68、252,因此當時鐘為14MHz時候,最快轉(zhuǎn)換時間為1us; (2)供電電壓為2.4V到3.6V,注意stm32的最低供電電壓可以是2V,但是使用ADC時候,必須達到2.4V以上; (3)輸入電壓范圍:0<vin< VCC (4)最小量化單位為:LSB=Vref+/4096mV; (5)為逐次比較型AD; 處理AD轉(zhuǎn)換的方法有兩個:一個是常用的中斷,另一個是DMA,相對來說,DMA模式下的效率要高,所以這里研究DMA下的ADC。 3、實驗目標:通過ADC1的11通道采集外部電壓,然后又DMA傳送到緩存,然后通過串口發(fā)到到PC上。 4、實驗程序:
1. 配置ADC等資源 2. 配置時鐘 3. 參數(shù)配置 點“ADC1”? Mode: 模式為獨立模式。 Dataalignment數(shù)據(jù)對齊:右對齊 ScanConversionMode:掃描轉(zhuǎn)換模式,如果使用了一個ADC下的多個采集通道,需要選擇Enable模式,否則只會轉(zhuǎn)換設置的第一個通道。 ContinuousConversMode連續(xù)轉(zhuǎn)換模式 DiscontinuousConversionMode:不連續(xù)轉(zhuǎn)換模式 NVIC部分開啟DMA中斷,關閉中斷模式的中斷使能。 Memory:勾選此項,轉(zhuǎn)換數(shù)據(jù)將存在Memory中,并且地址自加連續(xù)存放。此功能對某個通道連續(xù)多次采樣很好用,采樣數(shù)據(jù)會自動填滿一個數(shù)組,方便軟件濾波。 Mode:選循環(huán)模式,填滿數(shù)組后自動從頭刷新。 DataWidth數(shù)據(jù)長度:如果是12位AD轉(zhuǎn)換,此處選半字。
4.程序?qū)崿F(xiàn) 在STM32CubeMX生成好的程序基礎上。 在main設置一個uhADCxConvertedValue2的全局變量數(shù)組。類型為Uint16_t。 在main函數(shù)的初始化區(qū)后,while(1)區(qū)前,添加: if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&uhADCxConvertedValue2,100)!=HAL_OK)Error_Handler(); ADC1啟動,并開始連續(xù)轉(zhuǎn)換,轉(zhuǎn)換結果會放在uhADCxConvertedValue2數(shù)組中,大小是100。因為是連續(xù)轉(zhuǎn)換,所以數(shù)組中存放的是最近100次轉(zhuǎn)換結果。
5軟件濾波 濾波子函數(shù):可以計算100個點的濾波結果。 此函數(shù)為中值平均滑動濾波,當然,滑動是ADC的DMA自動實現(xiàn)的。 - uint16_t ADC_Average(__IOuint16_t*buff,uint16_tnum,uint16_tthreshold)
- {
- uint32_tsigma=0;
- uint16_ti=0,j=0,temp=0;
- uint16_ttemp_buff[num];
- for(i=0;i<(num-1);i++)
- {
- for(j=0;j<(num-1);j++)
- {
- if(temp_buff[j]<temp_buff[j+1])
- {
- temp=temp_buff[j];
- temp_buff[j]=temp_buff[j+1];
- temp_buff[j+1]=temp;
- }
- }
- }
- for(i=threshold;i<(num-threshold);i++){
- sigma=sigma+buff[i];
- }
- temp=(uint16_t)(sigma/(num-threshold*2));return(temp);
- }
復制代碼
完整的Word格式文檔51黑下載地址:
|