STM32F407 ADC采集百度知道问题采集器,求助中

您的位置:> -&
-& >下载 档案号:#226585
软件授权:
软件大小:
软件语言:
软件评级:
官方主页:
更新时间:
应用平台:
复制到论坛
复制到博客
by xdowns.com绿盟
绿盟口号! 伸出你的手 - 绿色分享:
官方评级:4/111
同类软件推荐
本类下载排行查看: 1060|回复: 5
STM32F407 ADC采样丢点
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间9 小时
用了ADC1的2通道和ADC2的3通道,注入和规则都同时的模式,然后DMA采用双缓存模式传输回ADC的CDR寄存器,高16位是ADC2转换后的值,低16位是ADC1转换后的值。ADC的采样率是21Khz,采的是2khz的三角波,然后采集回来ADC1的波形如下,如果采用单个ADC,然后DAM还是双缓存,采集的结果是对的。所以问问为什么?
配置代码如下;
/* ½á11ìåéùÃ÷*/
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & ADC_CommonInitTypeDef ADC_CommonInitS
& & & & ADC_InitTypeDef&&ADC_InitS
& & & & DMA_InitTypeDef&&DMA_InitS
&&RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ê1ÄüADC1ê±Öó
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); //ê1ÄüADC1ê±Öó
& & & & RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//ê1ÄüDMA2ê±Öó
&&//Ïè3õê¼»ˉADC1í¨μà2 IO¿ú
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//PA2 í¨μà2
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£Äaêäèë
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//2»′øéÏÏÂà-
&&GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ&&
& & & & RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);& & & && &//ADC1¸′λ
& & & & RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);& & & & //¸′λ½áêø& & & &&&
& & & & RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,ENABLE);& & & && &//ADC2¸′λ
& & & & RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,DISABLE);& & & & //¸′λ½áêø& & & &&&
& & & & /*ADC common config*/
&&ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult_InjecS//ADC_DualMode_RegSimult_InjecS& &//
&&ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5C//ὸö2éÑù½×¶ÎÖ®¼äμÄÑó3ù5¸öê±Öó
&&ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
&&ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖÆμ4·ÖÆμ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCê±Öó×îoÃ2»òa3¬1y36Mhz
&&ADC_CommonInit(&ADC_CommonInitStructure);//3õê¼»ˉ
&&ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λÄ£ê½
&&ADC_InitStructure.ADC_ScanConvMode = ENABLE;//·Çé¨ÃèÄ£ê½& & & & μ¥í¨μàê±1رÕ£¬¶àí¨μà걿aÆô
&&ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//á¬Dø×a»»
&&ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_N//½ûÖ1′¥·¢¼ì2a£¬ê1óÃèí¼t′¥·¢
&&//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R//óò¶ÔÆë& & & &
&&ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸ö×a»»Ôú1æÔòDòáDÖD
&&ADC_Init(ADC1, &ADC_InitStructure);//ADC3õê¼»ˉ
& & & & ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λÄ£ê½
&&ADC_InitStructure.ADC_ScanConvMode = ENABLE;//·Çé¨ÃèÄ£ê½& & & & μ¥í¨μàê±1رÕ£¬¶àí¨μà걿aÆô
&&ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//á¬Dø×a»»
&&ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_N//½ûÖ1′¥·¢¼ì2a£¬ê1óÃèí¼t′¥·¢
&&//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R//óò¶ÔÆë& & & &
&&ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸ö×a»»Ôú1æÔòDòáDÖD&&
&&ADC_Init(ADC2, &ADC_InitStructure);//ADC3õê¼»ˉ
& & & & //éèÖÃÖ¸¶¨ADCμÄ1æÔò×éí¨μ࣬ò»¸öDòáD£¬2éÑùê±¼ä
& & & & ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_480Cycles );& & & & //ADC1,ADCí¨μà,480¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è& & & & & & & &
& & & & ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 1, ADC_SampleTime_480Cycles );& & & & //ADC2,í¨μà3,480¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è& & & & & & & &
& & & & /* Enable DMA request after last transfer (Multi-ADC mode) */
&&ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
& & & & ADC_Cmd(ADC1, ENABLE);//¿aÆôAD×a»»Æ÷& & & &
& & & & ADC_Cmd(ADC2, ENABLE);//¿aÆôAD×a»»Æ÷
& & & & DMA_DeInit(DMA2_Stream0);//¸′λ
& & & & while (DMA_GetCmdStatus(DMA2_Stream0) != DISABLE){}//μè′yDMA¿éÅäÖÃ
& & & & /* ÅäÖÃ DMA Stream */
&&DMA_InitStructure.DMA_Channel = DMA_Channel_0;&&//í¨μàÑ¡Ôñ0
&&DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC-&CDR;//DMAíaéèμØÖ·
&&DMA_InitStructure.DMA_Memory0BaseAddr =(u32)&adc_//DMA ′æ′¢Æ÷0μØÖ·
&&DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToM//íaéèμ½′æ′¢Æ÷Ä£ê½& && & 0
&&DMA_InitStructure.DMA_BufferSize = 20;//êy¾Y′«êäá¿
&&DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//íaéè·ÇÔöá¿Ä£ê½ 0
&&DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E//′æ′¢Æ÷Ôöá¿Ä£ê½ 0
&&DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW//íaéèêy¾Y3¤¶è:16λ&&0
&&DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW//′æ′¢Æ÷êy¾Y3¤¶è:16λ& & 0
&&DMA_InitStructure.DMA_Mode = DMA_Mode_C// ê1óÃÑ-»·Ä£ê½&&0
&&DMA_InitStructure.DMA_Priority = DMA_Priority_H//¸ßμèóÅÏ輶& &0
&&DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_E//DMA_FIFOMode_D& && &0& &
&&DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_F//DMA_FIFOThreshold_HalfF&&0
&&DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_S//′æ′¢Æ÷í»·¢μ¥′Î′«êä
&&DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_S//íaéèí»·¢μ¥′Î′«êä 0
&&DMA_Init(DMA2_Stream0, &DMA_InitStructure);//3õê¼»ˉDMA Stream
& & & & & & & & /*open dualbuffer mode*/
& & & & DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)adc_buffb, DMA_Memory_0);&&
&&DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE);
& & & & DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);& &//clear int bit
&&DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);& &//enable int
& & & & ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); //Ô′êy¾Y±ä»ˉ걿aÆôDMA′«êä
& & & & ADC_DMACmd(ADC1,ENABLE);//ê1ÄüADCμÄDMA′«êä
& & & & ADC_DMACmd(ADC2,ENABLE);//ê1ÄüADCμÄDMA′«êä
& & & & ADC_SoftwareStartConv(ADC1);//&&¿aÆôADC1μÄ×a»»
& & & & ADC_SoftwareStartConv(ADC2);//&&¿aÆôADC2μÄ×a»»
& & & & DMA_Cmd(DMA2_Stream0, ENABLE);& && && && && && && & //¿aÆôDMA′«êä
(35.43 KB, 下载次数: 0)
13:49 上传
自己解决了,我在中断里用串口输出,导致超出ADC_DMA的中断时间,后采用另外一种检测方法,让他写完两次,也就是各写一次,就可以了
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间9 小时
自己解决了,我在中断里用串口输出,导致超出ADC_DMA的中断时间,后采用另外一种检测方法,让他写完两次,也就是各写一次,就可以了
主题帖子精华
新手入门, 积分 38, 距离下一级还需 -18 积分
在线时间9 小时
求大神告诉
主题帖子精华
金钱127399
在线时间1110 小时
主题帖子精华
初级会员, 积分 70, 距离下一级还需 130 积分
在线时间12 小时
串口的中断没有贴出哦!
主题帖子精华
初级会员, 积分 83, 距离下一级还需 117 积分
在线时间3 小时
学习了!非常感谢楼主!
做自己喜欢做的的事,爱自己所爱的人!
Powered bySTM32F407_ADC_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32F407_ADC
&&文章中介绍了STM32F407 ADC查询配置
你可能喜欢没有更多推荐了,
不良信息举报
举报内容:
STM32F4xx + 片外ADC 多路采集方案小结
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!21ic官方微信-->
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
STM32 ADC采集电压不准确的问题 急!
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
核心板是STM32F103ZET6,用PA4脚做DAC输出0----3.3V的电压,用PA5脚做ADC采集电压,用的是ADC1的5通道,现在PA4脚接到了电压跟随器的输入脚,PA5脚接到了跟随器的输出脚,电压值用1602显示出来,下面是测得的几组输入输出电压
& && && && &&&DAC(mV)& && && &&&ADC(mV)
1.& && && && && & 325& && && && && && && && && && &&&323
2.& && && && && && && && &300& && && && && && && && && && &&&291
3.& && && && && && && && &280& && && && && && && && && && &&&266
4.& && && && && && && && &250& && && && && && && && && && &&&227
5.& && && && && && && && &220& && && && && && && && && && &&&190
6.& && && && && && && && &180& && && && && && && && && && &&&139
7.& && && && && && && && &150& && && && && && && && && && &&&101
8.& && && && && && && && &120& && && && && && && && && && &&&62
9.& && && && && && && && &99& && && && && && && && && && && &36
10.& && && && && && && &&&80& && && && && && && && && && && & 12
11.& && && && && && && &&&77& && && && && && && && && && && & 8
12.& && && && && && && &&&71& && && && && && && && && && && & 1
13.& && && && && && && &&&70& && && && && && && && && && && & 0
问题就是现在输入的电压越大,那么ADC采集的就越准确 ,随着输入电压的减小, ADC采集的电压与输入的电压差别越来越大,是为什么呢?ADC通道也换过了,ADC1和ADC2也换过了&&还是这样,求大神指教!
技术达人, 积分 8548, 距离下一级还需 1452 积分
技术达人, 积分 8548, 距离下一级还需 1452 积分
技术达人, 积分 8548, 距离下一级还需 1452 积分
技术达人, 积分 8548, 距离下一级还需 1452 积分
可否上电路图看看。
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
实习生, 积分 42, 距离下一级还需 8 积分
先用表测下跟随器输出电压对不对?怀疑跟随器电路问题。
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
一般而言,STM32的ADC比它的DAC准。所以,如上面所说,最好用比较准的万用表量一下,ADC的输入脚电压。
另外,要看一下电压跟随器是不是轨到轨(rail-to-rail)输入的,如果不是轨到轨输入的 在电压接近0时会有偏差,跟LZ看到的情况 有类似之处。
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
logokfu 发表于
可否上电路图看看。
其他电路都没有接,只是用了一个LM358运放做的电压跟随器来测试ADC好不好使,结果就发现了上述的问题。
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
jerry_wtl 发表于
先用表测下跟随器输出电压对不对?怀疑跟随器电路问题。
用万用表测试过了,跟随器是好使的,没问题,输入多少输出就是多少,但是ADC转换出来的结果就是不对,差的数值也不是固定的,输如越小,差的越多,应该不是程序的问题。
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
IJK 发表于
一般而言,STM32的ADC比它的DAC准。所以,如上面所说,最好用比较准的万用表量一下,ADC的输入脚电压。
用万用表量了,ADC输入脚的电压=跟随器输出脚电压=跟随器输入电压=DAC输出电压,现在意味着ADC输入脚得到的电压是正确的,但是最后经过数据处理显示出来的总不对,也不是程序的问题,因为至少电压越大的时候结果也是蛮接近的,至少不是算法的问题。并且这个差值也不是固定的,很不解。总感觉正确的电压进到STM32以后被什么东西给阻抗着,管脚电压用万用表量正确,可最后结果就是不对。真是急死了,ADC的管脚也换个几个,都是一样的现象。还有一点就是,ADC管脚什么都不接的时候,用万用表量为电源电压3.3V,不应该是0吗(但这时候1602显示的ADC结果就是3.3V)?
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
初级技术员, 积分 11281, 距离下一级还需 -11181 积分
LM358运放记得是最普通的运放了,它不是轨到轨输入的 在电压接近0时会有偏差,在电压接近Vdd时也会有偏差。问题基本上可以认为在LM358运放这。
---------------------
---------------------
很值得关注, 上次我在 &DIY 四通道示波器& 的实验中, 也发现了这个问题.
由于是动态的过程, 精度误差比楼主的大多了.
我怀疑, DAC 后面直接给 ADC 是有问题的. 最好要有一级运放.
高级工程师, 积分 6038, 距离下一级还需 1962 积分
高级工程师, 积分 6038, 距离下一级还需 1962 积分
高级工程师, 积分 6038, 距离下一级还需 1962 积分
高级工程师, 积分 6038, 距离下一级还需 1962 积分
会不会是阻抗匹配的问题。
高级工程师, 积分 7950, 距离下一级还需 50 积分
高级工程师, 积分 7950, 距离下一级还需 50 积分
高级工程师, 积分 7950, 距离下一级还需 50 积分
高级工程师, 积分 7950, 距离下一级还需 50 积分
加大采样率&&不知道& &这个效果会不会好一点& &不是很了解& &顶一个
资深技术员, 积分 472, 距离下一级还需 28 积分
资深技术员, 积分 472, 距离下一级还需 28 积分
资深技术员, 积分 472, 距离下一级还需 28 积分
资深技术员, 积分 472, 距离下一级还需 28 积分
在运放输出端加一个负载电阻和一个小电容,降低采样时钟频率,增大转化时间试一试,ST的东西ADC的输入阻抗不能大了,大了的话必须降低采样率
高级技术员, 积分 843, 距离下一级还需 157 积分
高级技术员, 积分 843, 距离下一级还需 157 积分
高级技术员, 积分 843, 距离下一级还需 157 积分
高级技术员, 积分 843, 距离下一级还需 157 积分
我也碰到过这个问题,只是当时时间比较紧,没来的及多思考,就暂且搁下了,希望现在能和楼主一起解决这个问题。
高级工程师, 积分 7260, 距离下一级还需 740 积分
高级工程师, 积分 7260, 距离下一级还需 740 积分
高级工程师, 积分 7260, 距离下一级还需 740 积分
高级工程师, 积分 7260, 距离下一级还需 740 积分
片内adc就这样喽
加软件修正吧~!
高级技术员, 积分 596, 距离下一级还需 404 积分
高级技术员, 积分 596, 距离下一级还需 404 积分
高级技术员, 积分 596, 距离下一级还需 404 积分
高级技术员, 积分 596, 距离下一级还需 404 积分
1.LM358不是轨到轨
2.Input offset voltage& &最大7mv
3.你接的是单电源?双电源?
所以比较怀疑你的输入端和输出端是否真的相等。。。
助理工程师, 积分 1151, 距离下一级还需 849 积分
助理工程师, 积分 1151, 距离下一级还需 849 积分
助理工程师, 积分 1151, 距离下一级还需 849 积分
助理工程师, 积分 1151, 距离下一级还需 849 积分
用信号源测试ADC准确度,DAC用表测试,那样才能说ADC和DAC的是否正确?
资深技术员, 积分 455, 距离下一级还需 45 积分
资深技术员, 积分 455, 距离下一级还需 45 积分
资深技术员, 积分 455, 距离下一级还需 45 积分
资深技术员, 积分 455, 距离下一级还需 45 积分
把AD的输入直接接到最近的地上,看看转换后的电压是否接近0V。这样就可以先确认是ADC的问题,还是前端电路的问题,再做排查。
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
farrtone 发表于
1.LM358不是轨到轨
2.Input offset voltage& &最大7mv
3.你接的是单电源?双电源?
我是接的5V单电源供电,双电源供电有啥区别啊?
提示: 作者被禁止或删除 内容自动屏蔽
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
实习生, 积分 24, 距离下一级还需 26 积分
grasswolfs 发表于
电压测量相等是在所有电压范围都是相等还是只有一部分,跟随器后面开路还是电压表直接测试的? ...
所有范围都是相等的,(我的相等是指只有电压值的小数点后面第三位不同),&&跟随器后面什么都没有接,直接接的万用表。
扫描二维码,随时随地手机跟帖
精英会员奖章
等级类勋章
奔腾之江水
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
技术新星奖章
人才类勋章
技术领袖奖章
人才类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
荣誉元老奖章
等级类勋章
无冕之王奖章
等级类勋章
沉静之湖泊
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
时间类勋章
技术高手奖章
人才类勋章
涓涓之细流
发帖类勋章
甘甜之泉水
发帖类勋章
时间类勋章
时间类勋章
湍急之河流
发帖类勋章
时间类勋章
精华达人奖章
等级类勋章
您需要登录后才可以回帖

我要回帖

更多关于 农业问题紧急求助 的文章

 

随机推荐