ARM嵌入基础应用 14_第1页
ARM嵌入基础应用 14_第2页
ARM嵌入基础应用 14_第3页
ARM嵌入基础应用 14_第4页
ARM嵌入基础应用 14_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章

模拟数字转换器作者:黄克亚2025年5月本章概要CONTENTSADC原理、参数及类型STM32F103的ADC库函数STM32F103的ADC工作原理4通道模拟信号采集与显示项目12.1ADC概述模拟数字转换器(Analog-to-DigitalConverterADC),简称模数转换器,顾名思义,是将一种连续变化的模拟信号转换为离散的数字信号的电子器件。有了ADC,微控制器就如同多了一双观察模拟世界的眼睛,增加了模拟输入功能。12.1ADC概述12.1.1ADC基本原理ADC进行模数转换一般包含三个关键步骤:采样、量化、编码。本节以正弦模拟信号为例讲解ADC转换过程。1.采样采样是在间隔为T的T、2T、3T、…时刻抽取被测模拟信号幅值,相邻两个采样时刻之间的间隔T也被称为采样周期。12.1ADC概述12.1.1ADC基本原理2.量化把采样后每个脉冲的幅度进行离散化处理,得到被CPU处理的离散数值,这个过程就称为量化。为了实现离散化处理,用指定的最小单位将纵轴划分为若干个(通常是2n个)区间,然后确定每个采样脉冲的幅度落在哪个区间内,即把每个时刻的采样电压表示为指定的最小单位的整数倍。3.编码把量化的结果二进制表示出来称为编码。而且,一个n位量化的结果值恰好用一个n位二进制数表示。这个n位二进制数就是ADC转换完成后的输出结果。12.1ADC概述12.1.2ADC性能参数量程(FullScaleRange,FSR)是指ADC所能转换的模拟输入电压的范围,分为单极性和双极性两种类型。1.量程分辨率(resolution)是指ADC所能分辨的最小模拟输入量,反映ADC对输入信号微小变化的响应能力。2.分辨率精度(accuracy)是指对于ADC的数字输出(二进制代码),其实际需要的模拟输入值与理论上要求的模拟输入值之差。3.精度转换时间(conversiontime)是ADC完成一次A/D转换所需要的时间,是指从启动ADC开始到获得相应数据所需要的总时间。4.转换时间12.1ADC概述12.1.3ADC主要类型逐次逼近式属直接式A/D转换器,其原理可理解为将输入模拟量逐次与UREF/2、UREF/4、UREF/8、…、UREF/2N-1比较,模拟量大于比较值取1(并减去比较值),否则取0。优点精度高,速度较快,价格适中,是目前种类最多、应用最广典型芯片有ADC08091.逐次逼近式双积分式是一种间接式A/D转换器,其原理是将输入模拟量和基准量通过积分器积分,转换为时间,再对时间计数,计数值即为数字量。优点是转换精度高,缺点是转换时间较长,一般要40~50ms,使用于转换速度不快的场合。典型芯片有MC14433和ICL7109。2.双积分式V/F变换器也是一种间接式A/D转换器,其原理是将模拟量转换为频率信号,再对频率信号计数,转换为数字量。其特点是转换精度高,抗干扰性强,便于长距离传送,廉价,但转换速度偏低。3.V/F变换式12.2STM32F103的

ADC工作原理STM32F103微控制器内部集成1~3个12位逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。12.2STM32F103的ADC工作原理12.2.1主要特征12位分辨率转换结束、注入转换结束和发生模拟看门狗事件时产生中断单次和连续转换模式从通道0到通道n的自动扫描模式自校准带内嵌数据一致性的数据对齐采样间隔可以按通道分别编程规则转换和注入转换均有外部触发选项间断模式双重模式(带2个或以上ADC的器件)ADC转换时间:时钟为56MHz时,ADC最短转换时间为1μsADC供电要求:2.4V到3.6VADC输入范围:VREF-≤VIN≤VREF+规则通道转换期间有DMA请求产生。12.2STM32F103的ADC工作原理12.2.2内部结构其核心为模拟至数字转换器,它由软件或硬件触发,在ADC时钟ADCCLK的驱动下对规则通道或注入通道中的模拟信号进行采样、量化和编码。ADC的12位转换结果可以以左对齐或右对齐的方式存放在16位数据寄存器当中。根据转换通道不同,数据寄存器可以分为规则通道数据寄存器(1)和注入通道数据寄存器(4)。12.2STM32F103的ADC工作原理12.2.2内部结构模拟数字转换器引脚说明:名称信号类型注解VREF+输入,模拟参考正极2.4V≤VREF+≤VDDAVDDA输入,模拟电源2.4V≤VDDA≤VDD(3.6V)VREF-输入,模拟参考负极VREF-=VSSAVSSA输入,模拟电源地等效于VSS的模拟电源地ADCx_IN[15:0]模拟输入信号16个模拟输入通道12.2STM32F103的ADC工作原理12.2.3通道及分组通道ADC1ADC2ADC3通道0PA0PA0PA0通道1PA1PA1PA1通道2PA2PA2PA2通道3PA3PA3PA3通道4PA4PA4PF6通道5PA5PA5PF7通道6PA6PA6PF8通道7PA7PA7PF9通道8PB0PB0PF10通道9PB1PB1

