STM32 ADC转换

发布者:创意探险最新更新时间:2016-10-11 来源: eefocus关键字:STM32  ADC转换 手机看文章 扫描二维码
随时随地手机看文章
STM32具有1~3个ADC。这些ADC可以相互独立使用,也可以使用双重模式。STM32的ADC是12位逐次逼近型的模拟/数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道可以单次、连续、扫描或间断模式执行。
ADC其实检测的是电压信号,然后在将它转换数字信号。在我使用开发板上,ADC能检测的电压范围为0~3.3v,其转换成数字信号后对应的数字量范围为:0~4095。
下面就讲讲STM32 ADC转换功的实现。还是基于我自己的规范工程上修改!!
1、工程的修改
1)由于要使用ADC功能,必须使用到库文件stm32f10x_adc.c,所以将是stm32f10x_adc.c文件添加到STM32F10x_StdPeriod_Driver工程组中。
2)打开stm32f10x_conf.h文件,将原先屏蔽的:#include "stm32f10x_adc.h"语句的屏蔽去掉。
3)新建ADConvert.c与ADConvert.h两个文件分别保存到BSP文件夹下的src与inc两个文件中。并将ADConvert.c文件添加到BSP工程组中。
 
2、ADConvert.c与ADConvert.h两个文件的编写。
首先当然是ADC对应的引脚的初始化了。我使用的是stm32f10xzet6芯片,它自带有3个ADC,ADC不同的通道都有对应的芯片引脚,通道与引脚的对应关系如下图所示:
STM32 ADC转换 - ziye334 - ziye334的博客
 本次工程,我使用ADC1的通道0与通道1,所以对应的两个引脚是:PA0与PA1。由于它们要用于检测电压值,所以需要将引脚配置成模拟输入模式,代码如下:

/*************************************************************
Function : ADConvert_GPIO_Init
Description: ADC的引脚配置
Input : none
return : none
*************************************************************/
static void ADConvert_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1;//ADC通道0与通道1对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

然后是ADC的配置。在这个工程里,我并没有借助DMA来来实现ADC的转换,本来想着不用DMA来实现ADC的多路转换,但是经过好几次试验发现:这样做似乎不行。于是大胆得出这样的结论:不使用DMA无法实现多路ADC同时转换。在没有使用DMA的情况下,实现多路的ADC转换(当然不是同时转换的),只能一路一路轮流 地转换。ADC的设置代码如:

/*************************************************************
Function : ADConvert_ADC1_Init
Description: ADC1初始化
Input : none
return : none
*************************************************************/
static void ADConvert_ADC1_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

ADC_DeInit(ADC1);//将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode =ENABLE;//模数转换工作在扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发转换关闭
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE);//打开ADC1
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1);//开始AD校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
}

上面的代码配置ADC为连续转换模式、数据右对齐、设置转换通道为1路,并进行复位校准与AD校准。
接下去需要编写一个总函数:ADConvert_Init(),将DAC配置相关的代码都包含进去,代码如下:

/*************************************************************
Function : ADConvert_Init
Description: ADC初始化
Input : none
return : none
*************************************************************/
void ADConvert_Init(void)
{
ADConvert_GPIO_Init();
ADConvert_ADC1_Init();
}

最后还需要编写一个获取转换后的AD值的函数:ADC_GetADValue(),它的代码如下:

/*************************************************************
Function : ADC_GetADValue
Description: 获取转换后的数字量
Input : channel-ADC1的通道
return : 转换后的数字量
*************************************************************/
u16 ADC_GetADValue(u8 channel)
{
//ADC1,ADC通道为channel,规则采样顺序值为1,采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定得到ADC1的软件转换功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1 规则组的转换结果
}

