《第15章 模拟数字转换器ADC(自学内容)ppt课件.ppt》由会员分享,可在线阅读,更多相关《第15章 模拟数字转换器ADC(自学内容)ppt课件.ppt(66页珍藏版)》请在三一办公上搜索。
1、第15章 模拟/数字转换器(ADC),12位 ADC 是一种逐次逼近型模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值值。,一、ADC的构成1、主要特征12位分辨率转换结束,注入转换结束和发生模拟看门狗事件时产生中断单次和连续转换模式从通道0到通道n的自动扫描模式自校准带内嵌数据一致的数据对齐通道之间采样间隔可编程,规则转换和注入转换均有外部触发选项间断模式双重模式(带2个ADC的器件)ADC
2、转换速率1MHz ADC供电要求:2.4V 到 3.6VADC输入范围:VREF-VIN VREF+规则通道转换期间有DMA请求产生。,2、内部框图,3、引脚描述,二、ADC的功能描述1、ADC 开关控制通过设置 ADC_CR1 寄存器的 ADON 位可给 ADC 上电。当第一次设置 ADON 位时,它将 ADC 从断电状态下唤醒;ADC 上电延迟一段时间后(tSTAB),再次设置ADON 位时开始进行转换;通过清除ADON位可以停止转换,并将 ADC 置于断电模式。,2、ADC 时钟由时钟控制器提供的 ADCCLK 时钟和 PCLK2(APB2时钟)同步,CLK 控制器为 ADC 时钟提供一
3、个专用的可编程预分频器。,3、通道选择有16个多路通道。可以把转换分成两组:规则组和注入组。可以在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1 寄存器的L3:0位中。,注入组由多达4个转换组成。注入通道和它们的转换顺序在 ADC_JSQR 寄存器中选择。注入组里的转换总数目写入 ADC_JSQR 寄存器的L1:0位中。温度传感器和通道 ADC_IN16 相连接,内部参考电
4、压 VREFINT 和 ADC_IN17 相连接。可以按注入或规则通道对这两个内部通道进行转换。,4、单次转换模式单次转换模式里,ADC只执行一次转换。一旦选择通道的转换完成:如果一个规则通道被转换:转换数据被储存在16位ADC_DR寄存器中,EOC(转换结束)标志被设置,如果设置了EOCIE,则产生中断。如果一个注入通道被转换:转换数据被储存在16位的ADC_DRJ1寄存器中,JEOC(注入转换结束)标志被设置,如果设置了JEOCIE 位,则产生中断。然后ADC停止。,5、连续转换模式在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。每个转换后:如果一个规则通道被转换:转换数据被
5、储存在16位的ADC_DR 寄存器中,EOC(转换结束)标志被设置,如果设置了EOCIE,则产生中断。如果一个注入通道被转换:转换数据被储存在16位的ADC_DRJ1寄存器中,JEOC(注入转换结束)标志被设置,如果设置了JEOCIE 位,则产生中断。,6、时序图ADC在开始精确转换前需要一个稳定时间tSTAB。在开始ADC转换和14个时钟周期后,EOC标志被设置,16位ADC数据寄存器包含转换的结果。,8、扫描模式此模式用来扫描一组模拟通道。在每个组的每个通道上执行单次转换,在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从
6、选择组的第一个通道继续转换。如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。,三、校准 ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。注意:1、建议在每次上电后执行校准。2、启动校准前,ADC必须处于关电状态(ADON=0)超过至少两个ADC时钟周期。,校准时间框图,四、数据对齐 数据可以左对齐或右对齐。数据右对齐(注入组),数据右对齐(规则组),数据左对齐(注入组
7、),数据左对齐(规则组),五、可编程的通道采样时间ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP2:0位而更改。每个通道可以以不同的时间采样。总转换时间如下计算:TCONV=采样时间+12.5个周期例如:当ADCCLK=14MHz,则1.5周期的采样时间TCONV=1.5+12.5=14周期=1s,七、DMA请求因为规则通道转换的值储存在一个唯一的数据寄存器中,所以当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC
8、_DR寄存器传输到用户指定的目的地址。注入通道不能使用DMA。,DMA请求映像,八、温度传感器温度传感器可以用来测量器件周围的温度(TA)。温度传感器在内部和 ADC_IN16 输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入的采样时间必须大于2.2 s。当温度传感器没有被使用时,可以置于关电模式。主要特征支持的温范围:-40 到125 精确:+/-1.5C,温传感器和VREFINT通道框图 ADC_IN16(温度传感器)和ADC_IN17(VREFINT)的转换。,读取温度的方法选择ADCx_IN16输入通道选择采样时间大于2.2 s设置TSVREFE位,以唤醒关电模
9、式下的温度传感器通过设置ADON位启动ADC转换读ADC数据寄存器上的VSENSE 数据利用下列公式得出温度 温度(C)=(V25-VSENSE)/Avg_Slope+25 V25=VSENSE在 25C 时的数值(典型值=1.42V,对应于对应0 x6E2(1762D)Avg_Slope 温与VSENSE 曲线的平均斜(典型值=4.35mv/C,对应于0 x05/C),九、中断规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断,它们都有独立的中断使能位。,十、ADC固件库函数 ADC_Init 的使用方法,ADC_InitTypeDef 结构:该结构定义在 stm32f
10、10 x_adc.h 文件中。typedef struct u32 ADC_Mode;FunctionalState ADC_ScanConvMode;FunctionalState ADC_ContinuousConvMode;u32 ADC_ExternalTrigConv;u32 ADC_DataAlign;u8 ADC_NbrOfChannel;ADC_InitTypeDef,ADC_Mode 参数配置 ADC 工作在单/双模式.,ADC_ExternalTrigConv 参数设置规则通道使用外部触发启动 ADC 转换。,ADC_ScanConvMode 参数指定 ADC 工作在扫描模
11、式(多通道)还是单次(单通道)模式。如果设置为 ENABLE,就是扫描模式,设置 DISABLE 就是单次模式.ADC_ContinuousConvMode 参数指定转换是连续的还是单次的。如设置 ENABLE 就是连续的,设置 DISABLE 是单次的.ADC_NbrOfChannel 参数指定使用序列规则组中 ADC 通道的数目.可以取 1 到 16.ADC_DataAlign 参数指定数据对齐方式.,ADC_RegularChannelConfig 的使用方法,ADC_Channel 参数指定需要配置的 ADC 通道.,ADC_SampleTime 参数指定选择通道的 ADC 采样时间.
12、,ADC_AnalogWatchdogThresholdsConfig 的使用方法,ADC_AnalogWatchdogCmd 的使用方法,ADC_AnalogWatchdog 参数配置 ADC 的模拟看门狗.,ADC_AnalogWatchdogSingleChannelConfig 的使用方法,ADC_ITConfig 的使用方法,ADC_IT 参数取下列值:,ADC_ResetCalibration 函数的使用方法,ADC_GetResetCalibrationStatus 函数的使用方法,ADC_StartCalibration 函数的使用方法,ADC_SoftwareStartCon
13、vCmd 函数的使用方法,ADC_DMACmd 函数的使用方法,ADC_ClearITPendingBit 函数的使用方法,例:采用DMA通道1将ADC1的通道14的数据连续转换结果放到变量ADC_ConvertedValue中,采用软件启动,采样周期为55.5个周期。/*定义*/#define ADC1_DR_Address(u32)0 x4001244C)/*定义变量和结构*/ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;vu16 ADC_ConvertedValue;ErrorStatus HSES
14、tartUpStatus;,/*DMA通道1初始化,因ADC1接在这个通道上*/DMA_DeInit(DMA_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize=1;DMA_InitStructure.DMA_PeripheralI
15、nc=DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;,DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;DMA_InitStructure.DMA_Priority=DM
16、A_Priority_High;DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA_Channel1,&DMA_InitStructure);/*使能DMA通道1*/DMA_Cmd(DMA_Channel1,ENABLE);,/*ADC1配置*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode=DISABLE;ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;ADC_InitS
17、tructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel=1;ADC_Init(ADC1,&ADC_InitStructure);,/*配置ADC1规则通道14*/ADC_RegularChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_55Cycles5);/*使能ADC1的DMA*/ADC_DMACmd(ADC1,E
18、NABLE);/*使能ADC1*/ADC_Cmd(ADC1,ENABLE);/*使能ADC1的复位校准寄存器*/ADC_ResetCalibration(ADC1);,/*检测ADC1的复位校准是否结束*/while(ADC_GetResetCalibrationStatus(ADC1);/*启动ADC1校准*/ADC_StartCalibration(ADC1);/*检测ADC1的校准是否结束*/while(ADC_GetCalibrationStatus(ADC1);/*软件启动ADC1转换*/ADC_SoftwareStartConvCmd(ADC1,ENABLE);,STM32实验平台
19、上电位器的电路图是:,STM32实验平台上CPU的管脚图是:,GPIO的配置程序是:void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/*配置 PC.04(ADC Channel14)作为模拟输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOC,在RCC配置程序里要开启DMA和AD的时钟/*使能 DMA 时钟*/RCC_AHBPeriphClockCmd(RCC_AH
20、BPeriph_DMA,ENABLE);/*使能 ADC1 和 GPIOC 时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);,例:采用ADC1的通道14进行数据连续转换,用模拟看门狗检测ADC1的通道14的模拟输入量(当ADC的模拟输入量在窗口之外,将点亮LED1灯),采用软件启动,采样周期为13.5个周期。/*定义结构*/ADC_InitTypeDef ADC_InitStructure;,/*配置ADC1*/ADC_InitStructure.ADC_Mode=ADC_Mode_Inde
21、pendent;ADC_InitStructure.ADC_ScanConvMode=DISABLE;ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel=1;ADC_Init(ADC1,&ADC_InitStructure);,/*配置ADC1规则通道
22、14*/ADC_RegularChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_13Cycles5);/*设置高低模拟看门狗阈值*/ADC_AnalogWatchdogThresholdsConfig(ADC1,0 x0B00,0 x0300);/*配置通道14为单模拟看门狗保证通道*/ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_14);/*在一个规则通道上使能模拟看门狗*/ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_Single
23、Reg(Enable);,/*使能AWD中断*/ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);/*使能ADC1*/ADC_Cmd(ADC1,ENABLE);/*使能ADC1复位校准寄存器*/ADC_ResetCalibration(ADC1);/*检测ADC1的复位校准寄存器结束*/while(ADC_GetResetCalibrationStatus(ADC1);/*启动ADC1校准*/ADC_StartCalibration(ADC1);,/*检测ADC1校准结束*/while(ADC_GetCalibrationStatus(ADC1);/*用软件启动ADC1
24、的数据转换*/ADC_SoftwareStartConvCmd(ADC1,ENABLE);/*ADC1的中断服务程序*/void ADC_IRQHandler(void)/*清ADC1的AWD中断登记位*/ADC_ClearITPendingBit(ADC1,ADC_IT_AWD);,STM32实验平台上电位器的电路图是:,STM32实验平台上CPU的管脚图是:,在GPIO配置程序中增加下列代码:/*配置 PC.04(ADC Channel14)作为模拟输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode
25、=GPIO_Mode_AIN;GPIO_Init(GPIOC,在NVIC配置程序中增加下列代码:/*配置和使能 ADC 中断*/NVIC_InitStructure.NVIC_IRQChannel=ADC_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(,例:采用DMA存储ADC1的64个采样点的值,选用AD
26、C1的通道4和14为规则通道,ADC1的通道10和11为注入通道。规则通道采用间断模式,间断数为1,转换为外部触发EXTI-11,每次触发只转换一个通道;注入通道采用外部出发EXTI-15。转化时间均为28.5时钟周期,数据采用右对齐。,/*定义*/#define ADC1_DR_Address(u32)0 x4001244C)vu32 Index=0;/*定义变量与结构*/ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;vu16 ADC_RegularConvertedValueTab64,ADC_Inj
27、ectedConvertedValueTab32;ErrorStatus HSEStartUpStatus;,/*配置DMA通道1*/DMA_DeInit(DMA_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC_RegularConvertedValueTab;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize
28、=64;DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;,DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode=DMA_Mode_Circul
29、ar;DMA_InitStructure.DMA_Priority=DMA_Priority_High;DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA_Channel1,&DMA_InitStructure);/*使能DMA通道1*/DMA_Cmd(DMA_Channel1,ENABLE);,/*配置ADC1*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode=ENABLE;ADC_InitStructure.ADC_
30、ContinuousConvMode=DISABLE;ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_Ext_IT11;ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel=2;ADC_Init(ADC1,&ADC_InitStructure);,/*配置ADC1规则通道*/ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1,ADC_SampleTime_28Cyc
31、les5);ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_28Cycles5);/*配置规则通道间断模式数*/ADC_DiscModeChannelCountConfig(ADC1,1);/*使能规则通道间断模式*/ADC_DiscModeCmd(ADC1,ENABLE);/*使能ADC1的外部触发转换*/ADC_ExternalTrigConvCmd(ADC1,ENABLE);,/*配置注入序列长度*/ADC_InjectedSequencerLengthConfig(ADC1,2);/*配置ADC1的注入通道*/
32、ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_28Cycles5);ADC_InjectedChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_28Cycles5);/*设置ADC1注入通道为外部触发*/ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_Ext_IT15);/*使能ADC1注入外部触发转换*/ADC_ExternalTrigInjectedConvCmd(ADC1,EN
33、ABLE);,/*使能JEOC中断*/ADC_ITConfig(ADC1,ADC_IT_JEOC,ENABLE);/*使能ADC1 DMA*/ADC_DMACmd(ADC1,ENABLE);/*使能ADC1*/ADC_Cmd(ADC1,ENABLE);/*使能ADC1复位校准寄存器*/ADC_ResetCalibration(ADC1);/*检查ADC1的复位校准结束了吗*/while(ADC_GetResetCalibrationStatus(ADC1);/*启动ADC1校准*/ADC_StartCalibration(ADC1);/*检查ADC1校准结束了吗*/while(ADC_GetC
34、alibrationStatus(ADC1);,void ADC_IRQHandler(void)/*清除ADC1的注入中断标志JEOC*/ADC_ClearITPendingBit(ADC1,ADC_IT_JEOC);/*读取注入通道10和11的转化结果*/ADC_InjectedConvertedValueTabIndex+=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);ADC_InjectedConvertedValueTabIndex+=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);if(Index=32)Index=0;,