通道10PC0PC0PC0通道11PC1PC1PC1通道12PC2PC2PC2通道13PC3PC3PC3通道14PC4PC4

通道15PC5PC5

通道16温度传感器

通道17内部参考电压

STM32F103微控制器最多有18个模拟输入通道,可测量16个外部模拟信号和2个内部信号源,其ADC通道分配关系如表所示STM32F103微控制器的ADC根据优先级把所有通道分为两个组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。12.2STM32F103的ADC工作原理12.2.3通道及分组01划分到规则通道组(groupofregularchannel)中的通道称为规则通道。一般情况下,如果仅是一般模拟输入信号的转换,那么将该模拟输入信号的通道设置为规则通道即可。规则通道组02划分到注入通道组(groupofinjectedchannel)中的通道称为注入通道。如果需要转换的模拟输入信号的优先级较其它的模拟输入信号要高,那么可以将该模拟输入信号的通道归入注入通道组中。注入通道03规则通道相当于正常运行的程序,而注入通道呢,就相当于中断。当主程序正常执行的时候,中断是可以打断其执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。通道组划分12.2STM32F103的ADC工作原理12.2.4时序图

ADC在开始精确转换前需要一个稳定时间tSTAB。在开始ADC转换和14个时钟周期后,EOC标志被设置,16位ADC数据寄存器包含转换的结果。12.2STM32F103的ADC工作原理12.2.5数据对齐ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左对齐或右对齐,如图所示。注入组通道转换的数据值已经减去了在ADC_JOFRx寄存器中定义的偏移量,因此结果可以是一个负值。SEXT位是扩展的符号值。对于规则组通道,不需减去偏移值,因此只有12个位有效转换结果数据右对齐转换结果数据左对齐12.2STM32F103的ADC工作原理12.2.6校准ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。建议在上电时执行一次ADC校准。校准阶段结束后,校准码储存在ADC_DR中。STM32F103微控制器ADC转换时间TCONV=采样时间+量化编码时间,其中量化编码时间固定为12.5个ADC时钟周期。采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。12.2.7转换时间例如:当ADCCLK=14MHz,采样时间为1.5周期TCONV=1.5+12.5=14周期=1μs12.2STM32F103的ADC工作原理12.2.8转换模式1.单次转换模式:

