嵌入式技术论坛
直播中

刘艳

7年用户 2254经验值
私信 关注
[经验]

M2354芯片的PWM功能和定时器功能介绍

环境介绍

Keil : 版本5.34.0.0 编译器V6
官方SDK版本:Nuvoton.NuMicro_DFP.1.3.12
RT_THREAD -3.15 nano 请在KEil 的Run-Time Environment环境进行下载

芯片资源介绍

手上的这个M2354芯片定时器资源十分的丰富,6个32位定时器,每个定时器有 1 个 24 位向上计数器。其中TMR0-TMR3四个功能强大,有带死去的互补PWM功能适合电机控制,TMR4-TMR5 PWM简单一些。详细功能参考TRM_M2354_Series_EN_Rev1.01文档 第6章9小节。

该芯片的PWM功能和定时器的功能比较独立,寄存器都是独立的,PWM有自己的计数器16位,比较器和重装载寄存器。详细功能参考手册6.9.6 PWM的功能描述

例程功能介绍

绿灯在使用操作RT RTOS 一个线程实现绿灯1秒闪烁一次。

实现功能: 定时器0的通道1 10KHz 的PWM 输出控制一个LED实现呼吸灯

关注点:PWM时钟计算、PWM周期计算

工作原理:

设置计数模式的PWM为向上计数,(另有向下计数、中心对齐计数模式)

计数操作模式为自动自动重载模式(另有单次模式)

输出模式为独立模式,(另外有互补输出模式,一般驱动上下MOS)

PWM脉冲发生器利用计数器和比较器事件产生PWM输出脉冲。在Timer0 ~ Timer3 PWM中,事件分为上计数型和下计数型的零点和周期点,上下计数型的中心点,三种计数类型的计数器等于比较器点。

下面是向上计数的事件点,

1.jpg

向上计数的就这个三点决定占空比,分别是PWM的周期起点,跳变点,周期终点

这个对比事件和零点事件还有一个优先级的问题,不过以从文档中并没有太理解说明的问题

1.jpg

根据事件优先级的限制,PWM发生器只支持上计数和上下计数两种占空比为0%和100%的PWM输出波形。下图是向上计数的占空比从0%到100%PERIOD为4,CMP值不同 (原文), 这句话不是很好理解,理解的朋友可以留言一下

但是可以确认PWM零点事件到比较事件区间是一个电平,比较事件到周期点一个电平。比较值大于重装载值,计数器为0,是一种电平,小于是,是一种电平。具体电平和极性有关。

1.jpg

最后我们实现一个10Khz频率,占空比可调的功能

TIME_CLK 96MHz PWM分频96,pwm的基础频率就是1Mhz ,pwm的基础频率/计数值 = 周期10Khz

现在PWM的控比只和比较值有关了,我们在程序运行的时候不断更改就可以调整占空比了

TIMERx_PWMPOLCTL[0] 控制PWM输出的极性。

配置步骤

确认外设时钟源,以及频率,设置预分频器
设置工作模式
设置CMP 的初始值
配置中断优先级
使能中断,TIMERx_CMP与TIMERx_CNT值匹配中断,TIF中断。
使能定时器
代码
初始化函数

void TIMER0_PWM_Init(void)
{
/使能外设时钟/
CLK_EnableModuleClock(TMR0_MODULE);
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_PCLK0, 0);
/重映射引脚/
SYS->GPB_MFPL &= ~(TM0_PB5_Msk | EPWM1_BRAKE0_PB7_Msk);
SYS->GPB_MFPL |= (TM0_PB5 | EPWM1_BRAKE0_PB7);
TPWM_ENABLE_PWM_MODE(TIMER0);
TPWM_ENABLE_INDEPENDENT_MODE(TIMER0);
TPWM_SET_COUNTER_TYPE(TIMER0, TPWM_UP_COUNT);
TPWM_ENABLE_OUTPUT(TIMER0, TPWM_CH0);
// TPWM_ConfigOutputFreqAndDuty(TIMER0, 1000, 50); //SDK提供的api
TPWM_SET_CMPDAT(TIMER0, 49);
TPWM_SET_PERIOD(TIMER0, 99);
TPWM_SET_PRESCALER(TIMER0,95);
TPWM_START_COUNTER(TIMER0);
}
应用线程

static void rt_pwm_thread_entry(void* parameter)
{
static uint8_t temp;
static uint8_t flag;
while(1)
{
if(flag == 0)
{
temp++;
if(temp >= 100)
{
flag = 1;
}
}
else
{
temp--;
if(temp <= 0)
{
flag = 0;
}
}
TPWM_SET_CMPDAT(TIMER0, temp);
rt_thread_delay(15);
}
}

输出结果

1.jpg

使用下来,芯片PWM功能都大同小异,不过从寄存器数量可以看出来M2354定时器PWM功能很丰富。

原作者:wenkit

更多回帖

发帖
×
20
完善资料,
赚取积分