以下是原子哥的ADC程序源码。红色部分为我不理解的地方,问题是,这里只开通到了通道1,而为什么注释里面写的是ch0~3呢?那请问是不是通道0~3都开通了呢?他们4个通道再一次程序运行后都转换了一次?
可以通过adcx=Get_Adc_Average(ADC_CH1,10);adcx=Get_Adc_Average(ADC_CH2,10);来读多个通道的AD值?
//初始化ADC,这里仅以规则通道为例,默认将开启通道0~3。
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1 通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设分频因子72/6=12,最大不能超14M
//PA1作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
ADC_DeInit(ADC1); //复位ADC1,将外设ADC1的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC 独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设ADCx器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD 校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
2、Get_Adc(u8 ch)
//获得ADC 值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //通道1
//规则采样顺序值为1,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//使能指定的ADC1 的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
3、Get_Adc_Average(u8 ch,u8 times)
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
|