新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 經(jīng)典_STM32_ADC多通道采樣的例子

經(jīng)典_STM32_ADC多通道采樣的例子

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏



ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC_ResetCalibration(ADC1); //復(fù)位指定的ADC1的校準(zhǔn)寄存器

while(ADC_GetResetCalibrationStatus(ADC1)); //獲取ADC1復(fù)位校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待


ADC_StartCalibration(ADC1); //開(kāi)始指定ADC1的校準(zhǔn)狀態(tài)

while(ADC_GetCalibrationStatus(ADC1)); //獲取指定ADC1的校準(zhǔn)程序,設(shè)置狀態(tài)則等待


}


void DMA_Configuration(void)
{

DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1); //將DMA的通道1寄存器重設(shè)為缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外設(shè)ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMA內(nèi)存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //內(nèi)存作為數(shù)據(jù)傳輸?shù)哪康牡?br />DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA緩存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)地址寄存器不變
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存地址寄存器遞增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //數(shù)據(jù)寬度為16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //數(shù)據(jù)寬度為16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循環(huán)緩存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x擁有高優(yōu)先級(jí)
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒(méi)有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏?br />DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道

}


//配置所有外設(shè)
void Init_All_Periph(void)
{

RCC_Configuration();

GPIO_Configuration();

ADC1_Configuration();

DMA_Configuration();

//USART1_Configuration();
USART_Configuration(9600);


}



u16 GetVolt(u16 advalue)

{

return (u16)(advalue * 330 / 4096); //求的結(jié)果擴(kuò)大了100倍,方便下面求出小數(shù)

}




void filter(void)
{
int sum = 0;
u8 count;
for(i=0;i<12;i++)

{

for ( count=0;count
{

sum += AD_Value[count][i];

}

After_filter[i]=sum/N;

sum=0;
}

}




int main(void)
{

u16 value[M];

init_All_Periph();
SysTick_Initaize();


ADC_SoftwareStartConvCmd(ADC1, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE); //啟動(dòng)DMA通道
while(1)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待傳輸完成否則第一位數(shù)據(jù)容易丟失

filter();
for(i=0;i<12;i++)
{
value[i]= GetVolt(After_filter[i]);

printf("value[%d]:t%d.%dvn",i,value[i]/100,value[i]0) ;
delay_ms(100);
}
}

}
總結(jié)
該程序中的兩個(gè)宏定義,M和N,分別代表有多少個(gè)通道,每個(gè)通道轉(zhuǎn)換多少次,可以修改其值。
曾出現(xiàn)的問(wèn)題:配置時(shí)鐘時(shí)要知道外部晶振是多少,以便準(zhǔn)確配置時(shí)鐘。將轉(zhuǎn)換值由二進(jìn)制轉(zhuǎn)換為十進(jìn)制時(shí),要先擴(kuò)大100倍,方便顯示小數(shù)。最后串口輸出時(shí)在 printf語(yǔ)句之前加這句代碼,防止輸出的第一位數(shù)據(jù)丟失:while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: STM32ADC多通道采

評(píng)論


技術(shù)專區(qū)

關(guān)閉