breath
1 前言厂商提供的demo里有呼吸灯的例程,拿出来分析测试一下,将GD32VF103的定时器配置和PWM控制弄清楚,后面步进电机控制等都需要用到PWM输出,例程中使用的是 timer0的channal0,通过改变输出方波的占空比来调节呼吸灯的明暗程度。 1.1 PWM 简介脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟 电路进行控制的一种非常有效的技术。简单一点说,就是对脉冲 宽度的控制, PWM 原理如图 1.1 所示:
图 1.1 PWM 原理示意图 图 1.1 就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM 模式,且当 CNT=CCRx 时输出 1。那么就可以得到如上的 PWM 示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。 改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。 1.2 Timer0简介高级定时器(TIMER0)是四通道定时器,支持输入捕获和输出比较。可以产生PWM 信号控
制电机和 电源管理。高级定时器含有一个 16 位无符号计数器。
高级定时器是可编程的,可以用来计数,其外部事件可以驱动其他定时器。 高级定时器支持霍尔传感器接口功能,该功能可以用来控制 BLDC 电机。这个功能挺实用,后面会专门测试此功能效果如何。
高级定时器包含了一个死区时间插入模块,非常适合电机控制。
定时器和定时器之间是相互独立,但是它们的计数器可以被同步在一起形成一个更大的定时器。 定时器之间的相互连接可以实现定时器的级联或者同步。可以通过配置一个定时器工作在主模
式, 另一个定时器工作在从模式来实现。这个模式在控制步进电机时很方便,可以在用主定时器输出波形的同时通过从定时器监控输出的频率,可以作为反馈或是速度显示的依据。
2 软件设计 2.1 PWM配置过程1、 初始化GPIO 2、 定时器配置: 1) 配置时钟,SystemCoreClock= 108M; SMC[2:0]=3’b111(外部时钟模式0),定时器选择外部输入引脚作为时钟源, 定时器时钟TIMER_CLK,即内部时钟,经APB2预分频器后分频提供给timer0,如果APB2预分频系数等于1,则频率不变,否则频率乘以2,此处没有乘2; 2) PSC_CLK即经过预分频器prescaler后的时钟,预分频器可以将定时器的时钟(TIMER_CK) 频率按1 到 65536 之间的任意值分频,分频后的时钟 PSC_CLK 驱动计数器计数。比如定时器时钟TIMER_CLK = SystemCoreClock= 108M;prescaler系数设为108,测计数的频率是1MHz,此处demo中注释和程序都不对,prescaler系数设的是120,108/120不可能获得1M的时钟。 3) 设置计数方式为边沿对齐,方向为向上计数,计数周期为500,计数周期period和预分频系数prescaler决定了输出PWM的频率,计算公式是: 周期T = (1 / SystemCoreClock / prescaler) * period =( 1/108000000/108)*500= 500uS; 频率 F = 1/T = 1/0.00005 = 20KHz; 4) 设置channal0为输出通道 5) 开启自动重载,开启timer0使能。
2.2 代码编写1、引脚配置
2、定时器配置
3、呼吸灯效果,定时改变PWM的占空比
3 效果演示请查看视频。 4 参考文档1、GD32VF103Datasheet 2、GD32VF103 UserManual 3、原理图GD32VF103R-START-V1.0.pdf
波形显示
|