STM32F103关于定时器捕获事件触发ADC问题
-
-
江湖渔民
- LV1工程师
-
| 2014-07-18 10:41:52
- 浏览量 8205
- 回复:6
本来是用EXTI11事件来触发ADC转换的,但是会有杂波干扰,使AD转换不稳定。所以就想到使用STM32上的定时器通道的数字滤波功能。用STM32的TIM1的数字滤波器来滤波输入触发信号的杂波的,结果TIM1的捕获触发一直不能触发ADC,让我十分郁闷!希望大神们帮着看看是怎么回事。。。(我使用EXTI11线的事件是能触发ADC,ADC也能触发DMA进行正常存储的。)
本来是用EXTI11事件来触发ADC转换的,但是会有杂波干扰,使AD转换不稳定。所以就想到使用STM32上的定时器通道的数字滤波功能。用STM32的TIM1的数字滤波器来滤波输入触发信号的杂波的,结果TIM1的捕获触发一直不能触发ADC,让我十分郁闷!希望大神们帮着看看是怎么回事。。。(我使用EXTI11线的事件是能触发ADC,ADC也能触发DMA进行正常存储的。)
太感谢了!!!!!!这么多感叹号只能代表我的心情!
困扰了我一个星期了,原来基本方向就错了。。。版主辛苦了!
另外,其实我也是刚开始接触ARM想着先学寄存器版本对cortex-M3架构多些了解,方便以后能对同架构的芯片上手快点。不过现在也觉得后悔的要死,因为基本上没人看我的代码,而且我看别人的代码也要一个函数一个函数的进去看参数设置。。。
近期也是准备重新开始学习库函数的开发方式!版主就是我的榜样啊!寄存器库函数样样精通~~~
我来给你一个详细的回复吧:
1、首先你对定时器触发ADC的方式理解有误,定时器触发ADC转换是通过比较输出通道不假,但不是输入捕获通道,而是输出比较通道,你现在的配置代码南辕北辙了,所以是无法实现的。
2、下面给你详细解释一下定时器触发ADC的过程:
请看这个图:
这里有6个定时器通道可以触发ADC,你用的是定时器1,CC1通道进行触发,这个要使用比较输出模式。
再看下面这个图:
这个是定时器的模块图,左边是作为捕获引脚,输入到定时器,右边才是输出,你用左边的输入通道,信号会进入定时器,不可能到ADC里面。
你的程序:
所以这样配置是不行的。需要把TTM_CC1改成比较输出配置才可以。
当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。这个很重要。要实现比较通道TIMER_CC1输出一个上升沿,只有把它配置在PWM模式下才有效。
所以你配置的时候,要采用这样的配置。
3 在ADC软件代码中,要把ADC 转换模式配置为单次转换模式,这样通过定时时间,定时器产生上升沿来触发ADC。
官网提供了定时器触发ADC的例程,你可以参考一下看看。
题外话:看到楼主的代码通篇都是寄存器,你让ST那些辛辛苦苦开发库函数代码的人员情以何堪!。STM32不是51,内部寄存器众多,采用寄存器方式开发代码,工作量大,移植也不方便,对于复杂大型程序(和别人合作更麻烦)。看到你采用了正点原子的架构,可能受到些影响,但长期来看,效果不佳。建议还是用库函数方式开发STM32哦!
首先你要搞清楚几点:
1.为什么TIM1的捕获触发一直不能触发ADC ?
2.你单独调试TIM1捕获触发有什么问题么?
3.你的ADC采集有什么问题么?能正常采集,正常退出么?
个人建议:
1.如果以上都没有问题,那么说明你的程序在整合的时候出了问题,这个就要靠调试了。
2.可以先设置断点,在你捕获ADC之前和之后都设置一个断点,先全速运行,看看是否可以顺利通过。如果不能说明你的程序死在了某个地方。
3.如果以上都没有问题,那么就是你的配置问题了。
以上仅仅是提供了方法,代码没有看。希望对你有帮助
嗯,这个检查了一下,我的设置也是没问题的!这个函数就是设置ADC1是由外部T1的TRGO事件触发。
我的工程中的adc.c文件的第29行 “ADC1->CR2&=~(7<<17); ” 是同样的效果(不过是选择TIM1_CH1的捕获/比较事件作为触发)
T1_TRGO 触发 ADC1 注入转换, 参考一下
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);