嵌入式系统设计(STM32)第7讲ppt课件.ppt

上传人:牧羊曲112 文档编号:1891262 上传时间:2022-12-24 格式:PPT 页数:66 大小:1.36MB
返回 下载 相关 举报
嵌入式系统设计(STM32)第7讲ppt课件.ppt_第1页
第1页 / 共66页
嵌入式系统设计(STM32)第7讲ppt课件.ppt_第2页
第2页 / 共66页
嵌入式系统设计(STM32)第7讲ppt课件.ppt_第3页
第3页 / 共66页
嵌入式系统设计(STM32)第7讲ppt课件.ppt_第4页
第4页 / 共66页
嵌入式系统设计(STM32)第7讲ppt课件.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《嵌入式系统设计(STM32)第7讲ppt课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统设计(STM32)第7讲ppt课件.ppt(66页珍藏版)》请在三一办公上搜索。

1、第7讲 STM32的AD转换器,主要内容,7.1 ADC的硬件结构及特征7.2 工作模式7.3 ADC中断7.4 ADC寄存器7.5 ADC库函数7.6 ADC程序设计,7.1 ADC的硬件结构及功能,STM32F103有2个12位ADC(ADC1和ADC2),是逐次逼近型模拟/数字转换器。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,它有多达18个通道,可测量16个外部和2个内部信号源。,各通道的A/D转换可以单次、连续、扫描或间断模式执行。,ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。,ADCx的输入通道,ADC123_IN0-PA0ADC123_IN1-

2、PA1ADC123_IN2-PA2ADC123_IN3-PA3ADC12_IN4-PA4ADC12_IN5-PA5ADC12_IN6-PA6ADC12_IN7-PA7ADC12_IN8-PB0,ADC12_IN9-PB1ADC123_IN10-PC0ADC123_IN11-PC1ADC123_IN12-PC2ADC123_IN13-PC3ADC12_IN14-PC4ADC12_IN15-PC5 ADC3_IN4-PF6ADC3_IN5-PF7ADC3_IN6-PF8ADC3_IN7-PF9ADC3_IN8-PF10,ADC主要特征,12位分辨率转换结束、注入转换结束和发生模拟看门狗事件时产生中

3、断 单次和连续转换模式 从通道0到通道n的自动扫描模式 自校准 带内嵌数据一致性的数据对齐采样间隔可以按通道分别编程 规则转换和注入转换均有外部触发选项 间断模式 双重模式(带2个或以上ADC的器件) ADC转换时间: STM32F103xx增强型产品:时钟为56MHz时为1s(时钟为72MHz为1.17s) 。ADC供电要求:2.4V到3.6V ADC输入范围:VREF- VIN VREF+ 规则通道转换期间有DMA请求产生。,7.2 工作模式,通道选择单次转换模式连续转换模式扫描模式间断模式数据对齐双ADC模式,通道选择,有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通

4、道上以任意顺序进行的一系列转换构成成组转换。规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。,单次转换模式,单次转换模式下,ADC只执行一次转换。如果一个规则通道被转换: 转换数据被储存在16位ADC_DR寄存器中 EOC(转换结束)标志被设置 如果设置了EOCIE,则产生中断。如果一个注入通道被转换: 转换数据被储存在16位的ADC_DRJ1寄存器中 JEOC(注入转换结束)标志被设置如果设置了JEOCIE位,则产生中断。 然后ADC停止。,连续转换模式,在连续转换模式中,当

5、前面ADC转换一结束马上就启动另一次转换。如果一个规则通道被转换: 转换数据被储存在16位的ADC_DR寄存器中 EOC(转换结束)标志被设置 如果设置了EOCIE,则产生中断。 如果一个注入通道被转换: 转换数据被储存在16位的ADC_DRJ1寄存器中 JEOC(注入转换结束)标志被设置 如果设置了JEOCIE位,则产生中断。,扫描模式,此模式用来扫描一组模拟通道。 ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了寄存器ADC_CR2中的CONT位,

