stm32f103 adc采集 程序配置
這個(gè)例程是采集電壓adc值
對于通道幾是如何選擇的:
這里在adc初始化函數(shù)中,設(shè)置通道幾的采樣率只是設(shè)置要使用的通道幾,并不是選擇用通道幾,真正的選擇用通道幾是在Get_Adc()AD采樣這個(gè)函數(shù)中,ADC1->SQR3|=ch;這里的配置,因?yàn)镾QR3的0~4位
是設(shè)置在規(guī)則序列轉(zhuǎn)換中要轉(zhuǎn)換的通道,又因?yàn)橹挥幸粋€(gè)通道需要轉(zhuǎn)換,所以就用這里來設(shè)置。
對于選擇IO口幾對應(yīng)的通道幾具體要看原理圖或者芯片手冊:
例如
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR"=1<<2; //使能PORTA口時(shí)鐘
GPIOA->CRL&=0XFFF0FFFF;//PA4 anolog輸入
RCC->APB2ENR|=1<<9; //ADC1時(shí)鐘使能
RCC->APB2RSTR|=1<<9; //ADC1復(fù)位
RCC->APB2RSTR&=~(1<<9);//復(fù)位結(jié)束
RCC->CFGR&=~(3<<14); //分頻因子清零
//SYSCLK/DIV2=12M ADC時(shí)鐘設(shè)置為12M,ADC最大時(shí)鐘不能超過14M!
//否則將導(dǎo)致ADC準(zhǔn)確度下降!
RCC->CFGR|=2<<14; //這里預(yù)分頻設(shè)置的是6
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //獨(dú)立工作模式
ADC1->CR1&=~(1<<8); //非掃描模式
ADC1->CR2&=~(1<<1); //單次轉(zhuǎn)換模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //規(guī)則通道組轉(zhuǎn)換選用SWSTART軟件控制轉(zhuǎn)換
ADC1->CR2|=1<<20; //使用用外部觸發(fā)(SWSTART)!!!必須使用一個(gè)事件來觸發(fā)
ADC1->CR2&=~(1<<11); //右對齊
ADC1->SQR1&=~(0XF<<20);//清零(這里需要定義規(guī)則序列需要轉(zhuǎn)換的通道數(shù))
ADC1->SQR1&=0<<20; //1個(gè)轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1
//設(shè)置通道4的采樣時(shí)間
ADC1->SMPR2&=0XFFF0FFFF; //采樣時(shí)間清空
ADC1->SMPR2|=7<<12; // 239.5周期,提高采樣時(shí)間可以提高精確度
ADC1->CR2|=1<<0; //開啟AD轉(zhuǎn)換器
ADC1->CR2|=1<<3; //使能復(fù)位校準(zhǔn)
while(ADC1->CR2&1<<3); //等待校準(zhǔn)結(jié)束
//該位由軟件設(shè)置并由硬件清除。在校準(zhǔn)寄存器被初始化后該位將被清除。
ADC1->CR2|=1<<2; //開啟AD校準(zhǔn)
while(ADC1->CR2&1<<2); //等待校準(zhǔn)結(jié)束
}
/**************************************************************************
函數(shù)功能:AD采樣
入口參數(shù):ADC1 的通道
返回 值:AD轉(zhuǎn)換結(jié)果
**************************************************************************/
u16 Get_Adc(u8 ch)
{
//設(shè)置轉(zhuǎn)換序列
ADC1->SQR3&=0XFFFFFFE0;//規(guī)則序列1 通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22; //啟動規(guī)則轉(zhuǎn)換通道
while(!(ADC1->SR&1<<1));//等待轉(zhuǎn)換結(jié)束
return ADC1->DR;//返回adc值
}
/**************************************************************************
函數(shù)功能:讀取電池電壓
入口參數(shù):無
返回 值:電池電壓 單位MV
**************************************************************************/
int Get_battery_volt(void)
{
int Volt;//電池電壓
Volt=Get_Adc(Battery_Ch)*3.3*11.5*100/1.5/4096;//電阻分壓,具體根據(jù)原理圖簡單分析可以得到
return Volt;
}