资源预览内容
第1页 / 共66页
第2页 / 共66页
第3页 / 共66页
第4页 / 共66页
第5页 / 共66页
第6页 / 共66页
第7页 / 共66页
第8页 / 共66页
第9页 / 共66页
第10页 / 共66页
亲,该文档总共66页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第7 7讲讲 STM32STM32的的ADAD转换器转换器主要内容主要内容7.1 ADC的硬件结构及特征7.2 工作模式7.3 ADC中断7.4 ADC寄存器7.5 ADC库函数7.6 ADC程序设计7.1 ADC7.1 ADC的硬件结构及功能的硬件结构及功能l STM32F103有2个12位ADC(ADC1和ADC2), 是逐次逼近型模拟/数字转换器。ADC的输入时钟不得 超过14MHz,它是由PCLK2经分频产生l 它有多达18个通道,可测量16个外部和2个内部信号源 。 l 各通道的A/D转换可以单次、连续、扫描或间断模式 执行。l ADC的结果可以左对齐或右对齐方式存储在16位 数据寄存器中。ADCxADCx的输入通道的输入通道ADC123_IN0-PA0ADC123_IN1-PA1ADC123_IN2-PA2ADC123_IN3-PA3ADC12_IN4-PA4ADC12_IN5-PA5ADC12_IN6-PA6ADC12_IN7-PA7ADC12_IN8-PB0ADC12_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 ADCADC主要特征主要特征12位分辨率转换结束、注入转换结束和发生模拟看门狗事件时产生中断 单次和连续转换模式 从通道0到通道n的自动扫描模式 自校准 带内嵌数据一致性的数据对齐采样间隔可以按通道分别编程 规则转换和注入转换均有外部触发选项 间断模式 双重模式(带2个或以上ADC的器件) ADC转换时间: STM32F103xx增强型产品:时钟为56MHz时 为1s(时钟为72MHz为1.17s) 。ADC供电要求:2.4V到3.6V ADC输入范围:VREF- VIN VREF+ 规则通道转换期间有DMA请求产生。 7.2 7.2 工作模式工作模式通道选择单次转换模式连续转换模式扫描模式间断模式数据对齐双ADC模式通道选择通道选择有16个多路通道。可以把转换组织成两组:规 则组和注入组。在任意多个通道上以任意顺序 进行的一系列转换构成成组转换。规则组由多达16个转换组成。规则通道和它们 的转换顺序在ADC_SQRx寄存器中选择。注入组由多达4个转换组成。注入通道和它们 的转换顺序在ADC_JSQR寄存器中选择。单次转换模式单次转换模式单次转换模式下,ADC只执行一次转换。如果一个规则通道被转换: 转换数据被储存在16位ADC_DR寄存器中 EOC(转换结束)标志被设置 如果设置了EOCIE,则产生中断。如果一个注入通道被转换: 转换数据被储存在16位的ADC_DRJ1寄存器中 JEOC(注入转换结束)标志被设置 如果设置了JEOCIE位,则产生中断。 然后ADC停止。 连续转换模式连续转换模式在连续转换模式中,当前面ADC转换一结束马上就启 动另一次转换。如果一个规则通道被转换: 转换数据被储存在16位的ADC_DR寄存器中 EOC(转换结束)标志被设置 如果设置了EOCIE,则产生中断。 如果一个注入通道被转换: 转换数据被储存在16位的ADC_DRJ1寄存器中 JEOC(注入转换结束)标志被设置 如果设置了JEOCIE位,则产生中断。 扫描模式扫描模式此模式用来扫描一组模拟通道。 ADC扫描所有被ADC_SQRX寄存器(对规则通道)或 ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结 束时,同一组的下一个通道被自动转换。如果设置了寄存器ADC_CR2中的CONT位,转换不 会在选择组的最后一个通道上停止,而是再次从选择 组的第一个通道继续转换。 间断模式间断模式规则组 :此模式通过设置ADC_CR1寄存器上的 DISCEN位激活。它可以用来执行一个短序列的n次转 换(nODR=0xffffffff;while(1) ADC = Get_Adc(14); /smart开发板ADC1通道14,PC4ADC14 = ADC*3300/4095; a1=ADC14/1000;a11=ADC%1000; a2=a11/100;a21=a11%100; a3=a21/10;a31=a21%10; a4=a31;a1=a1+0x30;a2=a2+0x30;a3=a3+0x30;a4=a4+0x30;主程序(续)主程序(续)Uart1_PutChar(a1); Delay(0x02fff); Uart1_PutChar(.); Delay(0x002fff); Uart1_PutChar(a2); Delay(0x002fff); Uart1_PutChar(a3); Delay(0x002fff); Uart1_PutChar(a4); Delay(0x002fff); Uart1_PutChar(0x0d);Uart1_PutChar(0x0a);Delay(0x08fffff); 串口发送数据子函数:串口发送数据子函数: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 USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;/波特率9600 USART_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_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;USART_Init(USART1, USART_Cmd(USART1, ENABLE); /使能串口 ADC1ADC1初始化函数:初始化函数: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.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_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1);ADC_SoftwareStartConvCmd(ADC1, ENABLE); 读读ADAD转换结果子函数:转换结果子函数:u16 Get_Adc(u8 ch) ADC_RegularChannelConfig(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_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); /延时函数: void Delay(vu32 nCount) for(; nCount != 0; nCount-); GPIOGPIO初始化函数初始化函数void GPIO_Configuration(void) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOC, GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, 习题习题7 71.STM32F103VB内置()个()位的AD转换器。 2. AD转换器有()个模拟量输入通道,其中外部通道( )个,内部通道()个。 3. STM32F103VB的AD转换器的转换原理是(),转换 时间最快为()us。 4. STM32F103VB的AD转换器的转换时钟频率不能超过 ()MHz. 5. STM32F103VB的AD转换器可将()V-()V电压转 换成()-()的二进制数。 6.
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号