6、转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。,间断模式,规则组 :此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换(n=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。注入组 :在一个外部触发事件后,该模式按通道顺序逐个转换ADC_JSQR寄存器中选择的序列。 一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL1:0位定义。,数据对齐,ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左

7、对齐或右对齐。SEXT位是扩展的符号值。,数据右对齐:,数据左对齐:,双ADC模式,在有2个或以上ADC模块的产品中,可以使用双ADC模式。共有6种可能的模式: 同步注入模式 同步规则模式 快速交叉模式 慢速交叉模式 交替触发模式 独立模式 还有可以用下列方式组合使用上面的模式: 同步注入模式 + 同步规则模式 同步规则模式 + 交替触发模式 同步注入模式 + 交叉模式,7.3 ADC中断,规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有独立的中断使能位。 ADC1和ADC2的中断映射在同一个中断向量上,而ADC3的中断有自己的中断向量。ADC中断,7.4 A

8、DC寄存器,SR -ADC状态寄存器 CR1 -ADC控制寄存器1 CR2 -ADC控制寄存器2 SMPR1 -ADC采样时间寄存器1 SMPR2 -ADC采样时间寄存器2 JOFR1 -ADC注入通道偏移寄存器1 JOFR2 -ADC注入通道偏移寄存器2 JOFR3 -ADC注入通道偏移寄存器3 JOFR4 -ADC注入通道偏移寄存器4,HTR -ADC看门狗高阈值寄存器LTR -ADC看门狗低阈值寄存器SQR1 -ADC规则序列寄存器1 SQR2 -ADC规则序列寄存器2 SQR3 -ADC规则序列寄存器3 JSQR1 -ADC注入序列寄存器JDR1 -ADC注入数据寄存器1JDR2 -A

9、DC注入数据寄存器2 JDR3 -ADC注入数据寄存器3 JDR4 -ADC注入数据寄存器4 DR-规则数据寄存器,ADC状态寄存器(ADC_SR),STRT: 规则通道开始位 (Regular channel Start flag)JSTRT:注入通道开始位 (Injected channel Start flag) JEOC:注入通道转换结束位 (Injected channel end of conversion) EOC:转换结束位 (End of conversion) AWD:模拟看门狗标志位 (Analog watchdog flag)。 该位由硬件在转换的电压值超出了ADC_L

10、TR和ADC_HTR寄存器定义的范围时设置,由软件清除。,ADC控制寄存器1(ADC_CR1),AWDEN:在规则通道上开启模拟看门狗JAWDEN:在注入通道上开启模拟看门狗 DUALMOD3:0:双模式选择 (Dual mode selection), 软件使用这些位选择操作模式。DISCNUM2:0:间断模式通道计数 JDISCEN:在注入通道上的间断模式 DISCEN:在规则通道上的间断模式 JAUTO:自动的注入通道组转换 (Automatic Injected Group conversion) AWDSGL:扫描模式中在一个单一的通道上使用看门狗 。SCAN:扫描模式 (Scan

11、mode) JEOCIE:允许产生注入通道转换结束中断 AWDIE:允许产生模拟看门狗中断 EOCIE:允许产生EOC中断 AWDCH4:0:模拟看门狗通道选择位,ADC控制寄存器2(ADC_CR2),TSVREFE:温度传感器和VREFINT使能。SWSTART:开始转换规则通道 (Start conversion of regular channels) JSWSTART:开始转换注入通道 (Start conversion of injected channels) EXTTRIG:规则通道的外部触发转换模式 。EXTSEL2:0:选择启动规则通道组转换的外部事件 JEXTTRIG:注入

12、通道的外部触发转换模式JEXTSEL2:0:选择启动注入通道组转换的外部事件ALIGN:数据对齐 (Data alignment)。 0:右对齐; 1:左对齐。DMA:直接存储器访问模式 (Direct memory access mode)RSTCAL:复位校准 (Reset calibration)CAL:A/D校准 (A/D Calibration)CONT:连续转换 (Continuous conversion)。 0:单次转换;,EXTSEL2:0,启动规则通道组转换的外部事件,ADC1和ADC2的触发配置如下 000:定时器1的CC1事件 100:定时器3的TRGO事件 001:定

13、时器1的CC2事件 101:定时器4的CC4事件 010:定时器1的CC3事件 110:EXTI线11/ TIM8_TRGO事件,仅大容量产品具有该功能 011:定时器2的CC2事件 111:SWSTART,ADC采样时间寄存器1(ADC_SMPR1),SMPx2:0:选择通道x的采样时间 (Channel x Sample time selection)这些位用于独立地选择每个通道的采样时间。000:1.5周期 001:7.5周期 010:13.5周期 011:28.5周期 100:41.5周期 101:55.5周期 110:71.5周期 111:239.5周期,ADC注入通道数据偏移寄存器

14、x (ADC_JOFRx)(x=1.4),JOFFSETx11:0:注入通道x的数据偏移 (Data offset for injected channel x) 当转换注入通道时,这些位定义了用于从原始转换数据中减去的数值。转换的结果可以在ADC_JDRx寄存器中读出。,ADC规则序列寄存器1(ADC_SQR1),L3:0:规则通道序列长度。SQ164:0:规则序列中的第16个转换 ,这些位由软件定义转换序列中的第16个转换通道的编号(017)。 SQ154:0:规则序列中的第15个转换 。SQ134:0:规则序列中的第13个转换 (13th conversion in regular se

15、quence),ADC注入序列寄存器(ADC_JSQR),JL1:0:注入通道序列长度 (Injected sequence length) ( 00:1个转换; 01:2个转换; 10:3个转换; 11:4个转换 )JSQ44:0:注入序列中的第4个转换 。(4th conversion in injected sequence )JSQ34:0:注入序列中的第3个转换 (3rd conversion in injected sequence),ADC 注入数据寄存器x (ADC_JDRx) (x= 1.4),JDATA15:0:注入转换的数据 (Injected data) 这些位为只读,

16、包含了注入通道的转换结果。数据是左对齐或右对齐,ADC规则数据寄存器(ADC_DR),ADC2DATA15:0:ADC2转换的数据 (ADC2 data)DATA15:0:规则转换的数据 (Regular data),7.5 ADC库函数,ADC_DeInit: 将外设ADCx的全部寄存器重设为缺省值ADC_Init: 根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器ADC_StructInit: 把ADC_InitStruct中的每一个参数按缺省值填入ADC_Cmd: 使能或者失能指定的ADCADC_DMACmd: 使能或者失能指定的ADC的DMA请求ADC_ITCon

17、fig: 使能或者失能指定的ADC的中断ADC_SoftwareStartConvCmd 使能或者失能指定的ADC的软件转换启动功能ADC_GetConversionValue: 返回最近一次ADCx规则组的转换结果ADC_RegularChannelConfig 设置指定ADC的规则组通道,设置它们的转化顺序和采样时间,ADC_GetFlagStatus :检查制定ADC标志位置1与否ADC_ClearFlag: 清除ADCx的待处理标志位ADC_GetITStatus :检查指定的ADC中断是否发生ADC_ClearITPendingBit :清除ADCx的中断待处理位,函数ADC_DeI

18、nit,功能描述: 将外设ADCx的全部寄存器重设为缺省值函数原形:void ADC_DeInit(ADC_TypeDef* ADCx) 例: /* Resets ADC2 */ ADC_DeInit(ADC2);,函数ADC_Init,功能描述: 根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器函数原形:void ADC_Init (ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct),ADC_InitTypeDef structure,ADC_InitTypeDef定义于文件“stm32f10 x_adc.h”: ty

19、pedef struct u32 ADC_Mode; FunctionalState ADC_ScanConvMode; FunctionalState ADC_ContinuousConvMode; u32 ADC_ExternalTrigConv; u32 ADC_DataAlign; u8 ADC_NbrOfChannel; ADC_InitTypeDef,ADC_Mode:,ADC_ScanConvMode ADC_ScanConvMode规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为ENABLE或者DISABLE。ADC_ContinuousConv

20、Mode ADC_ContinuousConvMode规定了模数转换工作在连续还是单次模式。可以设置这个参数为ENABLE或者DISABLE。ADC_ExternalTrigConv ADC_ExternalTrigConv定义了使用外部触发来启动规则通道的模数转换,,ADC_ExternalTrigConv定义表,ADC_DataAlign,规定了ADC数据向左边对齐还是向右边对齐。,ADC_NbrOfChannel,规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16。,例: /* Initialize the ADC1 according to the ADC_Init

21、Structure members */,ADC_InitTypeDef ADC_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; ADC_InitStructure.ADC_Da

22、taAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 16; ADC_Init(ADC1, ,函数ADC_Cmd,功能描述: 使能或者失能指定的ADC 例: /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); 注意:函数ADC_Cmd只能在其他ADC设置函数之后被调用。,函数ADC_ResetCalibration,功能描述:重置指定的ADC的校准寄存器例: /* Reset the ADC1 Calibration registers */ ADC_ResetCalibration

23、(ADC1);,函数ADC_GetResetCalibrationStatus,功能描述:获取ADC重置校准寄存器的状态返回值 :ADC重置校准寄存器的新状态(SET或者RESET)例: /* Get the ADC2 reset calibration registers status */ FlagStatus Status; Status = ADC_GetResetCalibrationStatus(ADC2);,函数ADC_StartCalibration,功能描述: 开始指定ADC的校准状态例: /* Start the ADC2 Calibration */ ADC_StartC

24、alibration(ADC2);,函数ADC_GetCalibrationStatus,功能描述: 获取指定ADC的校准程序例: /* Get the ADC2 calibration status */ FlagStatus Status; Status = ADC_GetCalibrationStatus(ADC2);,函数ADC_SoftwareStartConvCmd,功能描述:使能或者失能指定的ADC的软件转换启动功能例: /* Start by software the ADC1 Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABL

25、E);,函数RCC_ADCCLKConfig,功能描述:设置ADC时钟(ADCCLK)函数原形:void ADC_ADCCLKConfig(u32 RCC_ADCCLKSource) 例: /* Configure ADCCLK such as ADCCLK = PCLK2/2 */ RCC_ADCCLKConfig(RCC_PCLK2_Div2);,函数ADC_RegularChannelConfig,功能描述:设置指定ADC的规则组通道,设置它们的转化顺序和采样时间函数原形void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, u8 ADC_Cha

26、nnel, u8 Rank, u8 ADC_SampleTime) ADCx:x可以是1或者2来选择ADC外设ADC1或ADC2 ADC_Channel:被设置的ADC通道Rank:规则组采样顺序。取值范围1到16ADC_SampleTime:指定ADC通道的采样时间值,ADC_Channel值,ADC_Channel_0: 选择ADC通道0 ADC_Channel_1 :选择ADC通道1 ADC_Channel_17: 选择ADC通道17,ADC_SampleTime值:,例: /* Configures ADC1 Channel2 as: first converted channel w

27、ith an 7.5 cycles sample time */ ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_7Cycles5); /* Configures ADC1 Channel8 as: second converted channel with an 1.5 cycles sample time */ ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_1Cycles5);,函数ADC_GetFlagStatus,功能描述:

