STM32开发日记007:AD转换介绍

1.AD转换概述

12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。(扫描模式是使用在多通道中)
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
ADC的输入时钟不得超过14MHz(频率过高,会导致转换的数据不准确),它是由PCLK2经分频产生。
逐次逼近型模数转换:
ADC在正常使用的使用都会有一个参考电压–3.3V
在这里插入图片描述
逐次逼近型转换,首先是通过参考电压,转换为模拟量,真是获取到的去要进行转换的电压进行比较,从0–参考电压,
例如:检测的外部电压–2.2V 0
12位精度(0–4095):整个数据占12位
2.2v对应的数字量多少????data-- 2730
3.3/4096=2.2/data;
在这里插入图片描述

AD转换的管脚信息:
在这里插入图片描述

ADC时钟

由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步

通道选择

如果有多个通道需要转换,循序完全可以自己定义,没有特殊要求:
转换:通道8、通道3、通道2、通道2、通道0、通道2、通道2、通道15。
规则组:由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中

单次转换模式

单次转换模式下, ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。

连续转换模式

在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换

可编程的通道采样时间

ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。

校准

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。
在这里插入图片描述
在这里插入图片描述

数据对齐

我们采用右对齐的方式:
在这里插入图片描述

控制滑动变阻器(我们以滑动变阻器为例来讲解AD转换)
在这里插入图片描述
在这里插入图片描述

编程步骤:

1.开启时钟–ADC3 F端口
2.配置PF7的工作模式—模拟输入
3.配置ADC3_IN5的工作模式 单次 对齐方式 校验 …
4.读取数据
在这里插入图片描述
ADC转换的原始数据只是一个数字量,没有任何意义,我们都是需要通过具体的算法,或者一些转换公式,得到的其实都是模块的电压变化,只有通过具体的公式计算之后,才有意义。

优化数据的精度:求平均值 中值…其他的滤波算法进行优化

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;
}      

完整代码:

#include "adc.h"
#include "stdio.h"

void Adc3_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef   ADC3_InitStructure;
	//打开时钟--72
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3|RCC_APB2Periph_GPIOF,ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	//配置 PF7
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;//KEY0-KEY1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //设置成上拉输入
 	GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOE4,3
	
	//ADC3_CH5配置
	ADC3_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC3_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换
	ADC3_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
	ADC3_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不用外部触发
	ADC3_InitStructure.ADC_NbrOfChannel=1;//通道数量
	ADC3_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式失能

	ADC_Init(ADC3,&ADC3_InitStructure);
	ADC_Cmd(ADC3, ENABLE);	//使能指定的ADC3
	//校验--也可以不写
	ADC_ResetCalibration(ADC3);	//使能复位校准  
	while(ADC_GetResetCalibrationStatus(ADC3));	//等待复位校准结束
	ADC_StartCalibration(ADC3);	 //开启AD校准
	while(ADC_GetCalibrationStatus(ADC3));	 //等待校准结束

	ADC_SoftwareStartConvCmd(ADC3,ENABLE);//开始规则组通道转换
	
}
//获取数据
void  get_data(void)
{
	u16 data=0;
	ADC_SoftwareStartConvCmd(ADC3,ENABLE);//开始规则组通道转换
	
	ADC_RegularChannelConfig(ADC3,ADC_Channel_5,1,ADC_SampleTime_239Cycles5);
	
	//获取数据
	
	while(!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC));
	data=ADC_GetConversionValue(ADC3);
	printf("ADC_CH5_DATA:%d\r\n",data);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值