目錄
準(zhǔn)備
配置
步驟
?總結(jié)
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441963.html
準(zhǔn)備
正點(diǎn)原子的STM32F103ZET6開(kāi)發(fā)板(精英版)
CUBEMX配置軟件
KEIL5
配置
?右對(duì)齊就是正常的數(shù)據(jù)格式。左對(duì)齊除以16后得正常數(shù)據(jù)。(當(dāng)輸出非常大時(shí)考慮是否改了對(duì)齊方式,默認(rèn)都是右對(duì)齊)
?掃描模式,連續(xù)轉(zhuǎn)換模式使能。(多通道下掃描模式自動(dòng)使能)
采樣周期 SamplingTime 越大越精確,越小則則會(huì)頻繁觸發(fā)DMA中斷(在開(kāi)啟dma中斷時(shí),我試了在14M的adc時(shí)鐘程序進(jìn)不來(lái)while(因?yàn)轭l繁觸發(fā)DMA中斷)
看數(shù)據(jù)手冊(cè),知道三個(gè)adc中(adc1,adc2,adc3只有adc1和adc3能用DMA通道。
?ADC的時(shí)鐘不能超過(guò)14Mhz,
配置外設(shè)到內(nèi)存(cubeMX自動(dòng)配置好了),外設(shè)adc地址是不變的,而DMA把數(shù)據(jù)存到存儲(chǔ)器的地址是增長(zhǎng)的。
Circular循環(huán)模式連續(xù)搬運(yùn)adc數(shù)據(jù)。
在配置DMA時(shí),因?yàn)閍d的精度是12位,最大也就是4096,而DMA轉(zhuǎn)儲(chǔ)adc是一個(gè)通道接著一個(gè)通道去存儲(chǔ)的,所以轉(zhuǎn)儲(chǔ)的時(shí)候dma搬運(yùn)半字(stm32 32位為一個(gè)字,半字16位 最大位4096*16)就可以了,節(jié)省dma資源提升速度。然后在程序里用一個(gè)緩存為uint16_t去接受就不會(huì)有問(wèn)題。
__IO uint16_t adcbuf[100]={0};
?開(kāi)啟DMA
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adcbuf,100);//
(不推薦的的一種配置,也不是不可以,接受數(shù)據(jù)緩存定義位32位)
?
正常情況下我們還是配置成半字長(zhǎng)的
?
?
?而我走的一個(gè)坑點(diǎn)就adcbuf這個(gè)DMA轉(zhuǎn)移數(shù)據(jù)的緩存數(shù)組定義成立uint32_t,(在dma半字轉(zhuǎn)移下)結(jié)果就翻船。。。
想著不應(yīng)該啊,大類(lèi)型接受小類(lèi)型數(shù)據(jù)C是不會(huì)出問(wèn)題的。
int temp=0;
for (int i=0 ;i < 100; ){
temp=i;
//adcreal[0]+= adcbuf[i++]*3.3/4096;
//adcreal[1]+= adcbuf[i++]*3.3/4096;
printf(" %d-Channel1:%d\r\n", temp,adcbuf[i++]);
printf(" %d-Channel2:%d\r\n",temp ,adcbuf[i++]);
}
依次取兩個(gè)通道的數(shù)據(jù)(i為偶數(shù)是通道1,i為奇數(shù)則是通道二),看串口打印結(jié)果(兩個(gè)通道,一個(gè)接3.3v一個(gè)接5v電壓)
?
?前50是3.3v電壓采集,后50是接地采集結(jié)果,完全亂了。這種情況下把接受類(lèi)型改成uint16_t就解決了。
步驟
定義接受緩存(定義成單字轉(zhuǎn)移)
__IO uint16_t adcbuf[100]={0};
float adcreal[2]={0};
開(kāi)啟接受?
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adcbuf,100);//
打印數(shù)據(jù) (平均濾波)
HAL_Delay(1000);
adcreal[0]=0.0;
adcreal[1]=0.0;
for (int i=0 ;i < 100; ){
adcreal[0]+= adcbuf[i++]*3.3/4096;
adcreal[1]+= adcbuf[i++]*3.3/4096;
}
printf(" -Channel1:%1.3f\r\n",adcreal[0]/50);
printf(" -Channel5:%1.3f\r\n",adcreal[1]/50);
printf("\r\n");
?結(jié)果
?
?總結(jié)
配置時(shí)單字dma轉(zhuǎn)移,uint32_t類(lèi)型定義緩存。
配置時(shí)半字dma轉(zhuǎn)移,uint16_t類(lèi)型定義接受緩存。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-441963.html
?
到了這里,關(guān)于STM32基于hal庫(kù)的adc以DMA的多通道采樣以及所遇問(wèn)題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!