前言
上次写了Port跟Dio相关的内容,虽然有些配置项没那么清晰,但是最重要的其实是思路,这个模块能实现什么样的功能,有哪些接口,跟其他什么模块有关?今天我们来看看PWM的实现。
关联性
即在EB中,除了我们这次主要关注的PWM模块外,还有哪些模块是需要额外配置的?不配置就会出错的?
首先就是Port,PWM总是要通过pin脚输出的,pin脚的输入/输出,输出的复选类型总得配好了,这部分内容见上一篇:英飞凌AURIX2G系列TC37x——MCAL配置之 Port & Dio(Draft版本)
其次是时钟,时钟是来源于GTM?还是CCU6?(有的同学可能就要问了,为什么没有GPT?我目前的理解:EB里只支持这两个,不信你看这个模块的名字:Pwm_17_GTMCCU6),那相关联的这些时钟模块在哪里配置?接下来我们来揭晓——
PWM
General: 主要配一些API的使能,对应在MC-ISAR_TC3xx_UM_Pwm_17_GtmCcu6.pdf中也可查阅
LowPower/PowerStateSupport…后三个container暂且不论,按默认处理。
抓住主要矛盾才是最重要的,不要被不重要的信息挡住去路。
如果得到的需求period和duty都是需要可调的,那么可以勾上PwmSetPeriodAndDuty项,若只有duty可调,可以只勾选PwmSetDutyCycle,按需勾选。这两项在生成代码中体现在:
下面这部分配置项中,重要的是:PwmDutyShiftInTicks,这个选项决定着在调用上述两个函数时,duty这个参数设置的是绝对时钟tick,还是0%-100%的相对时钟tick。其他的我没怎么用到,就按默认配置来了。
——————**************************************—————
接下来,便是本篇的重头戏:PwmChannel,我们新建一个Channel:
-
ChannelId: 从0开始递增,没什么好说的
-
PwmAssignedHwUnit: 此处便到了指定时钟源的部分了,指定时钟源是GTM/CCU6
-
PwmDutycycleDefault: 默认占空比,此处设置为0,如果你的需求不是0,则要根据你的占空比算出tick数填进去
-
PwmIdleState:初始电平/默认电平/停止电平
-
PwmPeriodDefault:默认状态下周期tick数
假设:fpwm = 100MHz,目标频率:fd = 20kHz,则目标period = fpwm/fd = 5000; 若目标频率:fd = 1khz, 则目标period = fpwm/fd = 100000,但由于当时钟源模块为TOM时,此配置项的值要小于0xFFFF,因此要将TOM输出的时钟分频后再计算
- PwmPolarity:
简易图示:
- PwmShiftValue (0 -> 16777215):此项主要指定当在程序中想要修改duty时,不同的value对应的占空比;
(当General中PwmDutyShiftInTicks 配置为OFF时,0为0占空比,0X8000为100%占空比;
当PwmDutyShiftInTicks 配置为ON时,0为0占空比,要根据配置项:PeriodDefault为100%占空比,从而算出duty对应的ticks)
此项配置Channel为哪种模式:
- PWM_FIXED_PERIOD: 固定周期,仅占空比可调
- PWM_FIXED_PERIOD_CENTER_ALIGNED:
此通道引用一个固定周期的PWM通道,从而产生中央对称式PWM,仅占空比可调 - PWM_FIXED_PERIOD_SHIFTED: 此通道引用一个固定周期的PWM通道,占空比线性变化,仅占空比可调
- PWM_VARIABLE_PERIOD: 周期,占空比均可调。
当此PWMchannel的时钟源选择为GTM时,需要在channel中引用所用到的GTM通道,将两者map起来,CCU6同理。
————————————**************************————————————
下面介绍如何去配置PWM的时钟源
我在使用时采用的GTM的TOM通道,其实也不算我选的,需求里需要的引脚跟GTM-TOM通道是绑定的,因此也不是我想用什么就用什么(手动狗头)
假设,需求里所需要的引脚是:P32.6 输出周期为1khz,占空比默认为0的PWM。
-
根据datasheet,发现P32.6为GTM_TOUT141
-
在TC3xx_Appendix_UM中查到TOUT141对应TOUTSEL17这个选择寄存器中SEL5
-
索引到相应寄存器的位置,能看到P我们所要配置的pin脚对应TOM1的channel8
-
目前为止, 我们已经知道了将要索引的是哪个TOM哪个channel,EB 里打开MCU的hardwareResourceAllocation,打开TOM1,channel8,将其分配给PWM
-
那么这个TOM通道输出的时钟频率如何确定呢?怎么跟Port连接起来呢?我们打开Mcu/GtmGlobalConfig:
-
先打开对应的TOM通道,将该通道选择为对应的pin脚
-
接下来就是时钟,TOM的时钟源我们选择:CMU_FXCLK
8. 在CMU中,Global Clock Divider对应EB中GTMClockManagementConfig,此处不分频
在FixedClocksetting中选择CMU_GLOBAL_CLOCK_SEL0,FXCLK_SEL选择全局时钟为产生FIXED_CLK的源,而不是上图中CMU_CLKx; 而不同的FX_CLK对应的分频也是固定的。
若fgtm = 100Mhz, 则FX_CLK0= fgtm/1 = 100Mhz, FXCLK1 = fgtm/16 = 6.25Mhz,由此类推,见图上
9.由于GTM模块,TOM,ATOM等都是属于一个cluster中的,因此我们来看cluster的选择:
10.在PWM模块索引GTM channel时,选择GTM的时钟源为FIXED_CLOCKx
若fgtm = 100Mhz, 则FX_CLK0= fgtm/1 = 100Mhz, FXCLK1 = fgtm/16 = 6.25Mhz 若目标频率为1khz, 则period = fTOM/fdst = 6.25Mhz/1khz = 6250
到此为止,所有需要配置的地方都已经完成了,只需要在程序中,调用:Pwm_17_GtmCcu6_SetDutyCycle
即可。
调用时要注意的就是,Duty要设置的值的范围,如果好好看这篇,就知道该注意哪里了哦。