ADC只执行一次转换如果一个规则通道被转换:转换数据被储存在16位ADC_DR寄存器中,EOC(转换结束)标志被设置,如果设置了EOCIE,则产生中断。如果一个注入通道被转换:转换数据被储存在16位的ADC_DRJ1寄存器中,JEOC(注入转换结束)标志被设置,如果设置了JEOCIE位,则产生中断。2.连续转换模式:前面ADC转换一结束马上就启动另一次转换如果一个规则通道被转换:转换数据被储存在16位的ADC_DR寄存器中,EOC(转换结束)标志被设置,如果设置了EOCIE,则产生中断。如果一个注入通道被转换:转换数据被储存在16位的ADC_DRJ1寄存器中,JEOC(注入转换结束)标志被设置,如果设置了JEOCIE位,则产生中断。3.扫描模式:此模式用来扫描一组模拟通道扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置,ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。12.2STM32F103的ADC工作原理12.2.8转换模式4.间断模式规则组:通过设置ADC_CR1寄存器上的DISCEN位激活当以间断模式转换一个规则组时,转换序列结束后不自动从头开始。当所有子组被转换完成,下一次触发启动第一个子组的转换。注入组:通过设置ADC_CR1寄存器的JDISCEN位激活当完成所有注入通道转换,下个触发启动第1个注入通道的转换。不能同时使用自动注入和间断模式。必须避免同时为规则和注入组设置间断模式。间断模式只能作用于一组转换12.2STM32F103的ADC工作原理12.2.9外部触发转换转换可以由外部事件触发(例如定时器捕获,EXTI线)。如果设置了EXTTRIG控制位,则外部事件就能够触发转换。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中的某一个,可以触发规则和注入组的采样。触发源类型EXTSEL[2:0]TIM1_CC1事件来自片上定时器的内部信号000TIM1_CC2事件001TIM1_CC3事件010TIM2_CC2事件011TIM3_TRGO事件100TIM4_CC4事件101EXTI线11/TIM8_TRGO外部引脚/来自片上定时器的内部信号110SWSTART软件控制位111注意:当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。12.2STM32F103的ADC工作原理12.2.10中断和DMA请求1.中断规则组和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有独立的中断使能位。2.DMA因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。相关内容和示例将在下一章中讲解。中断事件事件标志使能控制位规则组转换结束EOCEOCIE注入组转换结束JEOCJEOCIE设置了模拟看门狗状态位AWDAWDIE12.3ADC相关库函数本节介绍ADC相关库函数12.3ADC相关库函数12.3.1函数ADC_DeInit函数名ADC_DeInit函数原形voidADC_DeInit(ADC_TypeDef*ADCx)功能描述将外设ADCx的全部寄存器重设为缺省值输入参数1ADCx:x可以是1、2或3来选择ADC外设输出参数2无返回值无先决条件无被调用函数RCC_APB2PeriphClockCmd()例:/*ResetsADC2*/ADC_DeInit(ADC2);12.3ADC相关库函数12.3.2函数ADC_Init函数名ADC_Init函数原形voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct)功能描述根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2ADC_InitStruct:指向结构ADC_InitTypeDef的指针,包含了指定外设ADC的配置信息输出参数无返回值无先决条件无被调用函数无ADC_Mode:

设置ADC工作在独立或者双ADC模式ADC_Mode描述ADC_Mode_IndependentADC1和ADC2工作在独立模式ADC_Mode_RegInjecSimultADC1和ADC2工作在同步规则和同步注入模式ADC_Mode_RegSimult_AlterTrigADC1和ADC2工作在同步规则模式和交替触发模式ADC_Mode_InjecSimult_FastInterlADC1和ADC2工作在同步规则模式和快速交替模式ADC_Mode_InjecSimult_SlowInterlADC1和ADC2工作在同步注入模式和慢速交替模式ADC_Mode_InjecSimultADC1和ADC2工作在同步注入模式ADC_Mode_RegSimultADC1和ADC2工作在同步规则模式ADC_Mode_FastInterlADC1和ADC2工作在快速交替模式ADC_Mode_SlowInterlADC1和ADC2工作在慢速交替模式ADC_Mode_AlterTrigADC1和ADC2工作在交替触发模式12.3ADC相关库函数12.3.2函数ADC_InitADC_ScanConvMode:规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为ENABLE或者DISABLE。ADC_ContinuousConvMode:规定了模数转换工作在连续还是单次模式。可以设置这个参数为ENABLE或者DISABLE。ADC_ExternalTrigConv:

定义了使用外部触发来启动规则通道的模数转换,ADC_ExternalTrigConv描述ADC_ExternalTrigConv_T1_CC1选择定时器1的捕获比较1作为转换外部触发ADC_ExternalTrigConv_T1_CC2选择定时器1的捕获比较2作为转换外部触发ADC_ExternalTrigConv_T1_CC3选择定时器1的捕获比较3作为转换外部触发ADC_ExternalTrigConv_T2_CC2选择定时器2的捕获比较2作为转换外部触发ADC_ExternalTrigConv_T3_TRGO选择定时器3的TRGO作为转换外部触发ADC_ExternalTrigConv_T4_CC4选择定时器4的捕获比较4作为转换外部触发ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO选择外部中断线11或TIM8的TRGO作为转换外部触发ADC_ExternalTrigConv_None转换由软件而不是外部触发启动ADC_DataAlign:

规定了ADC数据向左边对齐还是向右边对齐。ADC_DataAlign

