10.恩智浦-车规级-MCU:S32K11X FTM-PWM输出实验
目錄
- 10.S32K11X FTM-PWM輸出實(shí)驗(yàn)
- 1、芯片特定的FTM信息
- 1.1、不同型號(hào)芯片對(duì)應(yīng)的FTM參數(shù)
- 1.2、FTM中斷
- 1.3、FTM簡(jiǎn)介
- 1.4、FTM特征
- 1.5、FTM模式選擇
- 1.6、寄存器
- 1.6.1、模式寄存器-MODE
- 1.6.2、狀態(tài)控制寄存器—SC
- 1.6.3、鏈接通道的功能-COMBINE
- 16.4、通道極性-POL
- 1.6.6、模塊-MOD
- 1.6.7、設(shè)置通道初始占空比-CONTROLS[0]
- 2、實(shí)驗(yàn)流程
- 3、實(shí)驗(yàn)程序編寫
- 4、實(shí)驗(yàn)結(jié)果
- 5、資源獲取
10.S32K11X FTM-PWM輸出實(shí)驗(yàn)
1、芯片特定的FTM信息
1.1、不同型號(hào)芯片對(duì)應(yīng)的FTM參數(shù)
所有FTM都具有以下功能:
全局時(shí)間基礎(chǔ);
過(guò)濾器在輸入通道上;
故障通道上的過(guò)濾器;
半循環(huán)重載;
通道對(duì)上的單獨(dú)截止時(shí)間。
1.2、FTM中斷
flexTimer有多個(gè)中斷源。可以看參考手冊(cè)中隨附的DMA_Interrupt_mapping.xlsm。當(dāng)一個(gè)FTM中斷發(fā)生時(shí),讀取FTM狀態(tài)寄存器(FMS、SC和狀態(tài)),以確定確切的中斷源。
1.3、FTM簡(jiǎn)介
FlexTimer模塊(FTM)是一個(gè)2到8通道定時(shí)器,支持輸入捕獲、輸出比較和生成PWM信號(hào),以控制電機(jī)和電源管理應(yīng)用程序。FTM時(shí)間引用是一個(gè)16位計(jì)數(shù)器,可用作無(wú)簽名或有簽名計(jì)數(shù)器。
1.4、FTM特征
FTM源時(shí)鐘是可選擇的;
可除以1、2、4、8、16、32、64或128;
擁有16位計(jì)數(shù)器;
是一個(gè)自由運(yùn)行的計(jì)數(shù)器或一個(gè)帶有初始值和最終值的計(jì)數(shù)器;
計(jì)數(shù)可以向上也可以向下;
每個(gè)通道都可以配置為輸入捕獲、輸出比較或邊緣對(duì)齊的PWM模式;
在輸出比較模式下,輸出信號(hào)可以設(shè)置、清除或切換匹配;
所有的通道都可以被配置為中心對(duì)齊的PWM模式;
每對(duì)信道可以組合產(chǎn)生一個(gè)PWM信號(hào),并獨(dú)立控制PWM信號(hào)的兩邊;
FTM信道可以作為等輸出對(duì)、互補(bǔ)輸出對(duì)或獨(dú)立輸出的獨(dú)立信道運(yùn)行;
每個(gè)互補(bǔ)對(duì)都有死時(shí)間插入;
生成匹配觸發(fā)器;
PWM輸出的軟件控制;
全局故障控制最多有4個(gè)故障輸入;
1.5、FTM模式選擇
當(dāng)芯片處于活動(dòng)調(diào)試模式時(shí),FTM會(huì)暫時(shí)暫停所有計(jì)數(shù),直到芯片恢復(fù)到正常的用戶操作模式。在停止模式下,所有FTM輸入時(shí)鐘都被停止,因此FTM被有效地禁用,直到時(shí)鐘恢復(fù)。在等待模式下,FTM繼續(xù)正常運(yùn)行。如果FTM不需要產(chǎn)生實(shí)時(shí)參考或提供從等待模式中喚醒芯片所需的中斷源,則可以在進(jìn)入等待模式之前通過(guò)禁用FTM功能來(lái)節(jié)省電源。
1.6、寄存器
1.6.1、模式寄存器-MODE
這個(gè)寄存器包含了特定于ftm的特性的全局啟用位和用于配置的控制位:
①、故障控制模式和中斷;
②、捕獲測(cè)試模式
③、PWM同步
④、寫入保護(hù)
⑤、通道輸出初始化
1.6.2、狀態(tài)控制寄存器—SC
作用:
SC包含溢出狀態(tài)標(biāo)志和用于配置中斷啟用、FTM配置、時(shí)鐘源、過(guò)濾器預(yù)調(diào)節(jié)器和預(yù)調(diào)節(jié)器因子的溢出狀態(tài)標(biāo)志和控制位。
該寄存器還包含輸出啟用控制位和重新加載機(jī)會(huì)標(biāo)志控制。
1.6.3、鏈接通道的功能-COMBINE
作用:此寄存器包含每對(duì)通道的配置位。
默認(rèn)全為0。
16.4、通道極性-POL
作用:這個(gè)寄存器定義了FTM通道的輸出極性。
7-0 POLn:通道 n 極性;0b-通道極性為活性高、1b-通道極性活性較低。
1.6.6、模塊-MOD
作用:模塊寄存器包含F(xiàn)TM計(jì)數(shù)器的模值。在FTM計(jì)數(shù)器達(dá)到模值后,溢出標(biāo)志(TOF)在下一個(gè)時(shí)鐘周期中被設(shè)置,并且FTM計(jì)數(shù)器的下一個(gè)值取決于所選的計(jì)數(shù)方法;
15-0 MOD : 模塊值。
1.6.7、設(shè)置通道初始占空比-CONTROLS[0]
2、實(shí)驗(yàn)流程
①、設(shè)置PWM GPIO模式;使能GPIO時(shí)鐘,開(kāi)啟GPIO復(fù)用 為FTMX_CHX;
②、使能FTMX時(shí)鐘;
③、FTMX初始化:配置寫入保護(hù)、使能PWM通道、分頻系數(shù)
④、配置FTMX模式;
⑤、配置FTM極性;
⑥、配置FTM計(jì)數(shù)值;
⑦、配置中斷。
3、實(shí)驗(yàn)程序編寫
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端口時(shí)鐘PORTD->PCR[16]|=PORT_PCR_MUX(2); // Port D16: MUX = ALT2 PTD16端口復(fù)用 FTM0_CH1 }//FTM0初始化 void FTM0_init(void) {/*** FTM0 Clocking:* ==================================================*/PCC->PCCn[PCC_FTM0_INDEX] &= ~PCC_PCCn_CGC_MASK; /* Ensure clk disabled for config *///使能FTM0時(shí)鐘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)); }//關(guān)閉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);#endifmain.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(); //開(kāi)啟FTM0計(jì)數(shù)while(1){} }4、實(shí)驗(yàn)結(jié)果
將程序燒寫入單片機(jī)中,用示波器測(cè)量PTD16銀角波形,得到如下結(jié)果,符合預(yù)設(shè)70%占空比。
5、資源獲取
項(xiàng)目的程序工程已經(jīng)放在下面公眾號(hào)里面,可以關(guān)注公眾號(hào):Kevin的學(xué)習(xí)站,輸入關(guān)鍵字:“054”,就可以獲取啦!創(chuàng)作不易,但您的點(diǎn)贊、關(guān)注、收藏就是對(duì)我最大的鼓勵(lì)!
總結(jié)
以上是生活随笔為你收集整理的10.恩智浦-车规级-MCU:S32K11X FTM-PWM输出实验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 头歌-自己动手画CPU(第五关)-寄存器
- 下一篇: curl encode