在嵌入式控制系统中,精确的脉冲宽度调制(PWM)输出是驱动电机、控制舵机、生成特定波形的基础功能。T153系列微控制器提供的PWMCS(PWM Control Subsystem)模块,其单次脉冲模式(One-Shot Pulse Mode)特别适合需要精准控制单个脉冲宽度的场景,比如:
与连续PWM模式不同,单次脉冲模式在输出指定宽度的脉冲后会自动停止,无需软件干预。这种"发射后不管"的特性既节省CPU资源,又能避免因程序跑飞导致的信号异常。
T153的PWM控制器包含三个关键子系统:
单次脉冲模式的特殊之处在于其内部状态机的设计。当使能单次模式时,控制器会在以下事件后自动禁用输出:
以下是配置单次脉冲模式的典型代码流程(以ARM Cortex-M内核为例):
c复制// 1. 使能PWM外设时钟
RCC->APB2ENR |= RCC_APB2ENR_PWMCSEN;
// 2. 配置GPIO为PWM输出模式
GPIOA->MODER &= ~(3 << (10 * 2)); // 清除PA10原有模式
GPIOA->MODER |= 2 << (10 * 2); // 设置为复用功能
GPIOA->AFR[1] |= 1 << ((10-8)*4); // 选择AF1(PWM)
// 3. 配置PWM基础参数
PWMCS->PRESCALER = 47; // 48分频(系统时钟48MHz→1MHz)
PWMCS->AUTORELOAD = 999; // 周期1000个计数(1ms周期@1MHz)
PWMCS->PULSE_WIDTH = 200; // 脉冲宽度200us
// 4. 使能单次模式
PWMCS->CR1 |= PWMCS_CR1_OPM; // One-pulse mode enable
PWMCS->CR1 |= PWMCS_CR1_CEN; // 启动计数器
关键细节:单次模式必须通过CR1寄存器同时设置OPM位和CEN位才会生效,仅设置OPM不会立即触发输出。
当配置生效后,PWM控制器会经历以下状态转换:
初始化阶段(t0-t1):
脉冲激活阶段(t1-t2):
周期完成阶段(t2-t3):
plaintext复制时序示意图:
_______
| |
_______| |____________
t0 t1 t2 t3
|<---->|<----->|
PW 周期-PW
假设系统时钟为48MHz,产生200us脉冲宽度、1ms周期的单次脉冲:
时钟分频选择:
周期寄存器:
脉宽寄存器:
注意:所有寄存器值都是"计数值-1",因为计数器从0开始计数。
在某些应用中需要运行时调整脉冲参数,推荐采用以下安全流程:
c复制// 安全更新参数的步骤
PWMCS->CR1 &= ~PWMCS_CR1_CEN; // 先停止计数器
while(PWMCS->SR & PWMCS_SR_UIF); // 等待更新完成
PWMCS->PULSE_WIDTH = new_width; // 更新脉宽
PWMCS->AUTORELOAD = new_period; // 更新周期
PWMCS->CR1 |= PWMCS_CR1_CEN; // 重新使能
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无输出信号 | GPIO模式配置错误 | 检查AF模式及复用功能映射 |
| 脉冲宽度不稳定 | 未关闭中断导致参数更新冲突 | 在修改参数时关闭全局中断 |
| 输出持续高/低电平 | 单次模式未正确使能 | 确认OPM和CEN位同时设置 |
| 周期时间偏差较大 | 时钟分频计算错误 | 重新计算PRESCALER值 |
对于电池供电设备,可采取以下措施降低功耗:
c复制void PWM_IRQHandler() {
if(PWMCS->SR & PWMCS_SR_CCIF) {
PWMCS->SR &= ~PWMCS_SR_CCIF; // 清除标志
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
PWR->CR |= PWR_CR_PDDS; // 进入深度睡眠
__WFI();
}
}
在某激光打标设备中,我们利用T153的单次脉冲模式实现了以下控制流程:
运动同步:
能量控制:
c复制void FireLaser(uint16_t duration_us) {
PWMCS->CR1 &= ~PWMCS_CR1_CEN;
PWMCS->PULSE_WIDTH = duration_us * 10; // 100MHz时钟
PWMCS->CR1 |= PWMCS_CR1_CEN;
while(!(PWMCS->SR & PWMCS_SR_CCIF)); // 等待完成
}
安全保护:
实测表明,该方案比传统软件触发方式精度提高20倍,抖动小于5ns。