【STM32】 ADC模数转换

51 篇文章 4 订阅
18 篇文章 0 订阅

ADC简介

ADC:模拟数字转换器,是指将连续变量的模拟信号(高低电平)转换位离散的数字信号(0和1)的器件,AD转换就是模数转换,也可以是整流.顾名思义 ,就是把模拟信号转换为数字信号.

那么模拟量可以是什么?总结如下:模拟量可以是电压、电流等电信号,还可以是压力 温度 湿度 位移、声音等非电信号等等。


ADC采集的要求

输入到A/D转换器中的输入信号必须经过各种传感器将各类的物理量转换为电压。因此ADC要求的进度也要很高,A/D转化输出的电压可以有8位(分辨率:256)、10位(分辨率:1024)、12位(分辨率:4096)、16位(分辨率:65536)等等。

转换步骤

取样 、保持、量化、编码  

前两个步骤再取样,保持电路中完成;后两个步骤在ADC中完成。

ADC常用类型:

积分型

并行比较型/串并型

电容阵列逐次比较型及压频 变换型

逐次逼近型

ADC主要特征

  • 12位分辨率;
  • 转换结束,注入转换结束和发生模拟看门狗事件时产生中断;
  • 单次和连续转换模式;
  • 通过通道0到通道N的自动扫描模式;
  • 自校验;
  • 带内嵌数据一致性的数据对齐(左对齐或者右对齐);
  • 采样间隔可以按通道分别编程;
  • 规则转换和注入转换均有外部触发选项;
  • 间断模式;
  • 双重模式;
  • ADC转换时间:
  • ADC供电要求:2.4V到3.6V;
  • 规则通道转换期间有DMA请求产生;

对于ADC的时钟我们只能采取72/6=12Mhz的ADC 时钟频率 并且只能是6/8分频 不可以用2/4分频 因为已经超过了ADC的最大时钟晶振

注入通道和规则通道:

注入通道:类似单片机的中断事件  同一个ADC只能选择4个注入通道

注入通道转换完成  JEOC标志会置1

规则通道----类似main函数中while(1)里面的程序事件

同一个ADC可以选择16个规则通道

规则通道数据转换完成之后 EOC标志位会置1

 

单次转换的好处:按照个人需求随意启动;

单次转换的坏处:不能连续的采集数据;

什么是单次转换模式:

多次转换的好处:ADC启动一次后,就可以一直转换;

多次转换的坏处:消耗的资源过大;

什么是多次转换模式:

扫描模式

扫描模式可以干什么?

扫描所有选中的通道进行

注意:1、建议在每次上电后执行一次校验;

           2、启动校验前,ADC必须处于关电状态。

数据对齐:

可编程的通道采样时间:

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

外部触发转换:

转换武以由外部事件触发(例如定时器捕获,EXT线)。如果设置了EXTTRIG控制位,则外部事件就能骜他发转奖。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中的某一个,可义触发规则和注入组的采样。

 

 代码如下(示例):

#include "adc.h"

void ADC1_Init(void)
{
	//配置IO
  GPIO_InitTypeDef  GPIO_InitStruct;
	ADC_InitTypeDef   ADC_InitStruct ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_3;        //引脚1
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;  //输出速度为10MHz
	GPIO_InitStruct.GPIO_Mode  =  GPIO_Mode_AIN; 		//浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStruct);	 //初始化
	
	//配置ADC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent ;
	ADC_InitStruct.ADC_NbrOfChannel = 1;
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//配置为单通道
	
	ADC_Init(ADC1,&ADC_InitStruct); //ADC初始化
	ADC_Cmd(ADC1,ENABLE);//使能ADC上电工作
	
	//启动前进行校准
	//复位校准
	ADC_ResetCalibration(ADC1);//复位ADC校准器
	while(ADC_GetCalibrationStatus(ADC1));//等待校准器为零  说明完成校准
	//复位完开始启动   开启ADC进行校准
	ADC_StartCalibration(ADC1);//开启ADC校准
	while(ADC_GetCalibrationStatus(ADC1));//获取校准状态
	
}
//获取光照传感器的值
//返回adc采集到光照强度的值
//取值范围  0--4095
u16 Get_Gz_Data(void)
{
  //选择规则通道  ADC1的通道3   转换到通道1   通道转换时间为239
	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5);
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待数据装换完成  获取规则通道EOC标志
	return ADC_GetConversionValue(ADC1);//返回转换结果
}

u16 Get_GZ_data(void)
{
	//选择规则通道,ADC1的通道3(IN3),转换通道为1个,通道采集时间为239
	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5); 
	ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动规则通道开始转换
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));  //等待数据转换完成,获取规则通道EOC标志位
	return ADC_GetConversionValue(ADC1);  //返回转换结果
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32 ADC模数转换实验中,可能会遇到以下问题: 1. ADC采样值不正确 如果ADC采样值不正确,可能是因为ADC参数配置不正确或者采样时序不正确导致的。需要确认以下几点: - 确认ADC参数配置正确,包括采样时间、采样通道、采样分辨率等参数 - 确认ADC时钟已经使能 - 确认ADC采样时序正确,包括采样开始时间、采样保持时间和转换时间等参数 2. ADC采样速率不稳定或者出现噪声 如果ADC采样速率不稳定或者出现噪声,可能是因为ADC参考电压不稳定或者ADC输入信号不稳定导致的。需要确认以下几点: - 确认ADC参考电压稳定,可以使用稳压器等设备来提供稳定的参考电压 - 确认ADC输入信号稳定,可以使用滤波电路等方法来滤除噪声和干扰信号 解决方法: 在使用STM32 ADC模数转换时,可以采用以下步骤进行配置和编程: 1. 配置ADC参数 使用ADC_Init函数对ADC进行配置,设置相应的采样时间、采样通道、采样分辨率等参数。 2. 开启ADC采样 在程序中开启ADC采样,使得程序能够读取ADC转换结果。 3. 编写中断服务函数 根据需要编写中断服务函数,并在函数中进行相应的处理。需要注意的是,中断服务函数应该尽可能的简单,避免长时间占用CPU资源,否则可能会影响其他重要任务的执行。 4. 烧录程序 将程序烧录到STM32芯片中,通过读取ADC转换结果,观察ADC采样值的情况和中断服务函数的执行情况。 需要注意的是,在编写程序时需要遵循一些规范和最佳实践,如使用宏定义等方法来定义常量和变量,避免使用硬编码方式;使用滤波器等技术来提高ADC采样值的精度和稳定性等。同时,建议使用示波器等工具来观察ADC采样值的情况和中断服务函数的执行情况,以便进行调试和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丘比特惩罚陆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值