GD - EmbeddedBuilder_v1.4.1.23782 - PWM官方工程功能记录
文章目录
- GD - EmbeddedBuilder_v1.4.1.23782 - PWM官方工程功能记录
- 概述
- 笔记
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\CMP\CMP_pwm_signal_control
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER0_dma
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER0_dma_burst
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER0_pwmout_complementarysignals
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER1_exttrigger
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER1_pwmout
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER2_pwminputcapture
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMERs_cascadesynchro
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMERs_parallelsynchro
- EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER
- TIMER0_6-steps
- TIMER0_deadtime_break
- TIMER1_extclock_count
- TIMER1_ocactive
- TIMER1_octoggle
- TIMER1_singlepulse
- TIMER2_inputcapture
- TIMER2_ocinactive
- TIMER2_timebase
- 备注
- END
GD - EmbeddedBuilder_v1.4.1.23782 - PWM官方工程功能记录
概述
将EmbeddedBuilder_v1.4.1.23782自带的demo工程中关于PWM的工程的功能摘出来记录一下。
以后自己工程需要类似PWM功能时,就看一下功能记录,不用从头翻官方例程了。
笔记
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\CMP\CMP_pwm_signal_control
通过图形化配置TIMER0的输出通道(TIMER0_CH0),直接输出PWM.
通过CMP0的输出通道从MCU内部连接到TIMER0 OCREFCLR(output compare reference clear), 用于停止TIMER0_CH0的PWM输出
输出的PWM的波形都一致。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER0_dma
通过图形化配置TIMER0的输出通道(TIMER0_CH0),直接输出PWM.
通过TIMER0加入DMA,从内存到设备传数据。
要传送的数据可以自己定义,要传送几种波形,一种波形重复几次, 每种波形的占空比。
PWM的重复序列是以定义的DMA占空比数据和每个波形的重复次数为一个单元进行重复的。
可以发送一个有自己定义的数组中规定的有意义的PWM波数据组。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER0_dma_burst
配置TIMER0的全部4路PWM输出。
配置TIMER0通道2的更新(TIMER0_CH2_UP)为DMA, 从内存到设备。
可以配置DMA数组数据(占空比),让4路PWM输出按照自己定义的DMA数组数据输出。
uint32_t timer_chval[8] = {99, 199, 299, 399, 499, 599, 699, 799};
效果:
第1次DMA更新, TIMER0_PWM_CH0 = 99(占空比值), TIMER0_PWM_CH1 = 199(占空比值), TIMER0_PWM_CH2 = 299(占空比值), TIMER0_PWM_CH3 = 399(占空比值);
第2次DMA更新, TIMER0_PWM_CH0 = 499(占空比值), TIMER0_PWM_CH1 = 599(占空比值), TIMER0_PWM_CH2 = 699(占空比值), TIMER0_PWM_CH3 = 799(占空比值);
以后的DMA更新,就是循环 第1次DMA更新, 第2次DMA更新
对于PA8(TIMER0_PWM_CH0)的PWM占空比输出值,就是99, 499的循环波形。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER0_pwmout_complementarysignals
配置TIMER0的3路PWM(TIMER_CH0, TIMER_CH1, TIMER_CH2)为双输出(正向,反向)
e.g. TIMER_CH0值 = 1时,TIMER_CH0_ON值 = 0. 等于是TIMER_CH0和TIMER_CH0_ON的值是互补的。
e.g. TIMER_CH0占空比 = 10%时,TIMER_CH0_ON占空比 = 90%. 等于是TIMER_CH0和TIMER_CH0_ON的值是互补的。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER1_exttrigger
用pin来触发定时器的PWM, 实验用的是TIMER1_CH0来触发TIMER1_CH2上的PWM输出。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER1_pwmout
将TIMER1的3个通道(TIMER1_CH1,TIMER1_CH2,TIMER1_CH3)都配置成PWM, 其输出不同占空比。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMER2_pwminputcapture
用TIMER2捕获输入的PWM波形的频率和占空比,并用串口输出。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMERs_cascadesynchro
用TIMER1 => TIMER2 => TIMER0串联成一个更大的定时器。
这要没有图形化配置,很难用代码配置成功(主要是不知道配置的对不对)。
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER\TIMERs_parallelsynchro
用TIMER14作为TIMER2和TIMER0的时钟的并联输入,让TIMER2和TIMER0输出PWM.
EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\TIMER
因为PWM全部使用定时器完成的,想再看看官方的TIMER例程都讲了啥。
TIMER例程中有一些是专门将PWM的例程,上面都看过啥干嘛的了。将剩下的例程功能记录如下:
TIMER0_6-steps
配置了TIMER0的3个通道的正相和反相(共6个pin)和TIMER0_BREAKIN(死区时间相关)
通道的触发模式为定时器模式
在中断回调(timer0_irq_parameter.commutation_handle)来操作3对通道的输出。
TIMER0_deadtime_break
在波形(正向输出通道和对应的互补输出通道)变化时,加入死区时间。
TIMER1_extclock_count
对TIMER1的通道输入进行沿计数
TIMER1_ocactive
TIMER1的3个通道输出波形,3个通道的波形有相对延迟时间。
TIMER1_octoggle
不用PWM模式,也能输出PWM波
TIMER1_singlepulse
用按键触发一个单脉冲输出
按键所在的输入通道和单脉冲的输出通道,都是TIMER1本身的通道,不能是任意pin.
TIMER2_inputcapture
TIMER2的输入捕获。
通过 timer2_irq_parameter.channelx_capture_handle 的回调测量捕获波形的高电平脉宽,从而能算出被捕获波形的频率。
TIMER2_ocinactive
TIMER2的输出变化侦测,可以知道什么时候输出通道的电平发生变化(到达比较值)
在timer2_irq_parameter.channelx_compare_handle回调中写自己的判断逻辑。
"Clock source"的实际值都是一样的,都是CK_TIMERX, e.g. 108MHZ
如果"Clock source"是disable, 分频时的单位是MHZ.
如果"Clock source"是internal clock, 分频是的单位是HZ.
对于定时器的比较模式,有点概念了。
官方文档上有说明
TIMER2_timebase
用TIMER2产生一个1秒钟的时基(tick), 那么在这个1s的tick回调(timer2_irq_parameter.update_handle)中,就可以做事情了。
如果让一个TIMER来做扩展时基,配置时,只需要指定时钟源为内部时钟。其他都不选或者都是disable.
如果有自己的回调要执行,才需要配置对应的系统中断。
否则不用生成系统中断
备注
看EmbeddedBuilder_v1.4.1.23782的官方工程实现,如果想将实验都做了,需要6通道的示波器…
官方PWM的demo, 演示的比较简单。只演示了这些知识点的启动,然后就让用户自己用示波器去看输出波形。
至于何时启动/停止/动态改变占空比这些实际应用中要用到的动作,一点没说。