77范文网 - 专业文章范例文档资料分享平台

STM32库开发实战指南-M4:30-ADC—电压采集(5)

来源:网络收集 时间:2018-12-10 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

零死角玩转STM32—F429图30-6三重ADC交叉模式30.6.1硬件设计

三重ADC交叉模式是针对同一个通道的ADC采集模式,这种情况跟30.430.4小节的单通道实验非常类似,只是同时使用三个ADC对同一通道进行采集,所以电路设计与之相同即可,具体可参考图30-5。30.6.2软件设计

这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。跟单通道例程一样,我们编写两个ADC驱动文件,bsp_adc.h和bsp_adc.c,用来存放ADC所用IO引脚的初始化函数以及ADC配置相关函数,实际上这两个文件跟单通道实验的文件非常相似。1.编程要点

1)2)3)4)5)初始化配置ADC目标引脚为模拟输入模式;使能ADC1、ADC2、ADC3以及DMA时钟;配置DMA控制将ADC通用规矩数据寄存器数据转存到指定存储区;配置通用ADC为三重ADC交替模式,采样4分频,使用DMA模式2;设置ADC1、ADC2和ADC3为12位分辨率,禁用扫描,连续转换,不需要外部触发;6)设置ADC1、ADC2和ADC3转换通道顺序及采样时间;第461页共996

零死角玩转STM32—F4297)8)9)使能ADC1的DMA请求,在ADC转换完后自动请求DMA进行数据传输;启动ADC1、ADC2和ADC3转换;使能软件触发ADC转换。ADC转换结果数据使用DMA方式传输至指定的存储区,这样取代单通道实验使用中断服务的读取方法。2.代码分析

ADC宏定义

代码清单30-11多通道ADC相关宏定义1234567891011121314151617#defineRHEOSTAT_ADC_CDR_ADDR#defineRHEOSTAT_ADC_GPIO_PORT#defineRHEOSTAT_ADC_GPIO_PIN#defineRHEOSTAT_ADC_GPIO_CLK#define#define#define#define#define#define#defineRHEOSTAT_ADC1RHEOSTAT_ADC1_CLKRHEOSTAT_ADC2RHEOSTAT_ADC2_CLKRHEOSTAT_ADC3RHEOSTAT_ADC3_CLKRHEOSTAT_ADC_CHANNEL((uint32_t)0x40012308)GPIOCGPIO_Pin_3RCC_AHB1Periph_GPIOCADC1RCC_APB2Periph_ADC1ADC2RCC_APB2Periph_ADC2ADC3RCC_APB2Periph_ADC3ADC_Channel_13RCC_AHB1Periph_DMA2DMA_Channel_0DMA2_Stream0#defineRHEOSTAT_ADC_DMA_CLK#defineRHEOSTAT_ADC_DMA_CHANNEL#defineRHEOSTAT_ADC_DMA_STREAM双重或者三重ADC需要使用通用规则数据寄存器ADC_CDR,这点跟独立模式不同。定义电位器动触点引脚作为三重ADC的模拟输入。ADCGPIO初始化函数