其中ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);这句话比较重要。它的功能是:指定ADC1的通道1的转换顺序为1即最先转换(这里只设置了1路测量),采样的时间为239.5周期。采样的时间的话自己设置,可以有下面的选择:
ADC_SampleTime_1Cycles5: 1.5 周期 ADC_SampleTime_7Cycles5: 7.5 周期 ADC_SampleTime_13Cycles5: 13.5 周期 ADC_SampleTime_28Cycles5: 28.5 周期 ADC_SampleTime_41Cycles5: 41.5 周期 ADC_SampleTime_55Cycles5: 55.5 周期 ADC_SampleTime_71Cycles5: 71.5 周期 ADC_SampleTime_239Cycles5: 239.5 周期
设置完采用配置后,需要发送一个软件启动信号,表示开始准换,转换王弼后,在将转换后的结构返回。
下面的ADConvert.h的代码,非常简单,仅仅声明了可能会其他文件调用的:ADConvert_Init()与ADC_GetADValueADC_GetADValue()这两个函数:

#ifndef __ADCONVERT_H__
#define __ADCONVERT_H__
#include "stm32f10x.h"

void ADConvert_Init(void);
u16 ADC_GetADValue(u8 channel);

#endif

3、main函数的编写
在main函数首先需要定义两个变量:in0Value与in1Value,分别保存ADC1通道1的转换值与通道2的转换值。然后在while(1)循环中每隔1s采集一次,并打印出来。它的代码如下:

/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
u16 in0Value = 0;
u16 in1Value = 0;

BSP_Init();
ADConvert_Init();
PRINTF("\nmain() is running!\r\n");
while(1)
{
LED1_Toggle();
in0Value = ADC_GetADValue(ADC_Channel_0);
PRINTF("ADC1_IN0: AD=%d Volt=%1.1f\r\n", in0Value, 3.3*in0Value/4096);
in1Value = ADC_GetADValue(ADC_Channel_1);
PRINTF("ADC1_IN1: AD=%d Volt=%1.1f\r\n", in1Value, 3.3*in1Value/4096);
Delay_ms(1000);
}
}

用ADC_GetADValue()测得转换后的数字量,接下去再将它换算成电压值,换算的公式如下;
测得的电压值 = 转换后的数字量 * 3.3 / 4096
这样就可以算出ADC测量的电压值了。
 
4、测试
这里需要使用到一个电位器,电位器连接着开发板的电源,将可阻值的脚连接到PA0上,用螺丝刀旋转电位器改变其阻值,可以在看到串口调试软件不断地有数据输出,上面显示着ADC1通道0的采样的转换值与其对应的电压值,如下图所示;
STM32 ADC转换 - ziye334 - ziye334的博客
在将电位器可变电阻端的引脚连接到PA1上,然后旋转电位器,串口调试软件就会输出ADC1通道1 的转换值与对应的电压值,如下图所示:
STM32 ADC转换 - ziye334 - ziye334的博客
最后,将PA0与PA1的引脚短接,然后在连接电位器的可变电阻的引脚上,并旋转电位器,在串口调试助手上输出的信息中可以看到ADC1的通道0 与通道1的转换值与对应的电压,如图所示:
STM32 ADC转换 - ziye334 - ziye334的博客

关键字:STM32  ADC转换 引用地址:STM32 ADC转换

上一篇:STM32 ADC转换(DMA)
下一篇:STM32 正弦波输出

推荐阅读最新更新时间:2024-03-16 15:14

零基础入门STM32定时器配置及其中断设置
  我们大家都知道STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿tiM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头雾水,对于初学者很是不利(我也是初学者)。下面我将自己的定时器设置过程一一记录下来,以供大家参考,我们共同学习……   首先定义定时器头文件,也就是定义寄存器以供操作:   #define TIM2_CR1 (*((volatile unsigned long *)0x40000000))   #define TIM2_CR2 (*((volatile unsigned long *)0x40000004))   #define
