10.恩智浦-车规级-MCU:S32K11X FTM-PWM输出实验
时间:2023-04-29 09:07:00
目录
-
- 10.S32K11X FTM-PWM输出实验
-
- 1、芯片特定FTM信息
-
- 1.1.不同型号的芯片对应FTM参数
- 1.2、FTM中断
- 1.3、FTM简介
- 1.4、FTM特征
- 1.5、FTM模式选择
- 1.6、寄存器
-
- 1.6.1.模式寄存器-MODE
- 1.6.2.状态控制寄存器—SC
- 1.6.3.链接通道的功能-COMBINE
- 16.4、通道极性-POL
- 1.6.6、模块-MOD
- 1.6.7.设置通道的初始空比-CONTROLS[0]
- 2、实验流程
- 3.编写实验程序
- 4、实验结果
- 5、资源获取
10.S32K11X FTM-PWM输出实验
1、芯片特定FTM信息
1.1.不同型号的芯片对应FTM参数
所有FTM都有以下功能:
全局时间基础;
输入通道上的过滤器;
故障通道上的过滤器;
半循环重载;
对上通道的单独截止日期。
1.2、FTM中断
flexTimer有多个中断源。您可以查看附在参考手册中的信息DMA_Interrupt_mapping.xlsm。当一个FTM发生中断时,读取FTM状态寄存器(FMS、SC和状态),以确定确切的中断源。
1.3、FTM简介
FlexTimer模块(FTM)支持输入捕获、输出比较和生成的2-8通道定时器PWM控制电机和电源管理应用程序的信号。FTM时间引用是一个16位计数器,可用作无签名或有签名计数器。
1.4、FTM特征
FTM可选择源时钟;
除1、2、4、8、16、32、64或128;
16位计数器;
它是一运行的计数器或具有初始值和最终值的计数器;
计数可向上或向下;
每个通道可配置为输入捕获、输出比较或边缘对齐PWM模式;
可设置、清除或切换输出比较模式下的输出信号;
所有的通道都可以被配置为中心对齐的PWM模式;
每对信道可以组合产生一个PWM独立控制信号PWM信号两侧;
FTM信道可作为等输出对、互补输出对或独立输出的独立信道运行;
每一对互补都有死时间插入;
PWM软件控制输出;
全局故障控制最多有4个故障输入;
1.5、FTM模式选择
当芯片处于活动调试模式时,FTM在芯片恢复正常暂停,直到芯片恢复到正常的用户操作模式。在停止模式下,一切FTM输入时钟已经停止,因此FTM直到时钟恢复,才有效禁用。在等待模式下,FTM继续正常运行。如果FTM从等待模式中唤醒芯片所需的中断源,无需产生实时参考或提供,可在进入等待模式前禁用FTM节能功能。
1.6、寄存器
1.6.1.模式寄存器-MODE
该寄存器包含特定的寄存器ftm配置的全局启用位和控制位:
①、故障控制模式和中断;
②、捕获测试模式
③、PWM同步
④、写入保护
⑤、通道输出初始化
1.6.2.状态控制寄存器—SC
作用:
SC包括溢出状态标志和配置中断启用,FTM溢出状态标志和控制位置、时钟源、过滤器预调节器和预调节器因子。
该寄存器还包括输出启用控制位和重新加载机会标志控制。
1.6.3.链接通道的功能-COMBINE
功能:该寄存器包含每对通道的配置位置。
默认全为0。
16.4、通道极性-POL
功能:此寄存器定义FTM输出极性。strng>
7-0 POLn:通道 n 极性;0b-通道极性为活性高、1b-通道极性活性较低。
1.6.6、模块-MOD
作用:模块寄存器包含FTM计数器的模值。在FTM计数器达到模值后,溢出标志(TOF)在下一个时钟周期中被设置,并且FTM计数器的下一个值取决于所选的计数方法;
15-0 MOD : 模块值。
1.6.7、设置通道初始占空比-CONTROLS[0]
2、实验流程
①、设置PWM GPIO模式;使能GPIO时钟,开启GPIO复用 为FTMX_CHX;
②、使能FTMX时钟;
③、FTMX初始化:配置写入保护、使能PWM通道、分频系数
④、配置FTMX模式;
⑤、配置FTM极性;
⑥、配置FTM计数值;
⑦、配置中断。
3、实验程序编写
FTM.c
#include "FTM.h"
#include
#include "device_registers.h" /* include peripheral declarations */
void PWM_GPIO_init(void)
{
/*PWM0--FTM0_CH1*/
PCC->PCCn[PCC_PORTD_INDEX ]|=PCC_PCCn_CGC_MASK; //使能PTD端口时钟
PORTD->PCR[16]|=PORT_PCR_MUX(2); // Port D16: MUX = ALT2 PTD16端口复用 FTM0_CH1
}
//FTM0初始化
void FTM0_init(void)
{
/** * FTM0 Clocking: * ================================================== */
PCC->PCCn[PCC_FTM0_INDEX] &= ~PCC_PCCn_CGC_MASK; /* Ensure clk disabled for config */
//使能FTM0时钟
PCC->PCCn[PCC_FTM0_INDEX] |= PCC_PCCn_PCS(1) /* Clock Src=1, 8 MHz SIRCDIV1_CLK */
| PCC_PCCn_CGC_MASK; /* Enable clock for FTM regs */
/*! * FTM0 Initialization: * =================================================== */
FTM0->MODE |= FTM_MODE_WPDIS_MASK; /* Write protect to registers disabled (default) */
FTM0->SC = FTM_SC_PWMEN0_MASK /* Enable PWM channel 0 output */
|FTM_SC_PWMEN1_MASK /* Enable PWM channel 1 output */
|FTM_SC_PS(3)
|FTM_SC_TOIE(1); /* TOIE (Timer Overflow Interrupt Ena) = 0 (default) */
/* CPWMS (Center aligned PWM Select) = 0 (default, up count) */
/* CLKS (Clock source) = 0 (default, no clock; FTM disabled) */
/* PS (Prescaler factor) = 7. Prescaler = 128 */
FTM0->COMBINE = 0x00000000; /* FTM mode settings used: DECAPENx, MCOMBINEx, COMBINEx=0 */
FTM0->POL = 0x00000000; /* Polarity for all channels is active high (default) */
FTM0->MOD = 100 -1 ; /* FTM1 counter final value (used for PWM mode) *///10ms
/* FTM1 Period = MOD-CNTIN+0x0001 ~= 62500 ctr clks */
/* 8MHz /128 = 62.5kHz -> ticks -> 1Hz */
S32_NVIC->ISER[(uint32_t)(FTM0_Ovf_Reload_IRQn) >> 5U] = (uint32_t)(1U << ((uint32_t)(FTM0_Ovf_Reload_IRQn) & (uint32_t)0x1FU));
S32_NVIC->ICPR[(uint32_t)(FTM0_Ovf_Reload_IRQn) >> 5U] = (uint32_t)(1U << ((uint32_t)(FTM0_Ovf_Reload_IRQn) & (uint32_t)0x1FU));
}
//关闭FTM0中断
void dis_FTM0IRQ()
{
S32_NVIC->ICER[(uint32_t)(FTM0_Ovf_Reload_IRQn) >> 5U] = (uint32_t)(1U << ((uint32_t)(FTM0_Ovf_Reload_IRQn) & (uint32_t)0x1FU));
FTM0->SC = FTM_SC_TOIE(1);
}
//FTM0通道 1 PWM初始化
void FTM0_CH1_PWM_init(int duty)
{
/** * FTM0, Channel 1 in PWM Mode: * ================================================== */
FTM0->CONTROLS[1].CnSC = FTM_CnSC_MSB_MASK
|FTM_CnSC_ELSB_MASK; /* FTM0 ch1: edge-aligned PWM, low true pulses */
/* CHIE (Chan Interrupt Ena) = 0 (default) */
/* MSB:MSA (chan Mode Select)=0b10, Edge Align PWM */
/* ELSB:ELSA (chan Edge/Level Select)=0b10, low true */
FTM0->CONTROLS[1].CnV = duty; /* 0~100 FTM0 ch1 compare value (0~100%:duty cycle) */
}
void start_FTM0_counter (void)
{
FTM0->SC |= FTM_SC_CLKS(1);
// FTM0->SC |= FTM_SC_CLKS(3);
/* Start FTM0 counter with clk source = external clock (SOSCDIV1_CLK)*/
}
FTM.h
#ifndef FTM_H_
#define FTM_H_
void PWM_GPIO_init(void);
void FTM0_init(void);
void FTM0_CH1_PWM_init(void);
void start_FTM0_counter (void);
#endif
main.c
#include
#include
#include
#include "S32K116.h" /* include peripheral declarations S32K116 */
#include "clocks_and_modes_S32K11x.h"
#include "FTM.h"
void WDOG_disable (void)
{
WDOG->CNT=0xD928C520; /* Unlock watchdog */
WDOG->TOVAL=0x0000FFFF; /* Maximum timeout value */
WDOG->CS = 0x00002100; /* Disable watchdog */
}
int main(void)
{
/*! * Initialization: * ======================= */
WDOG_disable(); /* Disable WDOG */
SOSC_init_40MHz(); /* Initialize system oscillator for 40 MHz xtal */
RUN_mode_48MHz(); /* Init clocks: 48 MHz sys, core and bus, 24 MHz flash. */
PWM_GPIO_init(); //PWM GPIO 初始哈
FTM0_init(); //FTM0初始化
FTM0_CH1_PWM_init(70); //FTM0_CH1初始化
start_FTM0_counter(); //开启FTM0计数
while(1)
{
}
}
4、实验结果
将程序烧写入单片机中,用示波器测量PTD16银角波形,得到如下结果,符合预设70%占空比。
5、资源获取
项目的程序工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“054”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!