28、检查制定ADC标志位置1与否例: /* Test if the ADC1 EOC flag is set or not */ FlagStatus Status; Status = ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);,函数ADC_GetConversionValue,功能描述:返回最近一次ADCx规则组的转换结果。例: /*Returns the ADC1 Master data value of the last converted channel*/ u16 DataValue; DataValue = ADC_GetConversionValue

29、(ADC1);,7.6 ADC程序设计,包含头文件声明函数声明变量主程序调用时钟配置函数调用ADC初始化函数调用GPIO配置函数调用串口初始化函数主循环读AD转换结果将AD转换结果上传到微机,函数及变量声明,#include stm32f10 x.h void RCC_Configuration(void);void Adc_Init(void);void GPIO_Configuration(void);void Delay(vu32 nTime);void uart_init(void );u16 Get_Adc(u8 ch);void Uart1_PutChar(u8 ch);u16 A

30、DC, ADC14,seg1;u8 buf12;u8 a1,a2,a3,a4,a11,a21,a31;,主程序:,int main() RCC_Configuration();GPIO_Configuration();uart_init();Adc_Init();GPIOC-ODR=0 xffffffff; while(1) ADC = Get_Adc(14); /smart开发板ADC1通道14,PC4 ADC14 = ADC*3300/4095; a1=ADC14/1000;a11=ADC%1000;a2=a11/100;a21=a11%100;a3=a21/10;a31=a21%10;a

