前面我们了解过TOM模块产生PWM的基本原理,这一帖我们来看看怎么配置产生一个基本的PWM波以及怎么产生多通道的PWM。
1,ILLD配置产生PWM
首先我们使用TOM0模块,在channel_0产生一个周期为10ms,占空比为10%的PWM波。
我们按照ILLD的参考例程来编程
图1:ILLD_TOM参考例程
第一步是使能GTM模块,配置TOM输入时钟;
配置寄存器CLC.DISS=0使能GTM模块,对应ILLD中函数
IfxGtm_isEnabled(Ifx_GTM *gtm);
上一帖我们讲过CMU单元的基本结构,系统时钟经过CFGU分频得到8个基础时钟,接着其中之一进入FXU分频5个TOM输入时钟。时钟初始化函数如下:
图2:TOM时钟初始化
在CFGU单元,将系统时钟进行初始分频得到GCLK,我这里将该时钟设为最大100MHz;接着还是在CFGU单元,将GCLK分频得到8个基础时钟ECLK,这里我们选择CMU_CLK_0,将其配置为最大100MHz。当然这个频率可以更具实际情况来设置,例如设置为1MHz,那么需将frequency改成1000000,该参数的单位是Hz。
现在我们就得到了FXU单元的输入时钟CMU_CLK_0;接下来使能FXU单元,然后选择一个FXU单元的输出时钟作为TOM单元的时钟即可(在配置TOM时选择)。
第二步是配置TOM模块以及通道
图3;TOM初始化配置
我们按照ILLD做好的封装直接进行配置,我们需要配置的参数为TOM0的channel0产生周期为10ms,占空比为10%的PWM波,并且使能周期中断。首先来看看需要配置的参数:
图4:参数配置函数内容
如图所示,在默认配置中,我们配置了TOM0,channel0,而且时钟选择了FXCLK0。根据上讲的内容,FXCLK0=CMU_CLK_0。按照我们的配置,那么这个时钟极为1MHz,所有tom的TIMER的时基为10us。也就是说,我们需要配置period=1000,表示10ms,dutycycle=10%*period=100,表示1ms。
将channel0的输出映射到相应的IO口,在文件GTM_PinMap.c中找到映射,如图5所示:
图5:TOM输出IO口映射
另外需配置立即启动,表示初始化完成后即可启动PWM波。
第三步是中断配置
首先我们需要在参数配置中使能中断,配置中断处理终端,中断优先级。
(1)中断使能
TOM中支持两种中断,一种是CN0=CM0时,对应的周期中断:ccu0中断
config->interrupt.ccu0Enabled = TRUE;//使能周期中断
另一种是CN0=CM1时,对应的是匹配中断:CCU1中断
config->interrupt.ccu1Enabled = TRUE;//使能匹配中断
(2)中断处理终端
config->interrupt.isrProvider = IfxSrc_Tos_cpu0;//配置CPU0为中断处理中断;
(3)中断优先级
tomConfig.interrupt.isrPriority = TOM0_CH0_PRIO;//需自行定义
(4)装载中断handler,使能中断
IfxCpu_Irq_installInterruptHandler (TOM0Ch0_ISR, TOM0_CH0_PRIO);
包含两个参数:中断处理函数和中断优先级。
IFX_INTERRUPT(TOM0Ch0_ISR, 0, TOM0_CH0_PRIO)
{
}//对应的中断处理函数
经过这么个流程PWM便可以产生了,至于PWM的启停以及周期和占空比的更新,我们下回分解。
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。