10.恩智浦-车规级-MCU:S32K11X FTM-PWM输出实验

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通道的输出极性。

在这里插入图片描述

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 <stdio.h>
#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 <stdlib.h>
#include <limits.h>
#include <string.h>
#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”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin的学习站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值