31、4=a31; a1=a1+0 x30;a2=a2+0 x30;a3=a3+0 x30;a4=a4+0 x30;,主程序(续),Uart1_PutChar(a1); Delay(0 x02fff);Uart1_PutChar(.); Delay(0 x002fff);Uart1_PutChar(a2); Delay(0 x002fff);Uart1_PutChar(a3); Delay(0 x002fff);Uart1_PutChar(a4); Delay(0 x002fff);Uart1_PutChar(0 x0d);Uart1_PutChar(0 x0a);Delay(0 x08fffff)

32、;,串口发送数据子函数:,void Uart1_PutChar(u8 ch) USART_SendData(USART1, (u8) ch); if (USART_GetFlagStatus(USART1, USART_FLAG_TXE) = SET) USART_ClearFlag(USART1,USART_FLAG_TXE); void Uart1_PutString(u8 *buf , u8 len) u8 i=0; for(i=0; ilen; i+) Uart1_PutChar(*buf+); ,串口初始化函数:,void uart_init( )USART_InitTypeDef

33、USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600;/波特率9600USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlo

34、wControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, /使能串口,ADC1初始化函数:,void Adc_Init(void) ADC_InitTypeDef ADC_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div6); ADC_DeInit(ADC1); /? ADC1 初始化ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.

