
第15章-模拟数字转换器ADC(自学内容)...ppt
66页第15章 模拟/数字转换器(ADC) 12位 ADC 是一种逐次逼近型模拟数字转换器它有18个通道,可测量16个外部和2个内部信号源各通道的 A/D 转换可以单次、连续、扫描或间断模式执行ADC 的结果可以左对齐或右对齐方式存储在16位数据寄存器中 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值值 一、一、ADCADC的构成的构成1 1、主要特征、主要特征l l1212位分辨率位分辨率l l转换结束,注入转换结束和发生模拟看门狗事件转换结束,注入转换结束和发生模拟看门狗事件时产生中断时产生中断l l单次和连续转换模式单次和连续转换模式l l从通道从通道0 0到通道到通道n n的自动扫描模式的自动扫描模式l l自校准自校准l l带内嵌数据一致的数据对齐带内嵌数据一致的数据对齐l l通道之间采样间隔可编程通道之间采样间隔可编程l l规则转换和注入转换均有外部触发选项规则转换和注入转换均有外部触发选项l l间断模式间断模式l l双重模式双重模式( (带带2 2个个ADCADC的器件的器件) ) l lADCADC转换速率转换速率1MHz ADC1MHz ADC供电要求:供电要求:2.4V 2.4V 到到 3.6V3.6Vl lADCADC输入范围:输入范围:VREF-≤ VIN ≤ VREF+VREF-≤ VIN ≤ VREF+l l规则通道转换期间有规则通道转换期间有DMADMA请求产生。
请求产生2 2、内部框图、内部框图名称名称信号类型信号类型注解注解VREF+ VREF+ 输入,模拟参考正输入,模拟参考正极极ADCADC使用的高端使用的高端/ /正极参考电压,正极参考电压,VSSA VSSA ≤ VREF+ ≤ VDDA ≤ VREF+ ≤ VDDA VDDA VDDA 输入,模拟电源输入,模拟电源等效于等效于VDDVDD的模拟电源且:的模拟电源且:2.4V ≤ 2.4V ≤ VDDA ≤ VDD(3.6V) VDDA ≤ VDD(3.6V) VREF-VREF-输入,模拟参考负输入,模拟参考负极极ADCADC使用的低端使用的低端/ /负极参考电压,负极参考电压,VREF-= VREF-= VSSA VSSA VSSA VSSA 输入,模拟电源地输入,模拟电源地等效于等效于VSSVSS的模拟电源地的模拟电源地ADC_IN[15:0] ADC_IN[15:0] 模拟输入信号模拟输入信号16 16 个模拟输入通道个模拟输入通道EXTSEL[2:0] EXTSEL[2:0] 输入,数字输入,数字开始规则成组转换的六个外部触发信号开始规则成组转换的六个外部触发信号JEXTSEL[2:0] JEXTSEL[2:0] 输入,数字输入,数字开始注入成组转换的六个外部触发信号开始注入成组转换的六个外部触发信号3 3、引脚描述、引脚描述二、二、ADCADC的功能描述的功能描述1 1、、ADC ADC 开关控制开关控制l l通过设置通过设置 ADC_CR1 ADC_CR1 寄存器的寄存器的 ADON ADON 位可给位可给 ADC ADC 上电。
当第一次设置上电当第一次设置 ADON ADON 位时,它将位时,它将 ADC ADC 从从断电状态下唤醒;断电状态下唤醒;l lADC ADC 上电延迟一段时间后上电延迟一段时间后( (tSTABtSTAB) ),再次设置,再次设置ADON ADON 位时开始进行转换;位时开始进行转换;l l通过清除通过清除ADONADON位可以停止转换,并将位可以停止转换,并将 ADC ADC 置于置于断电模式断电模式2 2、、ADC ADC 时钟时钟由时钟控制器提供的由时钟控制器提供的 ADCCLK ADCCLK 时钟和时钟和 PCLK2(APB2PCLK2(APB2时钟时钟) )同步,同步,CLK CLK 控制器为控制器为 ADC ADC 时钟提供一个专时钟提供一个专用的可编程预分频器用的可编程预分频器 3 3、通道选择、通道选择l l有有1616个多路通道可以把转换分成两组:个多路通道可以把转换分成两组:规则组规则组和注入组和注入组可以在任意多个通道上以任意顺序进可以在任意多个通道上以任意顺序进行的一系列转换构成成组转换例如,可以如下行的一系列转换构成成组转换例如,可以如下顺序完成转换:通道顺序完成转换:通道3 3、通道、通道8 8、通道、通道2 2、通道、通道2 2、、通道通道0 0、通道、通道2 2、通道、通道2 2、通道、通道1515。
l l规则组由多达规则组由多达1616个转换组成个转换组成规则通道和它们的规则通道和它们的转换顺序在转换顺序在ADC_SQRxADC_SQRx寄存器中选择规则组中转寄存器中选择规则组中转换的总数写入换的总数写入ADC_SQR1 ADC_SQR1 寄存器的寄存器的L[3:0]L[3:0]位中l l注入组由多达注入组由多达4 4个转换组成个转换组成注入通道和它们的转注入通道和它们的转换顺序在换顺序在 ADC_JSQR ADC_JSQR 寄存器中选择注入组里的转寄存器中选择注入组里的转换总数目写入换总数目写入 ADC_JSQR ADC_JSQR 寄存器的寄存器的L[1:0]L[1:0]位中l l温度传感器和通道温度传感器和通道 ADC_IN16 ADC_IN16 相连接,内部参考电相连接,内部参考电压压 VREFINT VREFINT 和和 ADC_IN17 ADC_IN17 相连接可以按注入或相连接可以按注入或规则通道对这两个内部通道进行转换规则通道对这两个内部通道进行转换4 4、单次转换模式、单次转换模式单次转换模式里,单次转换模式里,ADCADC只执行一次转换只执行一次转换。
一旦选择一旦选择通道的转换完成:通道的转换完成:l l如果一个规则通道被转换:转换数据被储存在如果一个规则通道被转换:转换数据被储存在1616位位ADC_DRADC_DR寄存器中,寄存器中,EOC(EOC(转换结束转换结束) )标志被设置,标志被设置,如果设置了如果设置了EOCIEEOCIE,则产生中断则产生中断l l如果一个注入通道被转换:转换数据被储存在如果一个注入通道被转换:转换数据被储存在1616位的位的ADC_DRJ1ADC_DRJ1寄存器中,寄存器中,JEOC( JEOC( 注入转换结束注入转换结束) )标标志被设置,如果设置了志被设置,如果设置了JEOCIE JEOCIE 位,则产生中断位,则产生中断l l然后然后ADCADC停止 5 5、连续转换模式、连续转换模式在连续转换模式中,当前面在连续转换模式中,当前面ADCADC转换一结束马上就转换一结束马上就启动另一次转换启动另一次转换每个转换后:每个转换后:l l如果一个规则通道被转换:转换数据被储存在如果一个规则通道被转换:转换数据被储存在1616位位的的ADC_DR ADC_DR 寄存器中,寄存器中,EOC(EOC(转换结束转换结束) )标志被设置,标志被设置,如果设置了如果设置了EOCIEEOCIE,则产生中断。
则产生中断l l如果一个注入通道被转换:转换数据被储存在如果一个注入通道被转换:转换数据被储存在1616位位的的ADC_DRJ1ADC_DRJ1寄存器中,寄存器中,JEOC(JEOC(注入转换结束注入转换结束) )标志被标志被设置,如果设置了设置,如果设置了JEOCIE JEOCIE 位,则产生中断位,则产生中断 6 6、时序图、时序图ADCADC在开始精确转换前需要一个稳定时间在开始精确转换前需要一个稳定时间tSTABtSTAB 在开始在开始ADCADC转换和转换和1414个时钟周期后,个时钟周期后,EOCEOC标志被设置,标志被设置,1616位位ADCADC数据寄存器包含转换的结果数据寄存器包含转换的结果8 8、扫描模式、扫描模式此模式用来扫描一组模拟通道此模式用来扫描一组模拟通道l l在每个组的每个通道上执行单次转换,在每个组的每个通道上执行单次转换,在每个转在每个转换结束时,同一组的下一个通道被自动转换换结束时,同一组的下一个通道被自动转换如果设置了果设置了CONTCONT位,转换不会在选择组的最后一个位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继通道上停止,而是再次从选择组的第一个通道继续转换。
续转换l l如果设置了如果设置了DMADMA位,在每次位,在每次EOCEOC后,后,DMADMA控制器把控制器把规则组通道的转换数据传输到规则组通道的转换数据传输到SRAMSRAM中而注入通中而注入通道转换的数据总是存储在道转换的数据总是存储在ADC_JDRxADC_JDRx寄存器中寄存器中 三、校准三、校准 l lADCADC有一个内置自校准模式校准可大幅减小因内有一个内置自校准模式校准可大幅减小因内部电容器组的变化而造成的准精度误差部电容器组的变化而造成的准精度误差l l通过设置通过设置ADC_CR2ADC_CR2寄存器的寄存器的CALCAL位启动校准一旦校位启动校准一旦校准结束,准结束,CALCAL位被硬件复位,可以开始正常转换位被硬件复位,可以开始正常转换注意:注意: 1 1、建议在每次上电后执行校准建议在每次上电后执行校准2 2、启动校准前,、启动校准前,ADCADC必须处于关电状态必须处于关电状态(ADON=’0’)(ADON=’0’)超过至少两个超过至少两个ADCADC时钟周期时钟周期校准时间框图 四、数据对齐四、数据对齐 数据可以左对齐或右对齐数据可以左对齐或右对齐。
数据右对齐(注入组)数据右对齐(注入组)数据右对齐(数据右对齐(规则规则组)组)数据左对齐(注入组)数据左对齐(注入组)数据左对齐(数据左对齐(规则规则组)组)五、可编程的通道采样时间五、可编程的通道采样时间ADCADC使用若干个使用若干个ADC_CLKADC_CLK周期对输入电压采样,采样周期对输入电压采样,采样周期数目可以通过周期数目可以通过ADC_SMPR1ADC_SMPR1和和ADC_SMPR2ADC_SMPR2寄存器中寄存器中的的SMP[2:0]SMP[2:0]位而更改每个通道可以以不同的时间位而更改每个通道可以以不同的时间采样总转换时间如下计算:总转换时间如下计算:TCONV = TCONV = 采样时间采样时间 + 12.5+ 12.5个周期个周期例如:当例如:当ADCCLK=14MHzADCCLK=14MHz,则,则1.51.5周期的采样时间周期的采样时间TCONV = 1.5 + 12.5 = 14TCONV = 1.5 + 12.5 = 14周期周期 = 1= 1µ µs s 七、七、DMADMA请求请求l l因为规则通道转换的值储存在一个唯一的数据寄因为规则通道转换的值储存在一个唯一的数据寄存器中,所以当转换多个规则通道时需要使用存器中,所以当转换多个规则通道时需要使用DMADMA,这可以避免丢失已经存储在,这可以避免丢失已经存储在ADC_DRADC_DR寄存器寄存器中的数据。
中的数据l l只有在规则通道的转换结束时才产生只有在规则通道的转换结束时才产生DMADMA请求,请求,并将转换的数据从并将转换的数据从ADC_DRADC_DR寄存器传输到用户指定寄存器传输到用户指定的目的地址的目的地址l l注入通道不能使用注入通道不能使用DMADMADMA请求映像 DMADMASW TRIGGERDMA DMA 请求请求ORORADC1TIM2_CC3TIM4_CC1SW TRIGGERORORUSART3_TXSW TRIGGERORORSW TRIGGERORORSW TRIGGERORORSW TRIGGERORORSW TRIGGEROROR高优先级请求高优先级请求低优先级请求低优先级请求通道通道1 1TIM1_CC1TIM2_UPTIM3_CC3SPI1_RXUSART3_RXTIM1_CC2SPI1_TXTIM3_CC4TIM3_UPSPI2_RXI2C2_TXTIM1_CC4USART1_TXTIM1_CCUTIM1_TRIGTIM4_CC2USART1_RXTIM1_UPSPI2_TXI2C2_RXTIM2_CC1TIM4_CC3USART2_RXTIM1_CC3TIM3_CC1I2C1_TXTIM3_TRIGUSART2_TXTIM2_CC2TIM2_CC4TIM4_UPI2C1_RX通道通道2 2通道通道3 3通道通道4 4通道通道5 5通道通道6 6通道通道7 7八、温度传感器八、温度传感器温度传感器可以用来测量器件周围的温度温度传感器可以用来测量器件周围的温度(TA)(TA)。
温度传感器在内部和温度传感器在内部和 ADC_IN16 ADC_IN16 输入通道相连接,输入通道相连接,此通道把传感器输出的电压转换成数字值温度此通道把传感器输出的电压转换成数字值温度传感器模拟输入的采样时间必须大于传感器模拟输入的采样时间必须大于2.2 2.2 µ µs s当温度传感器没有被使用时,可以置于关电模式当温度传感器没有被使用时,可以置于关电模式1. 主要特征l支持的温度范围:-40 到125 度l精确度:+/- 1.5°C2.温温度度传感器和传感器和VREFINTVREFINT通道框图通道框图 ADC_IN16( ADC_IN16( 温度传感器温度传感器) )和和ADC_IN17(VREFINT)ADC_IN17(VREFINT)的转换 3.读取温度的方法l选择ADCx_IN16输入通道l选择采样时间大于2.2 μsl设置TSVREFE位,以唤醒关电模式下的温度传感器l通过设置ADON位启动ADC转换l读ADC数据寄存器上的VSENSE 数据l利用下列公式得出温度 温度(°C) = {(V25 - VSENSE)/Avg_Slope} + 25 V25 = VSENSE在 25°C 时的数值(典型值=1.42V,对应于对应0x6E2(1762D )) Avg_Slope = 温度与VSENSE 曲线的平均斜率 (典型值=4.35mv/°C,对应于0x05 /°C )九、中断九、中断规则和注入组转换结束时能产生中断,当模拟看规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断,它们都有独门狗状态位被设置时也能产生中断,它们都有独立的中断使能位。
立的中断使能位中断事件中断事件事件标志事件标志使能控制位使能控制位规则组转换结束规则组转换结束EOC EOC EOCIE EOCIE 注入组转换结束注入组转换结束JEOC JEOC JEOCIE JEOCIE 设置模拟看门狗状态位设置模拟看门狗状态位AWD AWD AWDIE AWDIE 十、ADC固件库函数l ADC_InitADC_Init 的使用方法函数原形函数原形void void ADC_Init(ADC_TypeDefADC_Init(ADC_TypeDef* * ADCxADCx, , ADC_InitTypeDefADC_InitTypeDef* * ADC_InitStructADC_InitStruct) ) 功能描述功能描述根据根据 ADC_InitStructADC_InitStruct 结构的内容初始化结构的内容初始化 ADCxADCx 接口接口. . 输入参数输入参数1 1ADCxADCx: : 其中其中 x x 可以是可以是 1 1 或或 2. 2. 输入参数输入参数2 2ADC_InitStructADC_InitStruct: : 指向指向 ADC_InitTypeDefADC_InitTypeDef 结结构构. . ADC_InitTypeDef 结构: 该结构定义在 stm32f10x_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_Mode描述ADC_Mode_Independent ADC1 和 ADC2 工作在独立模式ADC_Mode_RegInjecSimult ADC1 和 ADC2 工作在同时规则注入模式ADC_Mode_RegSimult_AlterTrig ADC1 和 ADC2 工作在同时规则和交替触发模式ADC_Mode_InjecSimult_FastInterl ADC1 和 ADC2 工作在同时注入和快速交替模式ADC_Mode_InjecSimult_SlowInterl ADC1 和 ADC2 工作在同时注入和慢速交替模式ADC_Mode_InjecSimult ADC1 和 ADC2 工作在同时注入模式ADC_Mode_RegSimult ADC1 和 ADC2 工作在同时规则模式ADC_Mode_FastInterl ADC1 和 ADC2 工作在快速交替模式ADC_Mode_SlowInterl ADC1 和 ADC2 工作在慢速交替模式ADC_Mode_AlterTrig ADC1 和 ADC2 工作在交替触发模式ADC_ExternalTrigConv 参数设置规则通道使用外部触发启动 ADC 转换。
ADC_ExternalTrigConv描述ADC_ExternalTrigConv_T1_CC1 外部触发转换选用通用定时器1的捕获比较器1 ADC_ExternalTrigConv_T1_CC2 外部触发转换选用通用定时器1的捕获比较器2ADC_ExternalTrigConv_T1_CC3 外部触发转换选用通用定时器1的捕获比较器3ADC_ExternalTrigConv_T2_CC2 外部触发转换选用通用定时器2的捕获比较器2ADC_ExternalTrigConv_T3_TRGO 外部触发转换选用通用定时器3的TRGOADC_ExternalTrigConv_T4_CC4 外部触发转换选用通用定时器4的捕获比较器4ADC_ExternalTrigConv_Ext_IT11 外部触发转换选用外部中断11事件ADC_ExternalTrigConv_None 软件启动转换ADC_ScanConvMode 参数指定 ADC 工作在扫描模式(多通道)还是单次(单通道)模式如果设置为 ENABLE ,就是扫描模式,设置 DISABLE 就是单次模式. ADC_ContinuousConvMode 参数指定转换是连续的还是单次的。
如设置 ENABLE 就是连续的,设置 DISABLE 是单次的. ADC_NbrOfChannel 参数指定使用序列规则组中 ADC 通道的数目. 可以取 1 到 16. ADC_DataAlign 参数指定数据对齐方式.ADC_DataAlign描述ADC_DataAlign_Right ADC 数据右对齐ADC_DataAlign_Left ADC 数据左对齐函数原形函数原形 void void ADC_RegularChannelConfig(ADC_TypeDefADC_RegularChannelConfig(ADC_TypeDef* * ADCxADCx, u8 , u8 ADC_ChannelADC_Channel, u8 Rank, u8 , u8 Rank, u8 ADC_SampleTimeADC_SampleTime) ) 功能描述功能描述 对选择的对选择的 ADC ADC 规则通道配置转换次序和采样时间规则通道配置转换次序和采样时间. . 输入参数输入参数1 1 ADCxADCx: : 其中其中 x x 可以是可以是 1 1 或或 2. 2. 输入参数输入参数2 2 ADC_ChannelADC_Channel: : 需要配置的需要配置的 ADC ADC 通道通道. . 输入参数输入参数3 3 Rank: Rank: 在规则组序列中的次序在规则组序列中的次序. . 范围是范围是 1 1 到到 16. 16. 输入参数输入参数4 4 ADC_SampleTimeADC_SampleTime: : 选择通道的采样时间值选择通道的采样时间值. . l ADC_RegularChannelConfigADC_RegularChannelConfig 的使用方法的使用方法ADC_ChannelADC_Channel 描述描述 ADC_Channel_0 ADC_Channel_0 选择选择 ADC ADC 的通道的通道0 0 ADC_Channel_1 ADC_Channel_1 选择选择 ADC ADC 的通道的通道1 1 ┅┅┅┅ADC_Channel_8ADC_Channel_8选择选择 ADC ADC 的通道的通道8 8 ┅┅┅┅ADC_Channel_16 ADC_Channel_16 选择选择 ADC ADC 的通道的通道16 16 ADC_Channel_17 ADC_Channel_17 选择选择 ADC ADC 的通道的通道17 17 ADC_Channel 参数指定需要配置的 ADC 通道. ADC_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 周期 l lADC_AnalogWatchdogThresholdsConfigADC_AnalogWatchdogThresholdsConfig 的使用的使用方法方法函数原形函数原形void void ADC_AnalogWatchdogThresholdsConfig(ADCADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef_TypeDef* * ADCxADCx, u16 , u16 HighThresholdHighThreshold, u16 , u16 LowThresholdLowThreshold) ) 功能描述功能描述配置模拟看门狗的高低阈值配置模拟看门狗的高低阈值 输入参数输入参数1 1ADCxADCx: : 其中其中x x 可以是可以是 1 1 或或 2. 2. 输入参数输入参数2 2HighThresholdHighThreshold: ADC : ADC 的模拟看门狗高阈值的模拟看门狗高阈值. .为为 12-bit 12-bit 值值. . 输入参数输入参数3 3LowThresholdLowThreshold: ADC: ADC的模拟看门狗低阈值的模拟看门狗低阈值. .为为 12-bit 12-bit 值值. . l ADC_AnalogWatchdogCmdADC_AnalogWatchdogCmd 的使用方法函数原形函数原形void void ADC_AnalogWatchdogCmd(ADC_TypeDefADC_AnalogWatchdogCmd(ADC_TypeDef* * ADCxADCx, u32 , u32 ADC_AnalogWatchdogADC_AnalogWatchdog) ) 功能描述功能描述使能或禁止模拟看门狗在一个或所有的规则或使能或禁止模拟看门狗在一个或所有的规则或注入通道注入通道输入参数输入参数1 1ADCxADCx: : 其中其中 x x 可以是可以是 1 1 或或 2. 2. 输入参数输入参数2 2ADC_AnalogWatchdogADC_AnalogWatchdog: : 配置配置 ADC ADC 的模拟看门的模拟看门狗狗. . ADC_AnalogWatchdog 参数配置 ADC 的模拟看门狗.ADC_AnalogWatchdog描述ADC_AnalogWatchdog_SingleRegEnable 模拟看门狗在一个单独的规则通道上ADC_AnalogWatchdog_SingleInjecEnable 模拟看门狗在一个单独的注入通道上ADC_AnalogWatchdog_SingleRegorInjecEnable 模拟看门狗在一个单独的规则或注入通道上ADC_AnalogWatchdog_AllRegEnable 模拟看门狗在所有的规则通道上ADC_AnalogWatchdog_AllInjecEnable 模拟看门狗在所有的注入通道上ADC_AnalogWatchdog_AllRegAllInjecEnable 模拟看门狗在所有的规则和注入通道上ADC_AnalogWatchdog_None 模拟看门狗不监督任何通道l ADC_AnalogWatchdogSingleChannelConfigADC_AnalogWatchdogSingleChannelConfig 的使用方法函数原形函数原形void void ADC_AnalogWatchdogSingleChannelConfig(ADADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDefC_TypeDef* * ADCxADCx, u8 , u8 ADC_ChannelADC_Channel) ) 功能描述功能描述配置模拟看门狗要监视的配置模拟看门狗要监视的ADCxADCx通道通道输入参数输入参数1 1ADCxADCx: : 其中其中 x x 可以是可以是 1 1 或或 2. 2. 输入参数输入参数2 2ADC_ChannelADC_Channel: : 需配置需配置 ADC ADC 的模拟看门狗通道的模拟看门狗通道. . l lADC_ITConfigADC_ITConfig 的使用方法的使用方法函数原形函数原形void void ADC_ITConfig(ADC_TypeDefADC_ITConfig(ADC_TypeDef* * ADCxADCx, , u16 ADC_IT, u16 ADC_IT, FunctionalStateFunctionalState NewStateNewState) ) 功能描述功能描述使能或禁止指定的使能或禁止指定的ADCADC中断中断 输入参数输入参数1 1ADCxADCx: : 其中其中x x 可以是可以是 1 1 或或 2. 2. 输入参数输入参数2 2ADC_IT : ADC_IT : 指定指定ADCADC的中断源的中断源输入参数输入参数3 3NewStateNewState: ENABLE : ENABLE 或或 DISABLE DISABLE ADC_IT 描述 ADC_IT_EOC EOC 中断允许 ADC_IT_AWD AWDOG 中断允许ADC_IT_JEOC JEOC 中断允许 ADC_IT 参数取下列值:l ADC_ResetCalibrationADC_ResetCalibration 函数的使用方法函数的使用方法l ADC_GetResetCalibrationStatusADC_GetResetCalibrationStatus 函数的使用方法函数的使用方法函数原形函数原形FlagStatusFlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDADC_GetResetCalibrationStatus(ADC_TypeDefef* * ADCxADCx) ) 功能描述功能描述得到得到ADCADC复位校准寄存器的状态复位校准寄存器的状态输入参数输入参数ADCxADCx: : 其中其中 x x 可以是可以是 1 1或或 2 2 返回参数返回参数SET SET 或或 RESET RESET 函数原形函数原形void void ADC_ResetCalibration(ADC_TypeDefADC_ResetCalibration(ADC_TypeDef* * ADCxADCx) ) 功能描述功能描述复位校准寄存器复位校准寄存器输入参数输入参数ADCxADCx: : 其中其中 x x 可以是可以是 1 1或或 2 2l ADC_StartCalibrationADC_StartCalibration 函数的使用方法函数的使用方法l ADC_SoftwareStartConvCmdADC_SoftwareStartConvCmd 函数的使用方法函数的使用方法函数原形函数原形void void ADC_SoftwareStartConvCmd(ADC_TypeDefADC_SoftwareStartConvCmd(ADC_TypeDef* * ADCxADCx, , FunctionalStateFunctionalState NewStateNewState) ) 功能描述功能描述使能或禁止使能或禁止ADCxADCx的软件启动转换的软件启动转换输入参数输入参数ADCxADCx: : 其中其中 x x 可以是可以是 1 1或或 2 2 返回参数返回参数NewStateNewState: ENABLE : ENABLE 或或 DISABLE DISABLE 函数原形函数原形void void ADC_StartCalibration(ADC_TypeDefADC_StartCalibration(ADC_TypeDef* * ADCxADCx) ) 功能描述功能描述开始校准过程开始校准过程输入参数输入参数ADCxADCx: : 其中其中 x x 可以是可以是 1 1或或 2 2l ADC_DMACmdADC_DMACmd 函数的使用方法函数的使用方法函数原形函数原形ADC_DMACmd(ADC_TypeDefADC_DMACmd(ADC_TypeDef* * ADCxADCx, , FunctionalStateFunctionalState NewStateNewState) ) 功能描述功能描述使能或禁止使能或禁止 ADC DMA ADC DMA 请求请求输入参数输入参数ADCxADCx: : 其中其中 x x 可以是可以是 1 1或或 2 2 返回参数返回参数NewStateNewState: ENABLE : ENABLE 或或 DISABLE DISABLE 函数原形函数原形void void ADC_ClearITPendingBit(ADC_TypeDefADC_ClearITPendingBit(ADC_TypeDef* * ADCxADCx, u16 ADC_IT) , u16 ADC_IT) 功能描述功能描述清除清除 ADCxADCx 的中断登记标志的中断登记标志输入参数输入参数ADCxADCx: : 其中其中 x x 可以是可以是 1 1或或 2 2 返回参数返回参数ADC_IT : ADC_IT : 需要清除的中断标志需要清除的中断标志 l ADC_ClearITPendingBitADC_ClearITPendingBit 函数的使用方法函数的使用方法例:采用DMA通道1将ADC1的通道14的数据连续转换结果放到变量ADC_ConvertedValue中,采用软件启动,采样周期为55.5个周期。
/* 定义 */#define ADC1_DR_Address ((u32)0x4001244C)/* 定义变量和结构 */ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;vu16 ADC_ConvertedValue;ErrorStatus HSEStartUpStatus; /* 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_PeripheralInc = 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 = 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 = 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规则通道14 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);/* 使能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_GetCalibrationStatus(ADC1)); /* 软件启动ADC1转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);STM32实验平台上电位器的电路图是: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, &GPIO_InitStructure);} 在RCC配置程序里要开启DMA和AD的时钟 /* 使能 DMA 时钟 */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_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_Independent; 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规则通道14 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_13Cycles5);/* 设置高低模拟看门狗阈值 */ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x0B00, 0x0300);/* 配置通道14为单模拟看门狗保证通道 */ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_14);/* 在一个规则通道上使能模拟看门狗 */ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleReg(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的数据转换 */ 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 = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure);在RCC配置程序里要开启AD的时钟/* 使能 ADC1 和 GPIOC 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);在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(&NVIC_InitStructure);例:采用DMA存储ADC1的64个采样点的值,选用ADC1的通道4和14为规则通道,ADC1的通道10和11为注入通道。
规则通道采用间断模式,间断数为1,转换为外部触发EXTI-11,每次触发只转换一个通道;注入通道采用外部出发EXTI-15转化时间均为28.5时钟周期,数据采用右对齐/* 定义 */#define ADC1_DR_Address ((u32)0x4001244C)vu32 Index = 0;/* 定义变量与结构 */ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;vu16 ADC_RegularConvertedValueTab[64], ADC_InjectedConvertedValueTab[32];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 = 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_Circular; 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_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_28Cycles5);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的注入通道 */ 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, ENABLE);/* 使能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_GetCalibrationStatus(ADC1));void ADC_IRQHandler(void){ /* 清除ADC1的注入中断标志JEOC */ ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC); /* 读取注入通道10和11的转化结果 */ ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1); ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2); if (Index == 32) { Index = 0; }}。