描述ADC_DataAlign_RightADC数据右对齐ADC_DataAlign_LeftADC数据左对齐12.3ADC相关库函数12.3.2函数ADC_InitADC_NbreOfChannel:规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16。例:/*InitializetheADC1accordingtotheADC_InitStructuremembers*/ADC_InitTypeDefADC_InitStructure;ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode=ENABLE;ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO;ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel=16;ADC_Init(ADC1,&ADC_InitStructure);12.3ADC相关库函数12.3.3函数ADC_RegularChannelConfig函数名ADC_RegularChannelConfig函数原形voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,u8ADC_Channel,u8Rank,u8ADC_SampleTime)功能描述设置指定ADC的规则组通道,设置它们的转化顺序和采样时间输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2ADC_Channel:被设置的ADC通道输入参数3Rank:规则组采样顺序。取值范围1到16。输入参数4ADC_SampleTime:指定ADC通道的采样时间值参阅章节ADC_SampleTime查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无例:/*ConfiguresADC1Channel2as:firstconvertedchannelwithan7.5cyclessampletime*/ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_7Cycles5);/*ConfiguresADC1Channel8as:secondconvertedchannelwithan1.5cyclessampletime*/ADC_RegularChannelConfig(ADC1,ADC_Channel_8,2,ADC_SampleTime_1Cycles5);12.3ADC相关库函数12.3.3函数ADC_RegularChannelConfigADC_Channel:参数ADC_Channel指定了通过调用函数ADC_RegularChannelConfig来设置的ADC通道。ADC_Channel描述ADC_Channel描述ADC_Channel_0选择ADC通道0ADC_Channel_9选择ADC通道9ADC_Channel_1选择ADC通道1ADC_Channel_10选择ADC通道10ADC_Channel_2选择ADC通道2ADC_Channel_11选择ADC通道11ADC_Channel_3选择ADC通道3ADC_Channel_12选择ADC通道12ADC_Channel_4选择ADC通道4ADC_Channel_13选择ADC通道13ADC_Channel_5选择ADC通道5ADC_Channel_14选择ADC通道14ADC_Channel_6选择ADC通道6ADC_Channel_15选择ADC通道15ADC_Channel_7选择ADC通道7ADC_Channel_16选择ADC通道16ADC_Channel_8选择ADC通道8ADC_Channel_17选择ADC通道17ADC_SampleTime:设定了选中通道的ADC采样时间ADC_SampleTime描述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周期12.3ADC相关库函数12.3.4函数ADC_InjectedChannleConfig函数名ADC_InjectedChannleConfig函数原形voidADC_InjectedChannelConfig(ADC_TypeDef*ADCx,u8ADC_Channel,u8Rank,u8ADC_SampleTime)功能描述设置指定ADC的注入组通道,设置它们的转化顺序和采样时间输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2ADC_Channel:被设置的ADC通道输入参数3Rank:规则组采样顺序。取值范围1到4。输入参数4ADC_SampleTime:指定ADC通道的采样时间值参阅章节ADC_SampleTime查阅更多该参数允许取值范围输出参数无返回值无先决条件之前必须调用函数ADC_InjectedSequencerLengthConfig来确定注入转换通道的数目。特别是在通道数目小于4的情况下,来正确配置每个注入通道的转化顺序。被调用函数无ADC_Channel:参数ADC_Channel指定了需设置的ADC通道。ADC_SampleTime:ADC_SampleTime设定了选中通道的ADC采样时间。例:ADC_InjectedChannelConfig(ADC1,ADC_Channel_12,2,ADC_SampleTime_28Cycles5);12.3ADC相关库函数12.3.5函数ADC_Cmd函数名ADC_Cmd函数原形voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalStateNewState)功能描述使能或者失能指定的ADC输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2NewState:外设ADCx的新状态这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无12.3.6函数ADC_ResetCalibration函数名ADC_ResetCalibration函数原形voidADC_ResetCalibration(ADC_TypeDef*ADCx)功能描述重置指定的ADC的校准寄存器输入参数ADCx:x可以是1、2或3来选择ADC外设输出参数无返回值无先决条件无被调用函数无例:/*EnableADC1*/ADC_Cmd(ADC1,ENABLE);例:/*ResettheADC1Calibrationregisters*/ADC_ResetCalibration(ADC1);12.3ADC相关库函数12.3.7函数ADC_GetResetCalibrationStatus函数名ADC_GetResetCalibrationStatus函数原形FlagStatusADC_GetResetCalibrationStatus(ADC_TypeDef*ADCx)功能描述获取ADC重置校准寄存器的状态输入参数ADCx:x可以是1、2或3来选择ADC外设输出参数无返回值ADC重置校准寄存器的新状态(SET或者RESET)先决条件无被调用函数无12.3.8函数ADC_StartCalibration函数名ADC_StartCalibration函数原形voidADC_StartCalibration(ADC_TypeDef*ADCx)功能描述开始指定ADC的校准状态输入参数ADCx:x可以是1、2或3来选择ADC外设输出参数无返回值无先决条件无被调用函数无例:/*GettheADC2resetcalibrationregistersstatus*/FlagStatusStatus;Status=ADC_GetResetCalibrationStatus(ADC2);例:/*StarttheADC2Calibration*/ADC_StartCalibration(ADC2);12.3ADC相关库函数12.3.9函数ADC_GetCalibrationStatus函数名ADC_GetCalibrationStatus函数原形FlagStatusADC_GetCalibrationStatus(ADC_TypeDef*ADCx)功能描述获取指定ADC的校准程序输入参数ADCx:x可以是1、2或3来选择ADC外设输出参数无返回值ADC校准的新状态(SET或者RESET)先决条件无被调用函数无函数名ADC_GetCalibrationStatus12.3.10函数ADC_SoftwareStartConvCmd函数名ADC_SoftwareStartConvCmd函数原形voidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState)功能描述使能或者失能指定的ADC的软件转换启动功能输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2NewState:指定ADC的软件转换启动新状态

