cu4fhfzhmt264087485736.png
) j7 K" I' Q& Z b M5 J$ Q* t
一、工具' ^5 p( u/ l' H, H
1、硬件:GD32F30x系列单片机 2、编译环境:KEIL8 z. A5 g" f, Q4 Q& }/ V0 ^2 t9 v2 n
二、需求分析如下图所示,现要求控制单片机同时输出3路方波,并且每个方波的高低电平持续的时长是可调整的,因为对时长有着严格的要求,这就需要在方波开始输出后就不能再通过软件进行干预,完全交给单片机的硬件自己去完成。通过观察要输出方波的特点,除了LED_PWM波具备PWM波形的特点,其它两个与PWM波形有着很大的不同,于是乎想使用单片机的定时器的PWM模式输出剩余两种波形很显然行不通。这时候应该想到单片机定时器另一种比较灵活的输出方波的模式就是“输出比较模式”,当然PWM模式也是输出比较模式的一种。% k- Q) a2 C4 e; g
ut0pcqp5mzd64087485836.png
( J$ I5 N* ^- n, G: I通过分析,似乎找到了输出以上波形的方法,至于能否实现还需要通过代码实现并调试去验证。那么还有一个需求也与以上输出的波形有关,那就是能够每次在t4时间段内进行电压采集,电压的变化也是受以上三个方波影响的(至于电压的采集方法我会在另一篇文章中介绍),为了保证采集的电压稳定,可以适当的在t4时间段内多次采集。熟悉单片机定时器的知道,想要每次都能够在t4时间段内采集电压,需要触发中断或者事件来实现,而能够触发中断或者事件点除了t4的开始和t4的结束也就是电平发生转换时,在t4中间是没法触发中断或者事件的,而如果只在t4的开始和t4的结束区采集电压,很可能采集到的电压并非所需要的电压。为了实现在t4时间内采集多次电压,我就想到了定时器的另一个还没有用的通道,如果让它也输出一个波形,并且使这个波形的电平能够在t4时间段内发生多次转换,那么我就可以通过触发中断的方式进行多次电压采集。理想的方式如下图紫色波形所示(当然也是我已经实现的结果,实际程序是不会输出紫色波形的,你现在看到的是我通过一个普通的IO引脚在中断中反转得到的),黄色波形是上图MEA_S2的波形。
2 w" k; f' W' Q( ]2 v
emijfyjhvnj64087485937.png
/ F% Q6 x/ H6 V4 q这里需要指出,虽然我使用了定时器的一个输出比较通道输出一个波形用于采集电压,但这个波形并不占用引脚资源(你可以把这个引脚用作除定时器以外的功能),算是一个抽象出来的波形。如下图所示,通过对用户手册的解读以及实际验证,发现是可以屏蔽通道输出的。
y2 C" c! ^4 d& F3 [/ H3 K% u
hb3ejkbp1iu64087486037.png
/ M% F& K9 d" R# W
在相关的寄存器中我们也可以找到相关的控制位,比如通道0,如下图所示,只要我们把该位置0就不要担心该引脚被用作其它功能了。* N* [% O/ L. Z; m7 ?& Y
p0e4zzcugnk64087486137.png
& X$ I- k; B# B4 R X
==========
! _ a x/ Z/ r$ @往期回顾:GD32F470的RTC时间设置和获取) ~" ?1 g; Q4 ~* l$ ?
嵌入式软件工程师常用的* n+ K6 V" q! [& m5 T: n
单片机的RTC获取网络时间
3 @% S, E; H# W& t4 b' W9 D我都不知道的PWM的很偏的问题7 X X3 i8 t; Z/ e: j
一个小细节,精度提供一大截5 @% r" \- Z) x: S8 k* \
==========原文:点击阅读原文
~$ v2 |9 E* i2 `7 ]& U6 {作者:不要让自己太懒8 Y2 l$ ~1 v& U q2 ^* p
平台:博客园
% I( W0 n3 |6 n7 N7 Q
mkn2oq1qujy64087486237.png
5 s+ e+ ~- m$ ?1 [
xe1w02u20eq64087486337.png
: v: [9 S$ e/ B0 q1 Y
lv0smecdjig64087486438.png
|