
01、引言
最近,有客户提出一个问题,STM32G4xx的片上比较器,在一个PWM周期内可否只响应第一次比较,并锁定输出状态,后续无论输入如何变化,比较器的输出不再变化,直至下一个PWM周期开始时复位,比较器可以重新开始工作。
如图1所示,紫色是外部输入模拟电压,这里我们用一个锯齿波来模拟外部输入波动的信号,橙色是参考电压,黑色是比较器的输出,蓝色表示一个PWM计数周期。由下图可以看出比较器在第一次完成比较动作后,输出不再有变化。虽然后面还有信号会造成比较器动作,但是比较器不再响应,直至下一个PWM周期开始又重新恢复。
▲ 图1. 客户需求
02、实现步骤
在硬件上,STM32G4并未设置有专门的控制单元可以实现比较器的输出锁定功能,但是STM32G4拥有丰富的内部互联总线,比如比较器的输出可以作为TIMER的输入捕获,TIMER也有多种事件可以触发DMA,DMA又能完成内存到外设/外设到内存的数据搬运。
有了这些灵活的功能,我们就可以完成客户这个要求。具体实现思路为:由于比较器的反向端可以由芯片内部DAC产生,因此我们可以通过控制DAC值的大小来调整比较器的参考电压。
如图2所示,外部输入电压与DAC设定电压通过内部比较器进行比较,当比较器发生动作时,同时将DAC输出电压(橙色)迅速拉到最低,这样无论比较器同相端输入的电压是多少,比较器绝无翻转的可能性,以达到锁定输出的目的。在下一个PWM周期开始时刻再将DAC输出电压调整到所需比较的参考值。
▲ 图2. 实现方法
那么,为了实现这一功能,就需要比较器参考电压输入给定能够自动完成以下两件事情:
• 比较器发生比较事件后,立即将参考电压设置为‘0’;
• 在Timer发生周期性事件后,再把参考电压设置为所需的比较值。
这两个事情可以通过STM32 MCU的DMA来协助自动完成。
2.1. 硬件连接
我们以NUCLEO-G474板为例,选用内部COMP1比较器,并且选用DAC1_OUT1的输出直接给到比较器的参考端,同时比较器的输出送到IO口之外,同时通过内部连线连接到TIM2的 Input Capture Channel 1的通道,如图3所示。
▲ 图3. 硬件配置
2.2. 系统实现
如图4所示,要实现这个功能能够自动运行,这就需要DMA来协助了,DMA可以设置Memory To Peripheral模式,只需要有合适的触发源,就可以自动将数据搬运到DAC数据寄存器DHR12R1内,从而达到改变DAC输入电压的目的。图4红色箭头为外设事件给DMA启动搬运的触发信号。
由于STM32G4xx并无Comparator事件可以直接触发DMA,但是Comparator的输出可以通过内部总线连接到TIM2_CH1的输入捕获通道上,再由TIM2_CH1产生捕获事件去触发DMA。
这样,当比较事件发生以后,同时将信号通过内部总线tim_ti1_in1送到TIM1_CH1,同时TIM1_CH1捕获事件触发DMA将‘0’搬运到DAC的数据寄存器‘DHR12R1’内,以达到DAC输出为‘0.0 伏’的目的。
同时,TIMER的update事件TIM2_UP可以直接触发DMA,这时再将‘设定值’搬运到DAC的数据寄存器‘DHR12R1’内,以恢复DAC输出正常的参考电压的目的。
实现这两个功能后,就可以自动的改变比较器的参考电压,而无需软件参与,从而实现客户要求的目的。
▲ 图4. 实现原理
2.3. CUBEMX配置
2.3.1. 比较器的配置比较器参考端选用内部DAC1_OUT1,如图5所示。
▲ 图5. 比较器的CUBEMX配置
2.3.2. DAC的配置
DAC输出是可以直接选择‘OUT1 Connected to on chip-peripherals only’的,在这里选择’Connected to external pin and to on chip-peripherals‘的原因是调试过程种可以用示波器观察DAC的输出逻辑是否正确,如图6所示。
▲ 图6. DAC的CUBEMX配置
2.3.3. TIMER2配置
这里将COM1_OUT的输出通道内部连接到TIM2_CH1输入捕获通道上,这样就有了两个事件,一个是TIM2_UP事件,一个是TIM2_CH1事件,这两个事件可以触发两个DMA通道,DMA配置为Memory To Peripheral模式。
2.4. 软件实现
建立两个全局变量分别存放DAC的’0’值与’设定值’,注意这两个变量的存放地址要能被DMA访问到。
软件配置DMA源地址与目的地址,源地址就是上面刚刚定义的两个变量的地址,目的地址就是DAC1->DHR12R1寄存器,并且启动DMA。同时再启动TIM2,COMP1,DAC1等外设。
03、试验结果
将程序下载运行,通过示波器观察。如下图所示,红色边沿翻转一次表示一个PWM周期,蓝色为Comparator1的输出,黄色为模拟外部输入的信号,比较器的设定值在这里没有显示出来,为内部DAC输出到比较器参考端。
图7为示波器截图,由此可以看出,比较器在第一次比较后,就锁定了输出,直到下个PWM周期才复位,又可以进行比较了。
▲ 图7. 试验比较器输出波形
04、总结
本文阐述了一种STM32 MCU片内比较器锁定输出实现的一种办法。在STM32G4xx系列MCU上,虽然没有专门的配置可以设置比较器响应后的处理逻辑,但是STM32G4xx内部有丰富的互联总线,以及多种DMA外设,通过合理的配置组合可以实现一些复杂的功能。
来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。