PWM和输出比较的区别
输出比较模式下:
PWM模式: 频率和占空比可以任意设置,起始相位不能设置。 CNT < CCR时输出一种电平,CNT > CCR时输出相反的电平。
输出比较模式:频率和起始相位可以任意设置,占空比不能设置。输出频率为理论计算值一半。 CCR = CNT 时,翻转输出电平。
1、简介
开发板S32K144+S32DS+JLINK,裸机版的程序编写
FlexTimer模块(FTM)是一个2 - 8通道计时器,支持输入捕获,输出比较,并产生PWM信号来控制电机和电源
特点:
- 时钟源可选择:
- 源时钟可以是FTM输入时钟、固定频率时钟或外部时钟时钟源
- 固定频率时钟是允许选择on的额外时钟输入芯片时钟源以外的FTM输入时钟
- 选择外部时钟将FTM时钟连接到一个芯片电平输入引脚,允许FTM计数器与芯片外时钟源同步
- 预分频器除以1、2、4、8、16、32、64或128
- 16位计数器:
- 它可以是一个自由运行的计数器或计数器的初始值和最终值,
- 计数可以向上或向下
- PWM模式每个通道可以配置为输入捕获,输出比较,或边缘对齐
- 输入捕获模式下:
-
捕捉可以发生在上升边缘、下降边缘或两个边缘
-
可以为一些通道选择一个输入过滤器。一个独特的分频器是适用于所有过滤器
-
在输出比较模式下,输出信号可以设置,清除,或翻转
-
所有通道都可以配置为中央对齐PWM模式
-
每对通道可以组合起来产生一个PWM信号,并对PWM信号的两个边缘进行独立控制
-
FTM通道可以作为具有相等输出的成对、具有互补输出的成对或具有独立输出的独立通道来工作
-
死区时间插入可用互补对
-
生成匹配触发器
-
PWM输出软件控制
-
多达4个故障输入,用于全局故障控制
-
每个通道的极性是可配置的
-
每个通道产生一个中断
-
当计数器溢出时产生中断
-
当检测到故障条件时,中断的产生
-
当寄存器重新加载点发生时,中断的产生
-
写入缓冲FTM寄存器的同步加载
-
半周和全周期寄存器的重新加载能力
-
关键寄存器的写保护
-
向后兼容TPM
-
测试输入捕获模式
-
直接访问输入引脚状态
-
用于脉冲和周期宽度测量的双边缘捕捉
-
正交解码器与输入滤波器,相对位置计数,和中断位置计数或捕捉位置取决于外部事件
-
可以选择FTM通道在通道输出上产生触发脉冲而不是PWM
-
抖动能力,以模拟精细边缘控制的PWM周期或PWM工作周期
2、原理图
无
3、寄存器
3.1、SC: Status And Control
SC包含溢出状态标志和控制位,用于配置中断启用、FTM配置、时钟源、滤波器预分频器和预分频器因子。此寄存器还包含输出启用控制位和重新加载机会标志控制。这些控件与此模块内的所有通道相关。
Field | Name | Description |
0-2 | PS | 预分频: 1-128 |
3-4 | CLKS | 时钟源选择 |
5 | CPWMS | 配置计数模式 |
6 | RIE | 重载标志 |
7 | RF | 定时器溢出中断你使能 |
8 | TOIE | 定时器溢出标志 |
9 | TOF | 时钟引脚使能 |
16-23 | PWMENn | 通道nPWM使能 |
24-27 | FLTPS | 滤波器预分频 |
3.2、CNT: Counter
Field | Name | Description |
0-15 | COUNT | 计数器的值 |
3.3、MOD: Modulo
模寄存器包含FTM计数器的模值。当FTM计数器达到模值后,溢出标志(TOF)在下一个时钟周期设置,FTM计数器的下一个值取决于所选的计数方法
Field | Name | Description |
0-15 | MOD | 模值 |
3.4、C0SC - C7SC: Channel (n) Status And Control
CnSC包含通道(n)状态位和选择通道(n)模式的控制位和它的功能
Field | Name | Description |
0 | DMA | DMA使能 |
1 | ICRST | 输入捕获事件复位FTM计数器选择 |
2 | ELSA | 通道(n)边缘或水平选择 |
3 | ELSB | 通道(n)边缘或水平选择 |
4 | MSA | 通道(n)模式选择 |
5 | MSB | 通道(n)模式选择 |
6 | CHE | 通道(n)中断使能 |
7 | CHIF | 通道(n)事件标志 |
8 | TRIGMODE | 触发模式控制 |
9 | CHIS | 通道(n)输入状态 |
10 | CHOV | 通道(n)输出值 |
3.5、C0V - C7V: Channel (n) Value
Field | Name | Description |
0-15 | VAL | 通道值 捕获的输入模式的FTM计数器值或输出模式的匹配值 |
3.6、CNTIN: Counter Initial Value
Field | Name | Description |
0-15 | INIT | FTM计数器初始化值 |
3.7、STATUS: Capture And Compare Status
Field | Name | Description |
0-7 | CHnF | 通道事件标志 |
3.8、MODE: Features Mode Selection
Field | Name | Description |
0 | FTMEN | FTM使能 |
1 | INIT | 初始化通道输出 |
2 | WPDIS | 写保护禁用 |
3 | PWMSYNC | PWM同步模式 |
4 | CAPTEST | 捕获测试模式使能 |
5-6 | FAULTM | 故障控制模式 |
7 | FAULTIE | 故障中断使能 |
3.9、SYNC: Synchronization
Field | Name | Description |
0 | CNTMIN | 最小加载点启用 |
1 | CNTMAX | 最大加载点启用 |
2 | REINIT | 同步FTM计数器重新初始化 |
3 | SYNCHOM | 输出掩码同步 |
4 | TGIG0 | PWM同步硬件触发0 |
5 | TGIG1 | PWM同步硬件触发1 |
6 | TGIG2 | PWM同步硬件触发2 |
7 | SWSYNC | PWM同步软件触发器 |
3.10、OUTINIT: Initial State For Channels Output
Field | Name | Description |
0-7 | CHnOI | 通道n输出初始值 |
3.11、OUTMASK: Output Mask
Field | Name | Description |
0-7 | CHnOM | 通道n输出掩码 |
3.12、COMBINE: Function For Linked Channels
Field | Name | Description |
0 | COMBINE0 | 合并通道,用于通道(n)和(n+1)的组合模式的选择 |
1 | COMP0 | 通道(n)的补码 |
2 | DECAPEN0 | 启用双边缘捕获模式 |
3 | DECAP0 | 双边捕获模式捕获 |
4 | DTEN0 | 死区时间启用 |
5 | SYNCEN0 | 启用同步 |
6 | FAULTEN0 | 故障控制使能 |
7 | MCOMBINE0 | 修改合并模式 |
依次有1-3,总共0-3,0模式已写
3.13、DEADTIME: Deadtime Configuration
这个寄存器选择死区时间的分频器和值
Field | Name | Description |
0-5 | DTVAL | 死区时间值 |
6-7 | DTPS | 死区时间分频值 |
16-19 | DTVALEX | 扩展死区时间值 |
3.14、EXTTRIG: FTM External Trigger
外部触发器产生的时间,当FTM计数器等于其初始值时,使能生成触发器,选择在外部触发器的生成中使用的通道
Field | Name | Description |
0 | CH2TRIG | 通道2外部触发启用 |
1 | CH3TRIG | 通道3外部触发启用 |
2 | CH4TRIG | 通道4外部触发启用 |
3 | CH5TRIG | 通道5外部触发启用 |
4 | CH0TRIG | 通道0外部触发启用 |
5 | CH1TRIG | 通道1外部触发启用 |
6 | INITTRIGEN | 初始化触发使能 |
7 | TRIGF | 通道触发器标志 |
8 | CH6TRIG | 通道6外部触发启用 |
9 | CH7TRIG | 通道7外部触发启用 |
3.15、POL: Channels Polarity
Field | Name | Description |
0-7 | POLn | 通道n的极性 |
3.16、FMS: Fault Mode Status
Field | Name | Description |
0 | FAULTF0 | 故障检测标志0 |
1 | FAULTF1 | 故障检测标志1 |
2 | FAULTF2 | 故障检测标志2 FTM0-3支持此位 FTM4-7不支持 |
3 | FAULTF3 | 故障检测标志3 |
5 | FAULTIN | 故障输入 |
6 | WPEN | 启用写保护 |
7 | FAULTF | 故障检测标志 |
3.17、FILTER: Input Capture Filter Control
这个寄存器为通道的输入选择过滤器值。
通道4、5、6和7没有输入过滤器
Field | Name | Description |
0-3 | CH0FVAL | 通道n输入滤波器 选择通道输入的过滤器值。 当值为零时,将禁用筛选器。 |
4-7 | CH1FVAL | |
8-11 | CH2FVAL | |
12-15 | CH3FVAL |
3.18、FLTCTRL: Fault Control
Field | Name | Description |
0 | FAULT0EN | 故障输入n使能 |
1 | FAULT1EN | |
2 | FAULT2EN | |
3 | FAULT3EN | |
4 | FFLTR0EN | 故障输入过滤器n使能 |
5 | FFLTR1EN | |
6 | FFLTR2EN | |
7 | FFLTR3EN | |
8-11 | FFVAL | 故障输入过滤器 |
15 | FSTATE | 故障输出状态 |
3.19、QDCTRL: Quadrature Decoder Control And Status
该寄存器具有控制位和正交解码器模式的状态位
Field | Name | Description |
0 | QUADEN | 正交解码器模式启用 |
1 | TOFDIR | 正交解码器模式下定时器溢出方向 |
2 | QUADIR | 正交解码器模式下定时器计数方向 |
3 | QUADMODE | 正交解码器模式 |
4 | PHBPOL | B相输入极性 |
5 | PHAPOL | A相输入极性 |
6 | PHBFLTREN | B相输入过滤器使能 |
7 | PHAFLTREN | A相输入过滤器使能 |
3.20、CONF: Configuration
Field | Name | Description |
0-4 | LDPQ | 重新加载的频率 |
6-7 | BDMMODE | 调试模式 |
9 | GTBEEN | 全局时基启用 |
10 | GTBEOUT | 全局时基输出 |
11 | ITRIGR | 加载点初始化触发器 |
3.21、FLTPOL: FTM Fault Input Polarity
这个寄存器定义了故障输入的极性
Field | Name | Description |
0-3 | FLTnPOL | 故障输入n的极性 |
3.22、SYNCONF: Synchronization Configuration
这个寄存器选择PWM同步配置
Field | Name | Description |
0 | HWTRIGMODE | 硬件触发模式 |
2 | CNTINC | CNTIN寄存器同步 |
4 | INVC | INVCTRL寄存器同步 |
5 | SWOC | SWOCTRL寄存器同步 |
7 | SYNCMODE | 加载点初始化触发器 |
8 | SWRSTCNT | 同步模式 |
9 | SWWRBUF | FTM计数器同步是由软件触发器激活的 |
10 | SWOM | MOD, HCR, CNTIN和CV寄存器同步是由软件触发器激活的 |
11 | SWINVC | 输出掩码同步是由软件触发器激活的 |
12 | SWSOC | 反向控制同步是由软件触发器激活的 |
16 | HWRSTCNT | 软件输出控制同步由软件触发器激活 |
17 | HWWRBUF | FTM计数器同步是由硬件触发器激活的 |
18 | HWOM | MOD, HCR, CNTIN和CV寄存器同步是由硬件触发器激活的 |
19 | HWINVC | MOD, HCR, CNTIN和CV寄存器同步是由硬件触发器激活的 |
20 | HWSOC | 输出掩码同步是由硬件触发器激活的 |
3.23、INVCTRL: FTM Inverting Control
该寄存器控制何时通道(n)输出成为通道(n+1)输出,以及通道(n+1)输出变为通道(n)输出。每一个INVmEN位对应对通道m的反相操作。
Field | Name | Description |
0-3 | INVmEN | 一对通道n反相使能 |
3.24、SWOCTRL: FTM Software Output Control
该寄存器允许软件控制通道(n)输出并定义强制值到通道(n)输出:
•CH(n)OC位使软件能够控制相应的通道(n)输出。
•CH(n)OCV位选择对应通道(n)输出的强制值。
Field | Name | Description |
0-7 | CHnOC | 通道n软件输出控制使能 |
8-15 | CHnOCV | 通道n软件输出控制值 |
3.26、PWMLOAD: FTM PWM Load
当FTM计数器从MOD寄存器的值更改为下一个值或当通道(j)匹配发生时,启用MOD, HCR, CNTIN, C(n)V,和C(n+1)V用它们的写缓冲区的值寄存器的重载
Field | Name | Description |
0-7 | CHnSEL | 通道n选择 |
8 | HCSEL | 半周期选择 |
9 | LDOK | 加载使能 |
10 | GLEN | 全局加载使能 |
11 | GLDOK | 全局加载OK |
3.27、HCR: Half Cycle Register
半周期寄存器包含FTM半周期重新加载特性的匹配值。
Field | Name | Description |
0-15 | HCVAL | 半周期值 |
3.28、PAIRnDEADTIME: Pair n Deadtime Configuration
这个寄存器为这对n选择死时间的分频器和值。
Field | Name | Description |
0-5 | DTVAL | 成对死区时间值 |
6-7 | DTPS | 承兑死区时间分频值 |
16-19 | DTVALEX | 扩展死区时间值 |
3.29、MOD_MIRROR: Mirror of Modulo Value
这个寄存器包含FTM计数器的整数和小数模值
Field | Name | Description |
11-15 | FRACMOD | 计数器模值小数部分 |
16-31 | MOD | 计数器模值整数部分 |
3.30、C0V_MIRROR - C7V_MIRROR: Mirror of Channel (n) Match Value
这个寄存器包含通道(n)匹配的整数和小数值。
Field | Name | Description |
11-15 | FRACMOD | 通道匹配小数部分 |
16-31 | MOD | 通道匹配整数部分 |
其中通道模式的选择如下图
4、代码编程
代码编程可以有:边沿对齐PWM、中间对齐PWM、输出比较、输入捕获
我偷懒了,其实其他的我也写了,但是我之前没保存,尴尬
4.1、ftm.h
#ifndef _FTM_H_
#define _FTM_H_
#include "common.h" //公共要素头文件
void FTM0_init(void);
void start_FTM0_counter (void);
void FTM0_CH0_init(vuint_8 dutyoid);
void FTM0_CH1_init(uint_8 duty);
#endif
4.2、ftm.c
#include "ftm.h"
void FTM0_init(void)
{
PCC->PCCn[PCC_FTM0_INDEX] &= ~PCC_PCCn_CGC_MASK; /* Ensure clk disabled for config */
PCC->PCCn[PCC_FTM0_INDEX] |= PCC_PCCn_PCS(1) | PCC_PCCn_CGC_MASK;/* Clock Src=1, 8 MHz SOSCDIV1_CLK */
/* Enable clock for FTM regs */
FTM0->MODE |= FTM_MODE_WPDIS_MASK; /* Write protect to registers disabled (default) */
FTM0->SC |= FTM_SC_PWMEN1_MASK | FTM_SC_PWMEN0_MASK | FTM_SC_PS(7); /* Enable PWM channel 0 output*/
/* 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 = 62500 -1 ; /* FTM1 counter final value (used for PWM mode) */
/* FTM1 Period = MOD-CNTIN+0x0001 ~= 62500 ctr clks */
/* 8MHz / 128 = 62500Hz -> ticks -> 1Hz */
FTM0->SC |= FTM_SC_CPWMS_MASK;
}
void FTM0_CH0_init(uint_8 duty)
{
//mode select
FTM0->CONTROLS[0].CnSC = FTM_CnSC_ELSB_MASK;
/* FTM0 ch0 compare value (~50% duty cycle) */
FTM0->CONTROLS[0].CnV = (FTM0->MOD+1)*duty/100;
}
void FTM0_CH1_init(uint_8 duty)
{
//mode select
FTM0->CONTROLS[1].CnSC = FTM_CnSC_ELSB_MASK;
/* FTM0 ch1 compare value (~50% duty cycle) */
FTM0->CONTROLS[1].CnV = (FTM0->MOD+1)*duty/100;
}
void start_FTM0_counter (void)
{
FTM0->SC |= FTM_SC_CLKS(3);
/* Start FTM0 counter with clk source = external clock (SOSCDIV1_CLK)*/
}
4.3、main.c
调用伪代码,因为全贴的话,我之前
FTM0_init();
FTM0_CH0_init(50); /* Init FTM0 CH0 */
FTM0_CH1_init(50); /* Init FTM0 CH0 */
PCC->PCCn[PCC_PORTD_INDEX ]|=PCC_PCCn_CGC_MASK;
PORTD->PCR[15]=PORT_PCR_MUX(2); /* Port D15: MUX = ALT2, FTM0CH0 */
PORTD->PCR[16]=PORT_PCR_MUX(2); /* Port D16: MUX = ALT2, FTM0CH1 */
start_FTM0_counter(); /* Start FTM0 counter */
4.4、irq
这部分没贴出来,但是FTM一般有两个中断,一个是计数的溢出中断,一个是通道触发中断
/* 使能溢出中断 */
FTM0->SC |= FTM_SC_TOF(1);
/* 注册中断 */
S32_NVIC_EnableIRQ(FTM0_Ovf_Reload_IRQn,10);
/* 中断服务函数 */
void FTM0_Ovf_Reload_IRQHandler(void)
{
FTM0->SC &= ~FTM_SC_TOF(1); //清中断标志位
}
/* 使能溢出中断 */
FTM0->CONTROLS[0].CnSC |= FTM_CnSC_CHIE_MASK;
/* 注册中断 */
S32_NVIC_EnableIRQ(FTM0_Ch0_Ch1_IRQn,10);
/* 中断服务函数 */
void FTM0_Ch0_Ch1_IRQHandler(void)
{
if((FTM0->CONTROLS[0].CnSC & FTM_CnSC_CHF_MASK))
{
FTM0->CONTROLS[0].CnSC &= ~FTM_CnSC_CHF_MASK;
}
if((FTM0->CONTROLS[1].CnSC & FTM_CnSC_CHF_MASK))
{
FTM0->CONTROLS[1].CnSC &= ~FTM_CnSC_CHF_MASK;
}
}