STM32_ADC多通道转换实例

上传人:liu****han 文档编号:137330803 上传时间:2022-08-18 格式:DOC 页数:7 大小:37.50KB
收藏 版权申诉 举报 下载
STM32_ADC多通道转换实例_第1页
第1页 / 共7页
STM32_ADC多通道转换实例_第2页
第2页 / 共7页
STM32_ADC多通道转换实例_第3页
第3页 / 共7页
资源描述:

《STM32_ADC多通道转换实例》由会员分享,可在线阅读,更多相关《STM32_ADC多通道转换实例(7页珍藏版)》请在装配图网上搜索。

1、STM32 ADC多通道转换描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。程序如下:#include stm32f10x.h /这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义#include eval.h /头文件(包括串口、按键、LED的函数声明)#include SysTickDelay.h #include UART_INTERFACE.h#include #define

2、 N 50 /每通道采50次#define M 12 /为12个通道vu16 AD_ValueNM; /用来存放ADC转换结果,也是DMA的目标地址vu16 After_filterM; /用来存放求平均值之后的结果int i;/*GPIO管脚的配置选用ADC的通道0 1 2 8 9 10 11 12 13 14 15,分别对应的管脚为PA0 PA1 PA2 PB0 PB1 PC0 PC1 PC2 PC3 PC4 PC5串口使用USART1其中TX为PA9,RX为PA10 */void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStru

3、cture;/* Configure USART1 Tx (PA.09) as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /因为USART1管脚是以复用的形式接到GPIO口上的,所以使用复用推挽式输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure U

4、SART1 Rx (PA.10) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/PA0/1/2 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO

5、_Mode_AIN;/模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);/PB0/1 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/模拟输入引脚GPIO_Init(GPIOB, &GPIO_InitStructure);/PC0/1/2/3/4/5 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pi

6、n_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/模拟输入引脚GPIO_Init(GPIOC, &GPIO_InitStructure);/*配置系统时钟,使能各外设时钟*/void RCC_Configuration(void) ErrorStatus HSEStartUpStatus; RCC_DeInit(); /RCC 系统复位 RCC_HSEConfig(RCC_HSE_ON); /开启HSE HSEStartUpStatus = RCC_WaitForHSEStart

7、Up(); /等待HSE准备好 if(HSEStartUpStatus = SUCCESS) FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); /Set 2 Latency cycles RCC_HCLKConfig(RCC_SYSCLK_Div1); /AHB clock = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); /APB2 clock = HCLK RCC_PCLK1Confi

8、g(RCC_HCLK_Div2); /APB1 clock = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); /PLLCLK = 12MHz * 6 = 72 MHz RCC_PLLCmd(ENABLE); /Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET); /Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /Select PLL as system clock s

9、ource while(RCC_GetSYSCLKSource() != 0x08); /Wait till PLL is used as system clock source /*使能各个外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); /使能ADC1通道时钟,各个管脚时钟/* Configure AD

10、CCLK such as ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /72M/6=12,ADC最大时间不能超过14MRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/使能DMA传输 /*配置ADC1*/void ADC1_Configuration(void) ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1); /将外设 ADC1 的全部寄存器重设为缺省值/* ADC1 configuration -*/ADC_InitStr

11、ucture.ADC_Mode = ADC_Mode_Independent;/ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode =ENABLE;/模数转换工作在扫描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;/模数转换工作在连续转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/外部触发转换关闭ADC_InitStructure.ADC_DataAlign = ADC_Dat

12、aAlign_Right;/ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = M;/顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器/* ADC1 regular channel11 configuration */ /设置指定ADC的规则组通道,设置它们的转化顺序和采样时间/ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_

13、0, 1, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_

14、Channel_8, 5, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 8, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(

15、ADC1, ADC_Channel_12, 9, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 10, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 11, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 12, ADC_SampleTime_239Cycles5 ); / 开启ADC的D

16、MA支持(要实现DMA功能,还需独立配置DMA通道等参数) ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /使能指定的ADC1 /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /复位指定的ADC1的校准寄存器/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1);/获取ADC1

17、复位校准寄存器的状态,设置状态则等待/* Start ADC1 calibaration */ADC_StartCalibration(ADC1);/开始指定ADC1的校准状态/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1);/获取指定ADC1的校准程序,设置状态则等待/*配置DMA*/void DMA_Configuration(void)/* ADC1 DMA1 Channel Config */DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DM

18、A1_Channel1); /将DMA的通道1寄存器重设为缺省值DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1-DR; /DMA外设ADC基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; /DMA内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /内存作为数据传输的目的地DMA_InitStructure.DMA_BufferSize = N*M; /DMA通道的DMA缓存的大小DMA_InitStructu

19、re.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /数据宽度为16位DMA_InitStru

20、cture.DMA_Mode = DMA_Mode_Circular; /工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High; /DMA通道 x拥有高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure); /根据DMA_InitStruct中指定的参数初始化DMA的通道/配置所有外设void Init_All_Periph(void)RCC_Configura

21、tion();GPIO_Configuration();ADC1_Configuration();DMA_Configuration();/USART1_Configuration();USART_Configuration(9600); /*获取ADC的值,将二进制换算为十进制*/u16 GetVolt(u16 advalue) return (u16)(advalue * 330 / 4096); /求的结果扩大了100倍,方便下面求出小数 /*求平均值函数*/void filter(void) int sum = 0;u8 count; for(i=0;i12;i+) for ( cou

22、nt=0;countN;count+) sum += AD_Valuecounti; After_filteri=sum/N; sum=0; int main(void) u16valueM;init_All_Periph();SysTick_Initaize(); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);DMA_Cmd(DMA1_Channel1, ENABLE); /启动DMA通道while(1) while(USART_GetFlagStatus(USART1,USART_FL

23、AG_TXE)=RESET);/等待传输完成否则第一位数据容易丢失 filter(); for(i=0;i12;i+) valuei= GetVolt(After_filteri); printf(value%d:t%d.%dvn,i,valuei/100,valuei%100) ; delay_ms(100); 总结该程序中的两个宏定义,M和N,分别代表有多少个通道,每个通道转换多少次,可以修改其值。曾出现的问题:配置时钟时要知道外部晶振是多少,以便准确配置时钟。将转换值由二进制转换为十进制时,要先扩大100倍,方便显示小数。最后串口输出时在printf语句之前加这句代码,防止输出的第一位数据丢失:while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=RESET);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!