一:实验目的
利用ADC模块测量输入电压的,并通过串口输出测试结果
二:ADC介绍:
Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
ADC 是 12 位的逐次逼近型( SAR)模拟数字转换器,可以将模拟信号转换成数字信号。
ADC 有可测量内部或外部信号源,其中 ADC1 有 19 路外部输入通道, ADC2 有 17 路外部输入通道
和 2 路内部通道。这些 ADC 的通道可以单次、单周期和连续进行转换。根据不同的方式又可以选择普通通道转换、任意通道转换。
ADC 的最大输入时钟为 48MHz,它是由 PLL2 和 APB2 时钟(PCLK2)分频产生。
ADC 有可测量内部或外部信号源,其中 ADC1 有 19 路外部输入通道, ADC2 有 17 路外部输入通道
和 2 路内部通道。这些 ADC 的通道可以单次、单周期和连续进行转换。根据不同的方式又可以选择普通通道转换、任意通道转换。
ADC 的最大输入时钟为 48MHz,它是由 PLL2 和 APB2 时钟(PCLK2)分频产生。
功能框图:
可以看到MM32F系列一共有19路ADC输入,但是T_SENSOR(温度传感器)通道在 ADC2 的 AIN17 通道, V_SENSOR(内部参考电压)通道在ADC2 的 AIN18 通道。
软件配置流程:
l 开启PA口时钟和ADC1时钟,设置PA8为模拟输入。
l 复位ADC1,同时设置ADC1分频因子。
l 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
l 使能ADC并校准。
l 配置规则通道参数:
l 开启软件转换:
l 等待转换完成,读取ADC值。
软件主要代码:
void ADC_Configure(void)
{
ADC_InitTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_CalibrationConfig(ADC1, 0x1FE);
ADC_StructInit(&ADC_InitStruct);
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_Prescaler = ADC_Prescaler_16;
ADC_InitStruct.ADC_Mode = ADC_Mode_Scan;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_SampleTimeConfig(ADC1, ADC_Channel_1, ADC_SampleTime_240_5);
ADC_SampleTimeConfig(ADC1, ADC_Channel_4, ADC_SampleTime_240_5);
ADC_SampleTimeConfig(ADC1, ADC_Channel_5, ADC_SampleTime_240_5);
ADC_InjectedChannelNumCfg(ADC1, 2);
ADC_InjectedChannelSelect(ADC1, ADC_InjectedChannel_0, ADC_Channel_1);
ADC_InjectedChannelSelect(ADC1, ADC_InjectedChannel_1, ADC_Channel_4);
ADC_InjectedChannelSelect(ADC1, ADC_InjectedChannel_2, ADC_Channel_5);
ADC_InjectedConvCmd(ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* PA1(RV1) PA4(RV2) PA5(RV3) */
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
ADC_Cmd(ADC1, ENABLE);
}
主程序:
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);
while (RESET == ADC_GetFlagStatus(ADC1, ADC_FLAG_INJEOS))
{
}
ADC_ClearFlag(ADC1, ADC_FLAG_INJEOS);
RVxVoltage[0] = (float)ADC_GetInjectedChannelConvertedValue(ADC1, ADC_InjectedChannel_0) * (float)3.3 / (float)4096.0;
RVxVoltage[1] = (float)ADC_GetInjectedChannelConvertedValue(ADC1, ADC_InjectedChannel_1) * (float)3.3 / (float)4096.0;
RVxVoltage[2] = (float)ADC_GetInjectedChannelConvertedValue(ADC1, ADC_InjectedChannel_2) * (float)3.3 / (float)4096.0;
printf("\r\nRV1 Voltage = %0.2f \tRV2 Voltage = %0.2f \tRV3 Voltage = %0.2f", RVxVoltage[0], RVxVoltage[1], RVxVoltage[2]);
PLATFORM_DelayMS(500);
试验结果截图:
---------------------
作者:聪聪哥哥
链接:https://bbs.21ic.com/icview-3389916-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。