从零开始学习stm32(七)
数模转换模型
信号是什么呢?信号是运载信息的工具,是信息的载体。生活中处处有信号,比如路口的红绿灯,这是通行的信号、机场的地面搭台信号等等。可以说信号与我们的生活息息相关。通常来说,信号可以分为两大类:数字信号和模拟信号。模拟信号是连续的信号,它在一段连续的时间范围内可以任意瞬间呈现任意数值。数字信号是不连续的信号,它的自变量是离散的、因变量也是离散的,这种信号的自变量用整数来表示,因变量用有限数字中的一个数字来表示。
数字信号的优点有很多,数字信号加强了通信的保密性,提高了抗干扰能力,传输差错可以控制,改善了传输质量,便于使用现代数字信号处理计数来对数字信息进行处理,可构建综合数字通信网,综合传递各种消息,使得通行功能增强。数字信号也有它的缺点,它占用频带较宽,技术要求复杂,模数转换时会带来量化误差。
将模拟信号转换为数字信号的方法时,通过模数转换器将模拟信号转换为数字信号,它的基本原理时把输入的模拟信号按照规定时间间隔采样,并与一系列标准的数字信号比较,数字信号逐次收敛,直至两种信号相等为止,然后显示出此信号的二进制数。
stm32中的ADC功能
stm32中使用的时逐次逼近型的模数转换器,具有12位的分辨率。
相关寄存器
-
SR ADC寄存器
-
CR1、CR2、CR3 ADC控制寄存器
-
SMPR1、SMPR2 ADC采样寄存器
-
JOFRx ADC注入通道数据偏移寄存器
-
HTR、LRT ADC看门狗高低阈值寄存器
-
SQRx ADC规则序列寄存器
-
JDRx、DR ADC注入数据寄存器x/ADC规则数据寄存器
库函数配置思路
一、初始化与配置
1、时钟配置:GPIO、ADC的APB2时钟配置
2、通道配置:GPIO模式——模拟输入
3、ADC配置
基本配置:
ADC模式、扫描模式使能、连续模式使能、ADC转换触发模式、结果数据对齐方式、通道组
采样时间配置:
ADC时钟设置、采样时钟设置
4、中断配置
二、获取ADC采样数据
相关代码
void ADCx_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
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;//1个转换在规则序列中 也就是只转换规则序列1
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
//ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
//while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}
u16 Get_ADC_Value(u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
temp_val+=ADC_GetConversionValue(ADC1);
delay_ms(5);
}
return temp_val/times;
}