代码清单30-12ADCGPIO初始化1staticvoidRheostat_ADC_GPIO_Config(void)2{3GPIO_InitTypeDefGPIO_InitStructure;45//使能GPIO时钟6RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK,ENABLE);78//配置IO9GPIO_InitStructure.GPIO_Pin=RHEOSTAT_ADC_GPIO_PIN;10//配置为模拟输入11GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;12//不上拉不下拉13GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;14GPIO_Init(RHEOSTAT_ADC_GPIO_PORT,&GPIO_InitStructure);15}第462页共996

零死角玩转STM32—F429使用到GPIO时候都必须开启对应的GPIO时钟,GPIO用于AD转换功能必须配置为模拟输入模式。配置三重ADC交替模式

代码清单30-13三重ADC交替模式配置1staticvoidRheostat_ADC_Mode_Config(void)2{3DMA_InitTypeDefDMA_InitStructure;4ADC_InitTypeDefADC_InitStructure;5ADC_CommonInitTypeDefADC_CommonInitStructure;67//开启ADC时钟8RCC_APB2PeriphClockCmd(RHEOSTAT_ADC1_CLK,ENABLE);9RCC_APB2PeriphClockCmd(RHEOSTAT_ADC2_CLK,ENABLE);10RCC_APB2PeriphClockCmd(RHEOSTAT_ADC3_CLK,ENABLE);1112//------------------DMAInit结构体参数初始化-----------------------13//ADC1使用DMA2,数据流0,通道0,这个是手册固定死的14//开启DMA时钟15RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_DMA_CLK,ENABLE);16//外设基址为:ADC数据寄存器地址17DMA_InitStructure.DMA_PeripheralBaseAddr=RHEOSTAT_ADC_CDR_ADDR;18//存储器地址,实际上就是一个内部SRAM的变量19DMA_InitStructure.DMA_Memory0BaseAddr=(u32)ADC_ConvertedValue;20//数据传输方向为外设到存储器21DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;22//缓冲区大小为3,缓冲区的大小应该等于存储器的大小23DMA_InitStructure.DMA_BufferSize=3;24//外设寄存器只有一个,地址不用递增25DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;26//存储器地址自动递增27DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;28////外设数据大小为字,即四个字节29DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;30//存储器数据大小也为字,跟外设数据大小相同31DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;32//循环传输模式33DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;34//DMA传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响35DMA_InitStructure.DMA_Priority=DMA_Priority_High;36//禁止DMAFIFO,使用直连模式37DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;38//FIFO大小,FIFO模式禁止时,这个不用配置39DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;40DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;41DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;42//选择DMA通道,通道存在于流中43DMA_InitStructure.DMA_Channel=RHEOSTAT_ADC_DMA_CHANNEL;44//初始化DMA流,流相当于一个大的管道,管道里面有很多通道45DMA_Init(RHEOSTAT_ADC_DMA_STREAM,&DMA_InitStructure);46//使能DMA流47DMA_Cmd(RHEOSTAT_ADC_DMA_STREAM,ENABLE);4849//-------------------ADCCommon结构体参数初始化--------------------50//三重ADC交替模式51ADC_CommonInitStructure.ADC_Mode=ADC_TripleMode_Interl;52//时钟为fpclk24分频53ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;54//禁止DMA直接访问模式55ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_2;第463页共996

零死角玩转STM32—F4295657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105}//采样时间间隔ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_10Cycles;ADC_CommonInit(&ADC_CommonInitStructure);//-------------------ADCInit结构体参数初始化----------------------//ADC分辨率ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;//禁止扫描模式,多通道采集才需要ADC_InitStructure.ADC_ScanConvMode=DISABLE;//连续转换ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//禁止外部边沿触发ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//使用软件触发,外部触发不用配置,注释掉即可//ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;//数据右对齐ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//转换通道1个ADC_InitStructure.ADC_NbrOfConversion=1;ADC_Init(RHEOSTAT_ADC1,&ADC_InitStructure);//配置ADC通道转换顺序为1,第一个转换,采样时间为3个时钟周期ADC_RegularChannelConfig(RHEOSTAT_ADC1,RHEOSTAT_ADC_CHANNEL,1,ADC_SampleTime_3Cycles);//------------------------------------------------------------------ADC_Init(RHEOSTAT_ADC2,&ADC_InitStructure);//配置ADC通道转换顺序为1,第一个转换,采样时间为3个时钟周期ADC_RegularChannelConfig(RHEOSTAT_ADC2,RHEOSTAT_ADC_CHANNEL,1,ADC_SampleTime_3Cycles);//------------------------------------------------------------------ADC_Init(RHEOSTAT_ADC3,&ADC_InitStructure);//配置ADC通道转换顺序为1,第一个转换,采样时间为3个时钟周期ADC_RegularChannelConfig(RHEOSTAT_ADC3,RHEOSTAT_ADC_CHANNEL,1,ADC_SampleTime_3Cycles);//使能DMA请求afterlasttransfer(multi-ADCmode)ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);//使能ADCDMAADC_DMACmd(RHEOSTAT_ADC1,ENABLE);//使能ADCADC_Cmd(RHEOSTAT_ADC1,ENABLE);ADC_Cmd(RHEOSTAT_ADC2,ENABLE);ADC_Cmd(RHEOSTAT_ADC3,ENABLE);//开始adc转换,软件触发ADC_SoftwareStartConv(RHEOSTAT_ADC1);ADC_SoftwareStartConv(RHEOSTAT_ADC2);ADC_SoftwareStartConv(RHEOSTAT_ADC3);首先,我们使用了DMA_InitTypeDef定义了一个DMA初始化类型变量,该结构体内容我们在DMA篇已经做了非常详细的讲解;另外还使用ADC_InitTypeDef和ADC_CommonInitTypeDef结构体分别定义一个ADC初始化和ADC通用类型变量,这两个结构体我们之前已经有详细讲解。调用RCC_APB2PeriphClockCmd()开启ADC时钟以及RCC_AHB1PeriphClockCmd()开启DMA时钟。我们需要对DMA进行必要的配置。首先设置外设基地址就是ADC的通用规则数据寄存器地址;存储器的地址就是我们指定的数据存储区空间,ADC_ConvertedValue是我们定义的一个全局数组名,它是一个无符号32位有三个元素的整数数字;ADC规则转换对应第464页共996

零死角玩转STM32—F429只有一个数据寄存器所以地址不能递增,我们指定的存储区也需要递增地址。ADC的通用规则数据寄存器是32位有效,我们配置ADC为DMA模式2,设置数据大小为字大小。ADC配置为连续转换模式DMA也设置为循环传输模式。设置好DMA相关参数后就使能DMA的ADC通道。接下来我们使用ADC_CommonInitTypeDef结构体变量ADC_CommonInitStructure来配置ADC为三重ADC交替模式、分频系数为4、需要设置DMA模式2、10个周期的采样延迟,并调用ADC_CommonInit函数完成ADC通用工作环境配置。我们使用ADC_InitTypeDef结构体变量ADC_InitStructure来配置ADC1为12位分辨率、不使用扫描模式、启动连续转换、使用内部软件触发无需外部触发事件、使用右对齐数据格式、转换通道为1,并调用ADC_Init函数完成ADC1工作环境配置。ADC2和ADC3使用与ADC1相同配置即可。ADC_RegularChannelConfig函数用来绑定ADC通道转换顺序和采样时间。绑定ADC通道引脚并设置相应的转换顺序。ADC_MultiModeDMARequestAfterLastTransferCmd函数控制是否使能ADC的DMA请求,如果使能请求,并调用ADC_DMACmd函数使能DMA,则在ADC转换完成后就请求DMA实现数据传输。三重模式只需使能ADC1的DMA通道。ADC_Cmd函数控制ADC转换启动和停止。最后,如果使用软件触发需要调用ADC_SoftwareStartConvCmd函数进行使能配置。主函数

代码清单30-14主函数1int2{34567891011121314151617181920212223242526272829main(void)/*初始化USART1*/Debug_USART_Config();/*初始化滑动变阻器用到的DAC,ADC数据采集完成后直接由DMA运输数据到ADC_ConvertedValue变量DMA直接改变ADC_ConvertedValue的值*/Rheostat_Init();printf(\----这是一个ADC实验(DMA传输)----\\r\\n\);while(1){Delay(0xffffee);ADC_ConvertedValueLocal[0]=(float)((uint16_t)ADC_ConvertedValue[0]*3.3/4096);ADC_ConvertedValueLocal[1]=(float)((uint16_t)ADC_ConvertedValue[2]*3.3/4096);ADC_ConvertedValueLocal[2]=(float)((uint16_t)ADC_ConvertedValue[1]*3.3/4096);printf(\ThecurrentADvalue=0xX\\r\\n\,ADC_ConvertedValue[0]);printf(\ThecurrentADvalue=0xX\\r\\n\,ADC_ConvertedValue[1]);printf(\ThecurrentADvalue=0xX\\r\\n\,ADC_ConvertedValue[2]);printf(\ThecurrentADC1value=%fV\\r\\n\,ADC_ConvertedValueLocal[0]);printf(\ThecurrentADC2value=%fV\\r\\n\,第465页共996

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库STM32库开发实战指南-M4:30-ADC—电压采集(5)在线全文阅读。

STM32库开发实战指南-M4:30-ADC—电压采集(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/358408.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: