从零开始学习stm32(七)

从零开始学习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;
} 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花甲09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值