[单片机]
智林STM32程序源代码的分析和整理01
一、目的 1、前些天,编写了开发板上键盘扫描、字符输入和简单shell的程序,该程序的编写是在以前工程的基础上修改而成的,源代码的组织比较乱,也没有很好的注释。这两天,先把代码整理一下,加上比较详细的注释,使得可读性、扩展性更好。 2、乘这个机会,也把程序里与STM32硬件相关的部分好好学习一下。 二、开发板配置分析 1、PA口 PA0对应按键PB3,开发板右下角。 PA1用于模拟电位器,JP1在这里。 PA2用定时器的PWM产生液晶的背光电源。PA4-PA7用于SPI模式操作SD卡。PA9,PA10用于串口0通信。PA11,PA12是USB差分线。PA13、PA14、PA15是JTAG的三个脚。 PA3、
[单片机]
ulink下在ram和flash中调试stm32的方法
Keil MDK3.20 在ULINK下调试stm32方法 1. 程序在RAM中运行 要点:(1)程序的下载地址改到RAM空间中 (2)程序的debug之前要设定SP,PC指针到Ram空间 新建工程,选择STM32 的具体型号,我买的万利的开发板,选择stm32f103Vb。 设定程序下载地址,如下图所示,IROM1的地址指向了STM32的ram空间。 空间大小如何分配取决于自己的需求。本款处理器内部ram大小为20K,分配16K给只读区,4K给可读可写区。这样IROM设定的大小为0x4000,IRAM1的起始就变为0X20004000,大小只剩下0X1000。 Debug标签选择ULI
[单片机]
ulink下在ram和flash中调试<font color='red'>stm32</font>的方法
14位125Msps模数转换器ADS5500及其应用
  1、概述 近年来,随着数字信号处理技术的迅速发展和新理论、新算法的不断涌现,加之数字信号处理器件性能的全面提高,使实际系统对模数转换器的要求越来越高。因此,在实际的应用中,一般都要求模数转换器必须同时具备很高的采样率和精度、很大的动态范围、极宽的频率响应范围和灵活的数字接口。   2、ADS5500介绍 ADS5500是德克萨斯仪器公司(Texas Instruments)开发的一款14位分辨率、125MSPS采样速率的高性能模数转换器,芯片为64引脚TQFP PowerPAD封装。为实现更高的系统集成度,其内部还包括有宽带宽的线性采样/保持和内部基准电压源的完整转换解决方案。100MHz时 ADS5500
[模拟电子]
STM32 USART中断小程序
尽管网上的例程一堆堆,但还是花了好几天时间才跑通了一个USART通过中断方式实现的小程序。相当无比地郁闷啊。记录一下遇到的问题: 1. 配置RCC的时机 在主程序中通过查询方式收发数据时,结果并不稳定。对比了ST提供的例程中的设置,将RCC配置提到了所有配置的最前面后,功能实现。结论:应先配置RCC,再初始化其他外设。 2. RAM下调试遇到的问题 在上述查询方式的基础上,增加对NVIC的配置,USART的中断设置,以及ISR中的处理过程,放到RAM下调试,无法进入ISR。有以下两个测试结果:1)在主程序while中调用USART_GetITStatus,判断USART中断事件是否发生及中断是否使能,结果为SET。2)
[单片机]
<font color='red'>STM32</font> USART中断小程序
STM32——如何配置外部中断
中断服务函数列表 IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数 EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler 外部中断一般步骤 1、开启IO口时钟,初始化IO口为输入。调用函数:GPIO_Init(); 2、开启IO口复用时钟。调用函数:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EN
[单片机]
<font color='red'>STM32</font>——如何配置外部中断
如何修改STM32系统时钟?操作方法解析
  在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法   如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:   1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。   2)对于少于100脚的产品,有2种接法:   2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。   2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出‘0’。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。      HSI内部8MHz的RC振荡器的误差在1%左右,内部RC振荡器的精度通常比用HSE(外部晶振)要差上
[单片机]
24位模数转换器AD7713及其应用
    摘要: 文章详细介绍了AD公司的24模数转换器AD7713的管脚定义、内部控制字的定义、硬件接口及使用注意事项,列举了AD7713与8031单片机的接口实例及编程方法,同时给出详细的硬件接口电路及软件程序设计。     关键词: 模数转换器 可程控 硬件接口 软件编程 AD7713 AD7713的AD公司的24位∑-Δ型模数据转换,该芯片线性度好,转换精度高,并具有校准方式多、数据转换率可程控、功耗低(动态工作方式下的功耗典型值为3.5mW,掉电方式下为35μW)等特点,非常适合于高精度、低功耗数据采集系统的应用。 AD7713为24脚DIP结构封装,有3个模拟输入通道,其中第1、2两个通道为差分
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved