經(jīng)典_STM32_ADC多通道采樣的例子
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //復(fù)位指定的ADC1的校準(zhǔn)寄存器
while(ADC_GetResetCalibrationStatu
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);
評(píng)論