找回密码
 立即注册
查看: 43|回复: 3

使能PWMB触发PWMA输相位差PWM

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-10-10 09:10:39

7

主题

14

回帖

175

积分

注册会员

积分
175
发表于 6 天前 | 显示全部楼层 |阅读模式

void PWMB_PWMAOutput_init(void)//使能PWMB触发PWMA输出
{
    PWMx_InitDefine     PWMx_InitStructure;
   
    PWMA_Duty1.PWM2_Duty = 100;
    PWMB_Duty.PWM5_Duty = 100;

    // PWMA_Prescaler(23);//预分频器设置
    // PWMB_Prescaler(23);//预分频器设置

    PWMB_MainModeSel(1);//      //主模式选择
    PWMA_SMCR_Source(2);//         //触发源选择
    PWMA_SMCR_SMS(SMCR_SMSA_TRIG);//     ///触发模式
    PWMA_Counter(500);//         //计数器设置


    PWMx_InitStructure.PWM_Mode    =    CCMRn_PWM_MODE1;  //模式,CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
    PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM5_Duty;   //PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect   = ENO5P;                 //输出通道选择,   ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM5, &PWMx_InitStructure);               //初始化PWM,  PWMA,PWMB


    PWMx_InitStructure.PWM_Mode    =    CCMRn_PWM_MODE1;    //模式,       CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
    PWMx_InitStructure.PWM_Duty    = PWMA_Duty1.PWM2_Duty;  //PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect   = ENO2P ;    //输出通道选择,   ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM2, &PWMx_InitStructure);               //初始化PWM,  PWMA,PWMB

    PWMx_InitStructure.PWM_Period   = 1000;                         //周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;                                //死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;               //主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;               //使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);               //初始化PWM通用寄存器,  PWMA,PWMB

    PWMx_InitStructure.PWM_Period   = 1000;                         //周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;                                //死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;               //主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;               //使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMA, &PWMx_InitStructure);               //初始化PWM通用寄存器,  PWMA,PWMB

    NVIC_PWM_Init(PWMA,DISABLE,Priority_0);

    NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
    P2_MODE_IO_PU(GPIO_Pin_LOW);        // 设置为准双向口
}
上面的代码可实现P22和P20引脚的相位差PWM,但是预分频器打开的话,波形就不再是相位差PWM了,有懂的高手给讲讲


回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 6 天前 | 显示全部楼层
在嵌入式系统中,PWM(脉宽调制)技术被广泛应用于电机控制、电源管理和信号生成等领域。在某些应用场景中,需要实现多个PWM通道之间的联动控制,例如使用一个PWM模块(如PWMB)来触发另一个PWM模块(如PWMA),从而实现互补输出或同步控制。本文将围绕一段代码片段进行分析,详细解释如何使能PWMB触发PWMA输出互补PWM,并对相关配置和实现原理进行专业阐述。

一、代码片段分析