35、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, ,读AD转换结果子函数:,u16 Get_Adc(u8 ch) ADC_RegularChan

36、nelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC );return ADC_GetConversionValue(ADC1);T=239.5+12.5=252cyles,时钟初始化函数:,void RCC_Configuration() /配置系统时钟(略)/ 配置外设时钟 RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1| RCC_

37、APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); /延时函数:void Delay(vu32 nCount) for(; nCount != 0; nCount-);,GPIO初始化函数,void GPIO_Configuration(void) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO

38、_Mode_AIN; GPIO_Init(GPIOC, ,习题7,1.STM32F103VB内置()个()位的AD转换器。2. AD转换器有()个模拟量输入通道,其中外部通道()个,内部通道()个。3. STM32F103VB的AD转换器的转换原理是(),转换时间最快为()us。4. STM32F103VB的AD转换器的转换时钟频率不能超过()MHz.5. STM32F103VB的AD转换器可将()V-()V电压转换成()-()的二进制数。6. ADC主要有4种转换模式: ()、()、()和()。7. 启动AD转换有两种方式: ()和()。,AD转换结束后,转换结束标志位会置()。多个通道进行

39、AD转换时,可设置成()通道组或者()通道组。规则通道组最多有()个通道转换。注入通道组最多允许()通道转换。通过编程设置每个通道的转换顺序。转换时间等于采样时间加上()个时钟周期。模拟看门狗部分用于监控检测电压是否超过高、低阈值电压,若超过,可以产生()。,请解释下面的AD配置程序,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, ,实验七 A/D转换实验,实验目的:掌握STM32A/D转换器结构特点以及程序设计方法。实验要求:编写程序将通道14的A/D转换结果上传到PC机开关拨到ISP, USB5V利用SSCOM33串口助手,下载前,关闭串口。下载完成后打开串口。,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号