STM32F103的光照、烟雾MQ2、有毒气体MQ135的ADC配置(寄存器版与库函数版
#if 0
void ADC1_Init(void)
{
RCC->APB2ENR |=1<<2;
RCC->APB2ENR |=1<<9;
RCC->CFGR &=~(3<<14);
RCC->CFGR |= (2<<14);
RCC->APB2RSTR |= 1<<9;
RCC->APB2RSTR &=~(1<<9);
GPIOA->CRL &= 0xffff000f;
ADC1->CR1 &= ~(1<<23);
ADC1->CR1 &= ~(1<<22);
ADC1->CR1 &= ~(0XF<<16);
ADC1->CR1 &= ~(0X7<<13);
ADC1->CR1 &= ~(1<<8);
ADC1->CR1 &= ~(1<<5);
ADC1->CR2 |= 1<<20;
ADC1->CR2 |= 7<<17;
ADC1->CR2 &=~(1<<15);
ADC1->CR2 &=~(1<<11);
ADC1->CR2 &=~(1<<8);
ADC1->SMPR2 &=~(7<<3);
ADC1->SMPR2 |= (7<<3);
ADC1->SQR1 &= ~(0XF<<20);
ADC1->SQR1 |= ( 0 <<20);
ADC1->CR2 |= 1<<0;
ADC1->CR2 |= 1<<3;
while (ADC1->CR2 & (1<<3));
ADC1->CR2 |= 1<<2;
while (ADC1->CR2 & (1<<2));
}
u16 ADC1_ReadData(u8 ch)
{
ADC1->SQR3 &= ~(0X1F<<0);
ADC1->SQR3 |= ch;
ADC1->CR2|= 1<<22;
while (!(ADC1->SR & (1<<1)));
return ADC1->DR;
}
#else
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 ADC1_ReadData(u8 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_1Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
}
#endif
#define N 10
u16 ADC1_ReadAvgData(u8 ch)
{
u16 sum=0;
u16 ADC1_ValueBuf[N];
for(u8 i=0;i<N;i++)
{
ADC1_ValueBuf[i] = ADC1_ReadData(ch);
}
for(u8 j=0;j<N-1;j++)
{
for(u8 i=0;i<N-1-j;i++)
{
if(ADC1_ValueBuf[i]>ADC1_ValueBuf[i+1])
{
u16 temp;
temp = ADC1_ValueBuf[i];
ADC1_ValueBuf[i] = ADC1_ValueBuf[i+1];
ADC1_ValueBuf[i+1] = temp;
}
}
}
for(u8 i=2;i<N-2;i++)
{
sum+=ADC1_ValueBuf[i];
}
return sum/(N-4);
}
u16 Light_Data(void)
{
u16 ad;
ad=ADC1_ReadAvgData(3);
ad=(4095-ad)*1000/4095;
return ad;
}
u16 MQ2_Data(void)
{
u16 ad;
ad=ADC1_ReadAvgData(2);
ad=ad*100/4095;
return ad;
}
u16 MQ135_Data(void)
{
u16 ad;
ad=ADC1_ReadAvgData(1);
ad=ad*100/4095;
return ad;
}