这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无例:/*GettheADC2calibrationstatus*/FlagStatusStatus;Status=ADC_GetCalibrationStatus(ADC2);例:/*StartbysoftwaretheADC1Conversion*/ADC_SoftwareStartConvCmd(ADC1,ENABLE);12.3ADC相关库函数12.3.11函数ADC_GetConversionValue函数名ADC_GetConversionValue函数原形u16ADC_GetConversionValue(ADC_TypeDef*ADCx)功能描述返回最近一次ADCx规则组的转换结果输入参数ADCx:x可以是1、2或3来选择ADC外设输出参数无返回值转换结果先决条件无被调用函数无12.3.13函数ADC_DMACmd函数名ADC_DMACmd函数原形ADC_DMACmd(ADC_TypeDef*ADCx,FunctionalStateNewState)功能描述使能或者失能指定的ADC的DMA请求输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2NewState:ADCDMA传输的新状态这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无例:/*ReturnstheADC1Masterdatavalueofthelastconvertedchannel*/u16DataValue;DataValue=ADC_GetConversionValue(ADC1);例:/*EnableADC2DMAtransfer*/ADC_DMACmd(ADC2,ENABLE);12.3ADC相关库函数12.3.12函数ADC_GetFlagStatus函数名ADC_GetFlagStatus函数原形FlagStatusADC_GetFlagStatus(ADC_TypeDef*ADCx,u8ADC_FLAG)功能描述检查制定ADC标志位置1与否输入参数1ADCx:x可以是1、2或3来选择ADC外设输入参数2ADC_FLAG:指定需检查的标志位

参阅章节ADC_FLAG查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无ADC_FLAG:

