一、问题集结
1、ADC?
(Analog to Digital Converter)即模数转换器,用来将模拟信号转换为数字信号. 模数转换器
2、什么是模拟量?
如温度,湿度等随着时间逐步逐步连续变化的量
3、什么是数字量?
如我们单片机处理的信号010101这些。
4、什么是分辨率
A/D转换器对输入模拟量微小变化的分辨能力,通常用二进制数的有效位表示。
二、ADC框图
三、代码分析
c
/* 设置ADC分频因子 */
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 将ADC时钟设置为PCLK2的1/6,此处PCLK2为72MHz,分频后为12MHz
c
/* 引脚配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置PA1为ADC输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
c
/* ADC配置 */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式,单独使用ADC1
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; // 转换通道数量为1
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
/* 使能ADC */
ADC_Cmd(ADC1, ENABLE);
/* 复位校准 */
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)); // 等待复位校准结束
/* 开始校准 */
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)); // 等待校准结束
c
/*********************************************************************
@Function : 获得ADC值
@Parameter : ch : 通道值 0~3
@Return : ADC值
**********************************************************************/
uint16_t Get_Adc(uint8_t ch)
{
/*设置指定ADC的规则组通道,一个序列,采样时间*/
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
c
/*********************************************************************
@Function : 获得ADC的平均值
@Parameter : ch : 通道值 0~3
times :采集次数
@Return : ADC平均值
**********************************************************************/
uint16_t Get_Adc_Average(uint8_t ch, uint8_t times)
{
uint32_t temp_val = 0; // 初始化累加变量为0
uint8_t t; // 循环计数变量
for (t = 0; t < times; t++) // 循环执行指定次数
{
temp_val += Get_Adc(ch); // 获取指定通道的ADC值并累加到temp_val
delay_ms(5); // 延时5毫秒,等待下一次采样
}
return temp_val / times; // 返回ADC采样值的平均值
}