//源文件
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);
/**********************************************************************/