文档讨论了如何基于 SCTimer/PWM 模块生成相移 PWM 信号,代码是基于 MCUXpresso IDE 版本 10.3 和 LPCXpresso5411x 板开发的。
LPC系列有SCTimer/PWM模块和CTimer模块,它们都可以产生PWM信号,但只有SCTimer/PWM模块可以产生相移PWM信号。
在代码中,仅使用匹配寄存器来生成事件,不使用I/O信号。
match0寄存器设置为(SystemCoreClock/100),决定PWM信号频率。
match1寄存器设置为0x00,产生event1。
match2寄存器设置为(SystemCoreClock/100)/2;,即产生event2。
占空比为(SystemCoreClock/100)/2-0x00=(SystemCoreClock/100)/2,即50%占空比,循环时间为(SystemCoreClock/100)。
事件 1 设置 SCT0_OUT1,事件 2 清除 SCT0_OUT1,因此 SCT0_OUT1 具有 50% 的占空比。
match3寄存器设置为(SystemCoreClock/100)/4;,即生成even3。
match4寄存器设置为3*(SystemCoreClock/100)/4,产生event4。
占空比为3*(SystemCoreClock/100)/4 - (SystemCoreClock/100)/4= (SystemCoreClock/100)/2,即50%占空比。
事件 3 设置 SCT0_OUT2,事件 4 清除 SCT0_OUT2,因此 SCT0_OUT2 具有 50% 的占空比。
相移为 (SystemCoreClock/100)/4 - 0x00= (SystemCoreClock/100)/4,对应 90 度相移。
PWM初始化代码:
//SCT0_OUT1 可以从 PIO0_8 引脚输出占空比为 50 的 PWM 信号
//SCT_OUT2 可以从 PIO0_9 引脚输出占空比为 50 的 PWM 信号
//SCT0_OUT1 和 SCT0_OUT2 PWM 信号具有 90 度相移。
无效SCT0_PWM(无效)
{
SYSCON->AHBCLKCTRL[1]|=(1<<2); //设置SCT0位
SCT0->CONFIG = (1 << 0) | (1 << 17); //统一32位定时器,自动限制
SCT0->SCTMATCHREL[0] = SystemCoreClock/100; //匹配 0 @ 100 Hz = 10 毫秒
SCT0->EVENT[0].STATE = 0xFFFFFFFF; // 事件 0 在所有状态下发生
//设置事件1
SCT0->SCTMATCHREL[1]=0x00;
SCT0->EVENT[1].STATE = 0xFFFFFFFF; // 事件 1 在所有状态下发生
SCT0->EVENT[1].CTRL = (1 << 12)|(1<<0); // 仅匹配 1 个条件
//设置事件2
SCT0->SCTMATCHREL[2]=(SystemCoreClock/100)/2;
SCT0->EVENT[2].STATE = 0xFFFFFFFF; // 事件 2 在所有状态下发生
SCT0->EVENT[2].CTRL = (1 << 12)|(2<<0); // 仅匹配 2 个条件
//设置事件3
SCT0->SCTMATCHREL[3]=(SystemCoreClock/100)/4;
SCT0->EVENT[3].STATE = 0xFFFFFFFF; // 事件 3 在所有状态下发生
SCT0->EVENT[3].CTRL = (1 << 12)|(3<<0); // 仅匹配 3 个条件
//设置事件4
SCT0->SCTMATCHREL[4]=3*(SystemCoreClock/100)/4;
SCT0->EVENT[4].STATE = 0xFFFFFFFF; // 事件 4 在所有状态下发生
SCT0->EVENT[4].CTRL = (1 << 12)|(4<<0); // 仅匹配 4 个条件
//PWM输出1信号
SCT0->OUT[1].SET = (1 << 1); // 事件 1 将设置 SCT1_OUT0
SCT0->OUT[1].CLR = (1 << 2); // 事件 2 将清除 SCT1_OUT0
SCT0->RES |= (3 << 2); // 输出 0 在冲突时切换
//PWM输出2信号
SCT0->OUT[2].SET = (1 << 3); // 事件 3 将设置 SCT1_OUT0
SCT0->OUT[2].CLR = (1 << 4); // 事件 4 将清除 SCT1_OUT0
SCT0->RES = (3 << 4); // 输出 0 在冲突时切换
//PWM启动
SCT0->CTRL &= ~(1 << 2); //通过清除 CTRL 的第 2 位来取消暂停
}
引脚初始化代码:
//PIO0_8 PIO0_8 FC2_RXD_SDA_MOSI SCT0_OUT1 CTIMER0_MAT3
//PIO0_9 PIO0_9 FC2_TXD_SCL_MISO SCT0_OUT2 CTIMER3_CAP0 - FC3_CTS_SDA_SSEL0
无效 SCTimerPinInit(无效)
{
//启用SCTimer时钟
SYSCON->AHBCLKCTRL[0]|=(1<<13); //设置 IOCON 位
//SCTimer 引脚分配
IOCON->PIO[0][8]=0x182;
IOCON->PIO[0][9]=0x182;
IOCON->PIO[0][10]=0x182;
}
主要代码:
#include
#包括“board.h”
#包括“外设.h”
#包括“pin_mux.h”
#包括“clock_config.h”
#包括“LPC54114_cm4.h”
void SCT0_Init(void);
void SCTimerPinInit(void);
void P1_9_GPIO(void);
void SCT0_PWM(void);
int main(void){
/* 初始化板硬件。*/
板初始化启动引脚();
主板初始化启动时钟();
BOARD_InitBootPeripherals();
printf(“你好,世界\n”);
//SCT0_Init();
//P1_9_GPIO();
SCTimerPinInit();
SCT0_PWM();
/* 强制将计数器放入内存。*/
易失性静态 int i = 0;
/* 进入无限循环,仅增加计数器。*/
while(1){
i++;
}
返回 0;
}
黄色通道为PIO0_8引脚输出信号,即SCT0_OUT1的PWM输出信号。
蓝色通道为PIO0_9引脚输出信号,即SCT0_OUT2的PWM输出信号。