完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
第一次发帖没啥经验,小弟就发一下自己学习遇到的一些小问题吧
一开始学51的时候实现多路adc转换可以通过中断和查询方式来采集数据,很容易就实现多路adc的实时采集。 最近学32的时候用库函数只实现了一路通道的adc采集,后来想要多路的,就不知道怎么配置了,后来搜索了一下,了解了个大概,以下是自己的理解。 首先我们就用库函数来写一下相应的代码吧。 第一步:配置相应I/O口(我使用的是PA1和PB1,通道1和通道8,使用规则通道)。 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,RCC_APB2Periph_AFIO,ENABLE); //打开相应时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化GPIO */ 第二步:配置adc参数。 ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 最大14M 设置ADC时钟(ADCCLK) ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1 和 ADC2 工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式 ADC_InitStructure.ADC_Con[color=rgb(68, 68, 68) !important]tinuousConvMode = DISABLE; //工作在单次模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //adc的数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 2; //两个adc通道 ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_Sampletime_239Cycles5); //设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间 ADC_RegularChannelConfig(ADC1,ADC_Channel_8,2,ADC_SampleTime_239Cycles5); ADC_DiscModeChannelCountConfig(ADC1, 1); //对 ADC 规则组通道配置间断模式 ADC_DiscModeCmd(ADC1, ENABLE); //使能指定的 ADC 规则组通道的间断模式 ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC重置校准寄存器的状态 ADC_StartCalibration(ADC1); //开始指定ADC的校准状态 while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC的校准程序 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能 到这里2个adc通道是配置好了。 第三步:进行数据采集和软件滤波(取多个数据进行平均值计算,使数据更准确)。 while(1) { adc1 = 0; adc2 = 0; for(i=0;i<50;i++); { ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成 adc1 += ADC_GetConversionValue(ADC1); //返回最近一次 ADCx 规则组的转换结果 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成 adc2 += ADC_GetConversionValue(ADC1); //返回最近一次 ADCx 规则组的转换结果 } adc1 /= 50; adc2 /= 50; printf("ADC1 = %.3f V t ADC2 = %.3f V rn",adc1*3.3/4096,adc2*3.3/4096); delay_ms(1000); } 好了,到这里双通道的ADC转换程序就没了。 是不是很简单,但当时却找了好久,这是多通道的规则组的ADC转换,可以多添加几组ADC通道,相应配置是一样的,重点是相应ADC转换要处于间断的模式, ADC_DiscModeChannelCountConfig(ADC1, 1); //对 ADC 规则组通道配置间断模式ADC_DiscModeCmd(ADC1, ENABLE); //使能指定的 ADC 规则组通道的间断模式 这两个库函数就是配置ADC为间断的模式, 配置为间断模式之后,每一次软件转换启动后,读取的就是相应转换的通道数据。 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成 adc1 += ADC_GetConversionValue(ADC1); //返回最近一次 ADCx 规则组的转换结果 本人新手,有说错误的地方,请多改正,大家一起进步。
评分
|
||
相关推荐
|
||
1020 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
996 浏览 2 评论
2102 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1202 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1621 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 13:49 , Processed in 0.611250 second(s), Total 45, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号