一、(單通道)使用定時(shí)器觸發(fā)的ADC單通道轉(zhuǎn)換
我用的單片機(jī)是STM32F103CBTX
- 定時(shí)器:使用PWM輸出的模式
- ADC:使用DMA的模式(在不使用DMA的情況下,定時(shí)器控制ADC進(jìn)行數(shù)據(jù)采集只能是單通道!如果開啟了多通道,讀取到的ADC采集值只會是最后一個(gè)通道的值!所以,要想使用定時(shí)器控制ADC采集多通道,必須使用DMA?。?/li>
定時(shí)器中cubemx配置:
?看STM32F103數(shù)據(jù)手冊可以知道定時(shí)器TIM1是掛在APB1總線上
我使用的是TIM1的通道2的上升沿(即PWM輸出)觸發(fā)ADC采樣?
PWM模式1和模式2區(qū)別:
以下是使用邏輯分析儀觀察到的PWM輸出情況
ADC中cubemx配置:?
注意:此時(shí)不再需要ADC進(jìn)行轉(zhuǎn)換,把連續(xù)轉(zhuǎn)換模式設(shè)為關(guān)閉!?。?/strong>
(我自己踩的坑,我試過開啟的時(shí)候程序死掉了)
DMA模式選擇:?
Circular模式:
就是ADC連續(xù)采樣的意思,也就是HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4)這句代碼在程序中開啟一次即可,不需要每次都重新打開。
Normal模式:
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4)執(zhí)行完一次之后,如果想進(jìn)行下一輪ADC采樣,必須要重新開啟,所以每一輪采樣都要用一次這句代碼,采樣一次開啟一次采樣一次開啟一次。
參考別人的試了用了Circular模式,完全沒問題,可以成功測出電壓值。
我自己也試了Normal模式,不行,只能測一次,后面沒反應(yīng)了。
?代碼:
uint8_t AdcConvEnd=0;
int main()
{
uint16_t ADC_Value[4]= 0;
HAL_TIM_Base_Start(&htim1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_ADCEx_Calibration_Start(&hadc1);//自動校準(zhǔn)
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4);
while(1)
{
if(AdcConvEnd)
{
uint16_t averageValue = 0;
for(int i = 0; i < 4; i++)
{
averageValue += ADC_Value[i];
printf("ADC_Value[%d]:%.3f\r\n",i,(float)ADC_Value[i]*3.3f/4096);
}
AdcConvEnd=0;
averageValue/=4;
printf("averageValue:%d\r\n",averageValue);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc==&hadc1)
{
AdcConvEnd=1;
}
}
結(jié)果:
二、(雙通道)使用定時(shí)器觸發(fā)的ADC雙通道轉(zhuǎn)換?
注意:因?yàn)槲覀冊O(shè)置的是 2 個(gè)通道的采集,所以應(yīng)該使能 ADC 的掃描模式,另一方面,我們采用的是 TIM 產(chǎn)生 pwm 觸發(fā) adc 進(jìn)行采集,所以要禁止 ADC 的連續(xù)轉(zhuǎn)換模式,這就是兩個(gè)需要注意的地方。
ADC中cubemx配置:?
三、關(guān)于PWM的頻率或周期的計(jì)算
*注 :* ARR和PSC都是16位的寄存器, 數(shù)值一定要在0~65535這個(gè)范圍。
當(dāng)我們設(shè)置了當(dāng)前機(jī)器設(shè)置的是 72MHZ和?72分頻,定時(shí)器輸入時(shí)鐘頻率是72MHz / 72 = 1MHz:
- 1MHZ ,即1秒計(jì)數(shù) 1M 次=1000000 次(1s產(chǎn)生1000000個(gè)脈沖方波)。
- 1MHZ ,也就是1us產(chǎn)生1個(gè)脈沖方波。
若重裝載值 (Period 或 ARR)設(shè)置為 500。也就是0.1us*500=500us,對于當(dāng)前 PWM 周期為 500us,也就是500us發(fā)生一次中斷。
當(dāng)重裝載值(Period 或 ARR)設(shè)置為 500 時(shí),意味著定時(shí)器需要計(jì)數(shù) 500 個(gè)時(shí)鐘周期才會觸發(fā)中斷。因此,中斷發(fā)生的周期是 500us(即500 * 1us)
若Pulse設(shè)為250,即占空比=Pulse/ARR=250/500=50%
四、寄存器TIMx_ARR、TIMx_CCRx 、TIMx_CNT
以向上計(jì)數(shù)為例,重載值為ARR,比較值為CRRx
上圖可以看出:
- 0-t1段,定時(shí)器計(jì)數(shù)器TIMx_CNT值小于CCRx值,輸出低電平。
- t1-t2段,定時(shí)器計(jì)數(shù)器TIMx_CNT值大于CCRx值,輸出高電平。
當(dāng)TIMx_CNT值達(dá)到ARR時(shí),定時(shí)器溢出,重新向上計(jì)數(shù)...循環(huán)此過程至此一個(gè)PWM周期完成。
上圖更加形象的說明了
信號頻率由?TIMx_ARR?寄存器值決定。
占空比則由?TIMx_CCRx?寄存器值決定。
參考:
STM32 HAL庫:ADC+DMA應(yīng)用(連續(xù)采樣、觸發(fā)采樣)_hal adc dma-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-846180.html
【STM32】定時(shí)器TIM觸發(fā)ADC采樣,DMA搬運(yùn)到內(nèi)存(超詳細(xì)講解)-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-846180.html
到了這里,關(guān)于定時(shí)器(PWM輸出)觸發(fā)ADC采樣(DMA)——STM32CubeMX的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!