设置ADC工作在独立或者双ADC模式ADC_AnalogWatchdog描述ADC_FLAG_AWD模拟看门狗标志位ADC_FLAG_EOC转换结束标志位ADC_FLAG_JEOC注入组转换结束标志位ADC_FLAG_JSTRT注入组转换开始标志位ADC_FLAG_STRT规则组转换开始标志位例:/*TestiftheADC1EOCflagissetornot*/FlagStatusStatus;Status=ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC);12.4项目实例本节带领大家实现四通道模拟量采集与显示项目12.4项目实例12.4.1项目分析实验板提供4路模拟信号输入电路,分别的连接至微控制器的PA0-PA3引脚,又查表12-2可知该4路模拟输入信号在微控制器内部分别连接至ADC1、ADC2和ADC3的通道0至通道3。12.4项目实例12.4.1项目分析开启时钟及分频需要打开ADC1时钟、GPIOA时钟和AFIO时钟,并对系统时钟6分频作为ADC时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);01设置GPIO口的模式在作为ADC输入的时候,GPIO口应该配置为是:模拟输入(即:GPIO_Mode_AIN)。02进行ADC模式的初始化ADC的初始化我们可以调用库函数的ADC_Init()。它有两个输入参数:第一个参数是选择你要设置的ADC,我们使用ADC1,所以设置为:ADC1。第二个参数是传递一个结构体的指针。ADC_Mode:表示ADC的模式,我们使用独立模式(ADC_Mode_Independent)。ADC_ScanConvMode:表示ADC是否使用扫描模式,这里不使用,所以设置为:DISABLE。ADC_ContinuousConvMode:表示ADC是否使用连续模式,也就是一直转换。是单次转换,设置为:DISABLE。ADC_ExternalTrigConv:表示触发方式,我们这里是软件触发,所以设置为:ADC_ExternalTrigConv_None。ADC_DataAlign:表示存储数据的对齐方式。我们使用右对齐,所以设置为:ADC_DataAlign_Right。ADC_NbrOfChannel:表示顺序进行规则转换的通道数,我们一次只转换一个通道,所以我们可以把这个设置为:1。0312.4项目实例12.4.1项目分析复位ADC校准,然后检测复位ADC校准是否完成ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态05开启ADC校准,然后等待ADC校准开启成功ADC_StartCalibration(ADC1);//开始指定ADC的校准状态while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序06设置采样周期和选择通道我们可以用ADC_RegularChannelConfig()函数,它有4个参数:参数1用于选择ADC,此处选择ADC1,参数2用于设置采样通道,我们共采集4个通道,通道号为0~3,每次选择一个通道,程序切换。参数3为所选通道采样顺序,参数4用于设置采样周期。ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);07开启ADC使能ADC_Cmd(ADC1,ENABLE);//打开ADC使能0412.4项目实例12.4.1项目分析等待转换完成,并读取转换结果读取转换结果可以使用ADC_GetConversionValue()函数,它返回最后一次规则转换结果。它有一个参数,用来选择读取哪个ADC的转换结果,设置为ADC1while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束09开始转换我们使用的是软件触发功能,所以要软件开启转换。ADC_SoftwareStartConvCmd(ADC1,ENABLE);0812.4项目实例第一步:复制第11章创建工程模板文件夹到桌面,并将文件夹改名为“11ADC”,将原工程模板编译一下,直到没有错误和警告为止。10OLED11ADC第二步:为工程模板的“ST_Driver”项目组添加STM32标准外设ADC库函数源文件“stm32f10x_adc.c”,该文件位于“..\Libraries\STM32F10x_StdPeriph_Driver\src”目录下。12.4.2项目实施12.4项目实例项目实施第三步:点击“File/New”新建两个文件,将其改名为ADC.C和ADC.H并保存到工程模板下的APP文件夹中。并将ADC.C文件添加到APP项目组下。第四步:在ADC.H文件中输入如下源程序,其中条件编译格式不变,只要更改一下预定义变量名称即可,需要将我们刚定义函数的声明加到头文件当中。参考代码如下:#ifndef_ADC_H#define_ADC_H#include"stm32f10x.h"voidadc1_init(void);#endif12.4项目实例第四步:在ADC.C文件中输入如下源程序,在程序中首先包含ADC.H头文件,然后创建adc1_init()初始化函数,函数用于完成对ADC1的初始化工作。#include"ADC.H"voidadc1_init(){GPIO_InitTypeDefGPIO_InitStructure;ADC_InitTypeDefADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);

//配置ADC-CLK为6分频72/6=12MGPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;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;ADC_Init(ADC1,&ADC_InitStructure);ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_SoftwareStartConvCmd(ADC1,ENABLE);}项目实施参考程序代码12.4项目实例第五步:在main.h文件的中间部分添加“#include"ADC.H"”语句,即包含ADC.H头文件,任何时候程序中需要使用某一源文件中函数,必须先包含其头文件,否则编译是不能通过的。项目实施第五步参考代码如下:#ifndef_MAIN_H#define_MAIN_H#include"stm32f10x.h"#include"LED.h"#include"beepkey.h"#include"dsgshow.h"#include"EXTI.H“#include"timer.h“#include"USART.H“#include"OLED.H“#include"ADC.H"#endif12.4项目实例第七步:在main.c文件中输入如下源程序,在main函数当中首先选择一个通道,对其进行20次采样,然后进行均值滤波,调用显示函数进行动态显示,全部通道采集完成之后再重新开始采集,如此循环。项目实施include“main.h"u8hour,minute,second;externu8smgduan[11];externu16smgwei[6];voidShowADval(u8cnum,u32ADVal)//显示AD转换后的数值{u16i,j;for(i=0;i<6000;i++){GPIO_Write(GPIOE,smgwei[0]);GPIO_Write(GPIOG,smgduan[cnum+1]);//显示通道号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论