以下为用户提供的代码片段:
  1. c
  2. void PWMBPWMAOutputinit(void) // 使能PWMB触发PWMA输出
  3. {
  4.     PWMxInitDefine     PWMxInitStructure;
  5.     PWMADuty1PWM2Duty = 100;
  6.     PWMBDutyPWM5Duty = 100;
  7.     // PWMAPrescaler(23); // 预分频器设置
  8.     // PWMBPrescaler(23); // 预分频器设置
  9.     PWMBMainModeSel(1); // 主模式选择
复制代码

从代码结构可以看出,这是一个用于初始化PWM模块的函数,其目标是配置PWMB作为主模块,触发PWMA输出互补PWM信号。代码中使用了多个宏定义和函数调用,例如PWMBMainModeSel()用于设置主模式,PWMADuty1PWM2Duty和PWMBDutyPWM5Duty用于设置占空比。

需要注意的是,该代码片段并不完整,缺少PWMA的初始化配置、触发模式设置以及中断或DMA配置等内容。以下将从硬件原理和软件配置两个层面,系统性地分析如何实现“PWMB触发PWMA输出互补PWM”。

二、PWM互补输出与主从模式原理

1. 互补PWM输出的基本概念

互补PWM是指两个PWM信号在相位上相差180°,即一个为高电平时另一个为低电平。这种配置常用于H桥电机驱动、DC-AC逆变器等场合,以实现高效的功率切换。

实现互补PWM通常需要以下配置:
两个PWM通道分别设置为互补输出;
共享相同的时钟源和计数器;
配置死区时间(Dead Time)以防止上下桥臂同时导通造成短路;
有时需要通过外部信号(如刹车信号)进行同步或关闭输出。

2. 主从模式(Master-Slave Mode)

在多PWM模块系统中,通常会设置一个主模块(Master)来控制从模块(Slave)。主模块产生基本的时钟信号、周期信号或触发信号,从模块则根据这些信号进行同步操作。

在本例中,PWMB被设置为主模块,用于触发PWMA模块的输出行为。这种配置可以通过以下方式实现:
将PWMB配置为“主模式”,输出触发信号;
将PWMA配置为“从模式”,接收PWMB的触发信号作为其启动或更新信号;
设置PWMA为互补输出模式;
保证两者使用相同的时钟源,确保同步性。

三、实现步骤与关键配置

1. 配置PWMB为主模块
  1. c
  2. PWMBMainModeSel(1); // 设置PWMB为主模式
复制代码

该函数调用将PWMB配置为“主模式”,使其可以输出触发信号。主模式通常包括以下几种类型:
PWM模式:用于输出PWM波形;
触发模式:用于触发其他外设(如ADC、定时器);
编码器模式:用于接收编码器信号;
复位模式:用于重置其他定时器。

根据芯片手册,PWMBMainModeSel(1)可能将PWMB设置为“PWM模式”或“触发源模式”,具体取决于底层寄存器配置。建议查阅芯片数据手册,确认主模式编号对应的功能。

2. 配置PWMA为从模块并启用互补输出

在初始化PWMA时,需要将其配置为从模式,并设置为互补输出。示例代码如下:
  1. c
  2. PWMASlaveModeSel(2); // 设置PWMA为从模式,响应外部触发
  3. PWMAOutputConfig(PWMxOUTPUTCOMPLEMENTARY); // 启用互补输出
  4. PWMAEnableDeadTime(10); // 设置死区时间,单位为时钟周期
复制代码

这些配置确保PWMA只在接收到PWMB的触发信号后才开始输出PWM波形,并且输出为互补形式。

3. 占空比设置
  1. c
  2. PWMADuty1PWM2Duty = 100;
  3. PWMBDutyPWM5Duty = 100;
复制代码

这两行代码设置了PWMA和PWMB的占空比。通常,占空比由比较寄存器控制,其值为周期的百分比。需要注意的是,不同芯片的占空比设置方式可能不同,有些需要设置比较值(Compare Value),有些则直接设置百分比。

4. 预分频器设置(可选)
  1. c
  2. // PWMAPrescaler(23);
  3. // PWMBPrescaler(23);
复制代码

预分频器用于降低定时器的时钟频率,从而调整PWM的频率。如果PWMA和PWMB需要同步工作,它们的预分频器应设置为相同值。

5. 启动PWM模块

最后,需要分别启动PWMB和PWMA模块:
  1. c
  2. PWMBStart();
  3. PWMAStart();
复制代码

四、常见问题与注意事项

1. 时钟同步问题  
   为确保PWMA与PWMB同步工作,必须保证两者使用相同的时钟源或分频后同步的时钟。

2. 死区时间设置  
   在互补输出中,死区时间是防止上下桥臂同时导通的关键配置,必须根据功率器件的特性合理设置。

3. 触发信号类型  
   PWMB作为主模块时,需确认其输出的触发信号类型(如上升沿、下降沿、高电平)是否与PWMA的触发输入兼容。

4. 中断与DMA配置  
   若需动态调整占空比或响应外部事件,可配置中断或DMA通道以实现高效处理。

5. 芯片兼容性  
   不同芯片厂商的PWM模块配置方式差异较大,必须参考具体芯片的数据手册和用户指南。

五、总结

本文围绕“使能PWMB触发PWMA输出互补PWM”的功能需求,从硬件原理、软件配置、关键代码分析及注意事项等多个方面进行了深入解析。实现该功能的关键在于:
正确配置PWMB为主模块,输出触发信号;
设置PWMA为从模块,并启用互补输出;
确保时钟同步与死区时间配置;
完整初始化PWM模块并启动输出。

在实际开发过程中,建议结合具体芯片的参考手册进行详细配置,并通过示波器等工具验证PWM输出的波形与同步性,以确保系统稳定运行。

如需进一步完善代码实现,可补充完整的初始化结构体配置、中断服务函数及死区控制逻辑。欢迎继续交流更深层次的PWM联动控制策略。

[本文内容由国芯人工智能辅助生成,仅供参考]

点评

是相位差PWM,不是互补  发表于 6 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 6 天前 | 显示全部楼层
因为预分频是在更新事件后才装载的

可以使用以下两行代码,在设置预分频后进行一次软件触发更新事件
PWMA_EGR = 0x01;
PWMB_EGR = 0x01;//软件触发A,B两组的更新事件,装载预分频值
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 05:39 , Processed in 0.137215 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表