×
单片机 > 单片机程序设计 > 详情

STM32使用TIM触发ADC,CUBEMX配置

发布时间:2020-06-01 发布时间:
|

       上一篇博客讲到,要采集准确的电机电流值,需要在PWM发波的高电平中间,或中间靠后进行ADC采样



          这样可以确定采样出来的电流是真实的电机电流,应该是会比平均电流大写的。因为我这边PWM产生是用TIM1的互补PWM通道,而TIM1又是由TIM3的COM事件来触发的,现在我需要有另外一个定时器来产生一个跟TIM1周期相同,但是PWM的值是TIM1的一半的波形,这里我选择的是TIM15,因此需要保证TIM15的CCR寄存器的值为TIM1的一半,因此,可以直接在TIM1的溢出中断的回调函数中更新TIM15的CCR寄存器的值:



       接下来就是要保证TIM1与TIM15同步了,因为TIM1是TIM3(霍尔定时器)的从定时器,那么,将TIM15也配置为TIM3的从定时器就可以了,由寄存器参考手册可知,TIM15的触发源是ITR1:



然后将CUBEMX的触发源选择为ITR1,并且选择复位模式,选择内部时钟:



在配置好触发源之后,我们希望的是使用TIM15的PWM结束的时候,这样讲有些歧义吧,换个说法就是咋TIM15的计数值CNT达到CCR的值的之后,触发ADC开启采集,那也就是说TIM15需要开启主从模式,并且需要发送一个OC1REF信号(因为使用的是1通道):



        在这里需要说明一下这个OC1REF信号的产生必须是在PWM模式下的,最开始我也不清楚,连同公司的软件大佬一起搞这个问题搞了两天,依旧是发送不出来这个OC1REF信号,最后还是看到了一篇博客:http://blog.sina.com.cn/s/blog_155ff95b20102wwen.html,里面最后一段话有提到这个:

我之前没有配置PWM模式的CUBEMX是这样的:



一个原因是因为我不知道这个姿势点,另一个原因是因为确实我的引脚资源不够用了,已经没有引脚给我配置PWM了,后来看了那篇博客之后,将TIM15配置改为:



当然理论上,配置成Output Compare No Output模式,然后TIM15的TRGO信号使用OC1信号也是可以的,这个我没有测试。也是参考了那篇博客,我将ADC改为了上升沿触发,而要使用上升沿触发,那么只需要将TIM15改为PWM2模式就可以了:



          接下来就是ADC那边的配置了,因为我们是要在PWM高电平的中间采集一次,下一次PWM再采集下一次,因此需要将ADC配置为单次采集,至于DMA配置的话,正常模式与循环模式都是可以的,只不过是多一句重新启动的问题,我采用的是DMA循环模式,而触发信号就选择TIM15的处罚信号,上升沿触发,配置如下:

实际用示波器的电流如图:



方框内为发波时的电流波形,我现在把负载调小了些,所以电流小了些。


实际STM32读出来的电流波形如图:(使用了串口打印出来,每个PWM周期采集一次,即66us采集一次)



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会