//源檔案
void ADCPhyConfig()
{
RCC->APB2ENR |=1 <<8; //使能 ADC1 時鐘
RCC->AHB1ENR |=1 <<0; //使能 PORTA 時鐘
//PA5 輸入模式、下拉、高速
GPIOA->MODER |= (3<<5*2); //輸入模式
GPIOA->PUPDR |= (3<<5*2); //下拉
GPIOA->OSPEEDR |= (1<<6*2); //高速
RCC->APB2RSTR|=1<<8; //ADCs 復位
RCC->APB2RSTR&=~(1<<8); //復位結束
ADC->CCR = 1<<16; //ADCCLK=PCLK2/4=90/4=22.5Mhz,不超過 36Mhz
ADC1->CR1 = 0; //CR1 設定清零
ADC1->CR2 = 0; //CR2 設定清零
ADC1->CR1 |= 0<<24; //12 位模式
ADC1->CR1 |= 0<<8; //非掃描模式
ADC1->CR2 &= ~(1<<1); //單次轉換模式
ADC1->CR2 &= ~(1<<11); //右對齊
ADC1->CR2 |= 0<< 28; //軟體觸發
ADC1->SQR1 &= ~(0XF<<20);
ADC1->SQR1 |= 0<<20; //1 個轉換在規則序列中 也就是只轉換規則序列 1
//設定通道 5 的采樣時間
ADC1->SMPR2 &= ~(7<<(3*5));//通道 5 采樣時間清空
ADC1->SMPR2 |= 7<<(3*5); //通道 5 480 個周期,提高采樣時間可以提高精確度
ADC1->CR2 |= 1<<0; //開啟 AD 轉換器
}
//獲得 ADC 值
//ch:通道值 0~16
//回傳值:轉換結果
uint16_t Get_Adc(uint8_t ch)
{
//設定轉換序列
ADC1->SQR3&=0XFFFFFFE0;//規則序列 1 通道 ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<30; //啟動規則轉換通道
while(!(ADC1->SR&1<<1));//等待轉換結束
return ADC1->DR; //回傳 adc 值
}
//獲取通道 ch 的轉換值,取 times 次,然后平均
//ch:通道編號
//times:獲取次數
//回傳值:通道 ch 的 times 次轉換結果平均值
uint16_t Get_Adc_Average(uint8_t ch,uint8_t times)
{
uint32_t temp_val=0;
uint8_t t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
DelayPhyMs(5);
}
return temp_val/times;
}
//頭檔案
/*****************************adc**************************************/
#define ADC_CH5 5 //通道 5
void ADCPhyConfig(void);
uint16_t Get_Adc(uint8_t ch);
uint16_t Get_Adc_Average(uint8_t ch,uint8_t times);
/**********************************************************************/
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535953.html
標籤:其他
