找回密码
 立即注册
查看: 100|回复: 6

8G2K64S4 PWM怎样输出固定周期,每路按固定递增的波形

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2025-4-11 23:42:15 | 显示全部楼层 |阅读模式
8G2K64S4 PWM怎样输出固定周期,每路按固定递增的波形。使用PWM0模组的8个通道输出。


如图



11111.png
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-11 23:43:00 | 显示全部楼层
在STC8G2K64S4微控制器中,PWM0模块提供了8个独立的PWM通道,能够输出固定周期且每路按固定递增的波形。以下是实现该功能的详细步骤:

1. 配置PWM0模块的基本参数
首先,需要配置PWM0模块的基本参数,包括PWM周期和时钟源。
  1. c
  2. // 设置PWM时钟源和分频系数
  3. PWM0CLKSRC = 0x00;  // 选择系统时钟作为PWM时钟源
  4. PWM0CLKDIV = 0x00;  // 不分频
  5. // 设置PWM周期
  6. PWM0PERIOD = 0xFFFF;  // 设置PWM周期为65535
复制代码

2. 配置PWM0的8个通道
接下来,配置PWM0的8个通道,使每个通道的占空比按固定递增。
  1. c
  2. // 配置PWM0的8个通道
  3. for (int i = 0; i < 8; i++) {
  4.     PWM0CH[i].DUTY = (i + 1)  0x1000;  // 设置每个通道的占空比,按固定递增
  5.     PWM0CH[i].CTRL = 0x01;  // 使能PWM通道
  6. }
复制代码

3. 启动PWM0模块
配置完成后,启动PWM0模块,使PWM波形开始输出。
  1. c
  2. // 启动PWM0模块
  3. PWM0CTRL = 0x01;  // 使能PWM0模块
复制代码

4. 调整PWM周期和占空比
如果需要调整PWM周期或占空比,可以通过修改PWM0PERIOD和PWM0CH.DUTY的值来实现。
  1. c
  2. // 调整PWM周期
  3. PWM0PERIOD = 0x7FFF;  // 设置PWM周期为32767
  4. // 调整PWM占空比
  5. for (int i = 0; i < 8; i++) {
  6.     PWM0CH[i].DUTY = (i + 1)  0x0800;  // 设置每个通道的占空比,按固定递增
  7. }
复制代码

5. 关闭PWM0模块
在不需要PWM输出时,可以关闭PWM0模块以节省功耗。
  1. c
  2. // 关闭PWM0模块
  3. PWM0CTRL = 0x00;  // 禁用PWM0模块
复制代码

总结
通过以上步骤,可以在STC8G2K64S4微控制器中配置PWM0模块,输出固定周期且每路按固定递增的波形。具体实现时,需根据实际需求调整PWM周期和占空比,以达到预期的波形输出效果。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-4-12 11:51:23 | 显示全部楼层


使用一组PWM的8个通道即可实现,通过设定周期值为整个移相范围。
然后设置不同的T1和T2点即可实现所述功能。
例如设置周期值为100,那么PWM00T1(包含H和L)设置为0,PWM00T2设置为10
PWM01T1设置为5,PWM01T2设置为15.....依次类推,即可实现上述图片中的功能
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2025-4-12 12:47:55 | 显示全部楼层
王*** 发表于 2025-4-12 11:51
使用一组PWM的8个通道即可实现,通过设定周期值为整个移相范围。
然后设置不同的T1和T2点即可实现所述功 ...

你好,能详细点说周期值整体移动?
  1. void PWM_config(void)       
  2. {
  3.         PWM15_InitTypeDef                PWM15_InitStructure;
  4.        
  5. /********************* 8路 200HZ输出 **********************************************/       
  6.         PWM15_InitStructure.PWM_Enable    = ENABLE;                                        //PWM使能,  ENABLE, DISABLE
  7.         PWM15_InitStructure.PWM_Period    = 30000-1;                                //PWM周期,  200HZ
  8.         PWM15_InitStructure.PWM_Clock_Sel = PWMn_CLK_SYS;                        //时钟源选择,  PWMn_CLK_SYS, PWMn_CLK_TM2
  9.         PWM15_InitStructure.PWM_Clock_PS  = 3;                                                //系统时钟分频参数(PS+1分频),  0~15
  10.         PWM15_InitStructure.PWM_Counter   = ENABLE;                                        //计数器使能,  ENABLE, DISABLE
  11.         PWM15_Init(PWM0,&PWM15_InitStructure);
  12.        
  13.         PWM15Duty( PWM00, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  14.         PWM15Duty( PWM01, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  15.         PWM15Duty( PWM02, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  16.         PWM15Duty( PWM03, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  17.         PWM15Duty( PWM04, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  18.         PWM15Duty( PWM05, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  19.         PWM15Duty( PWM06, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  20.         PWM15Duty( PWM07, 0, (30000-3000) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  21.         PWMChannelCtrl(PWM00,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  22.         PWMChannelCtrl(PWM01,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  23.         PWMChannelCtrl(PWM02,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  24.         PWMChannelCtrl(PWM03,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  25.         PWMChannelCtrl(PWM00,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  26.         PWMChannelCtrl(PWM01,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  27.         PWMChannelCtrl(PWM02,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
  28.         PWMChannelCtrl(PWM03,ENABLE,0,DISABLE,DISABLE,DISABLE);                //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断       
  29.        
  30. }
复制代码

点评

[*] PWM15Duty( PWM00, 0, (300) ); //PWM_ID, 输出低电平位置, 输出高电平位置 [*] PWM15Duty( PWM01, 100, (400) );  详情 回复 发表于 2025-4-12 13:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-4-12 13:01:52 | 显示全部楼层
小*** 发表于 2025-4-12 12:47
你好,能详细点说周期值整体移动?

  • PWM15Duty( PWM00, 0, (300) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  • PWM15Duty( PWM01, 100, (400) );                                                //PWM_ID, 输出低电平位置, 输出高电平位置

你好,类似这个样子设置就可以了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2025-4-12 15:54:36 | 显示全部楼层
比如P0.0~P0.7输出8个同频、波形错开的PWM:
//========================================================================
// 函数: void        PWM0_config(void)
// 描述: PWM配置函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-5-17
// 备注:
//========================================================================
void        PWM0_config(void)
{
        EAXSFR();                                //访问XFR. 头文件中的宏.
        PWMCFG01 &= 0xf0;
        PWMSET   |= ENPWM0;                //允许P0(P0.0~P0.7)做PWM
        PWM0CKS = CKS_1T;                //选择PWM0时钟, CKS_TIMER2, CKS_1T ~ CKS_16T
        PWM0C   = 2400;                        //设置PWM0周期

        P00 = 0;
        P0n_push_pull(1<<0);        //PWM输出口设置为推挽输出
        PWM00T2  = 0;                        //T2输出高电平时刻
        PWM00T1  = 240;                        //T1输出低电平时刻
        PWM00HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM00CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P01 = 0;
        P0n_push_pull(1<<1);        //PWM输出口设置为推挽输出
        PWM01T2  = 100;                        //T2输出高电平时刻
        PWM01T1  = 300;                        //T1输出低电平时刻
        PWM01HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM01CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P02 = 0;
        P0n_push_pull(1<<2);        //PWM输出口设置为推挽输出
        PWM02T2  = 200;                        //T2输出高电平时刻
        PWM02T1  = 400;                        //T1输出低电平时刻
        PWM02HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM02CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P03 = 0;
        P0n_push_pull(1<<3);        //PWM输出口设置为推挽输出
        PWM03T2  = 300;                        //T2输出高电平时刻
        PWM03T1  = 500;                        //T1输出低电平时刻
        PWM03HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM03CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P04 = 0;
        P0n_push_pull(1<<4);        //PWM输出口设置为推挽输出
        PWM04T2  = 400;                        //T2输出高电平时刻
        PWM04T1  = 600;                //T1输出低电平时刻
        PWM04HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM04CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P05 = 0;
        P0n_push_pull(1<<5);        //PWM输出口设置为推挽输出
        PWM05T2  = 500;                        //T2输出高电平时刻
        PWM05T1  = 700;                //T1输出低电平时刻
        PWM05HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM05CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P06 = 0;
        P0n_push_pull(1<<6);        //PWM输出口设置为推挽输出
        PWM06T2  = 600;                        //T2输出高电平时刻
        PWM06T1  = 800;                //T1输出低电平时刻
        PWM06HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM06CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

        P07 = 0;
        P0n_push_pull(1<<7);        //PWM输出口设置为推挽输出
        PWM07T2  = 700;                        //T2输出高电平时刻
        PWM07T1  = 900;                //T1输出低电平时刻
        PWM07HLD = PWM_Normal;        //PWM正常输出,  (PWM_KeepHigh: PWM强制输出高电平, PWM_KeepLow: PWM强制输出低电平)
        PWM07CR  = ENO;                        //ENO:允许PWM输出, INI: 初始电平为高电平.  ENI:允许匹配中断, ENT2I:允许上升沿(T2匹配)中断, ENT1I:允许下降沿(T1匹配)中断

//        PWMCFG01 |= EPWM0CBI;        //允许归零中断
        PWMCFG01 |= PWM0CEN;        //启动计数器, 开始PWM输出, 初始化最后执行的语句
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2025-4-12 21:18:58 | 显示全部楼层
梁*** 发表于 2025-4-12 15:54
比如P0.0~P0.7输出8个同频、波形错开的PWM:
//======================================================== ...
  1. PWM15_InitStructure.PWM_Enable    = ENABLE;                                        //PWM使能,  ENABLE, DISABLE
  2.         PWM15_InitStructure.PWM_Period    = 30000-1;                                //PWM周期,  200HZ
  3.         PWM15_InitStructure.PWM_Clock_Sel = PWMn_CLK_SYS;                        //时钟源选择,  PWMn_CLK_SYS, PWMn_CLK_TM2
  4.         PWM15_InitStructure.PWM_Clock_PS  = 3;                                                //系统时钟分频参数(PS+1分频),  0~15
  5.         PWM15_InitStructure.PWM_Counter   = ENABLE;                                        //计数器使能,  ENABLE, DISABLE
  6.         PWM15_Init(PWM0,&PWM15_InitStructure);
  7.        
  8.                
  9.         PWM15Duty( PWM07, (1000+2400), (1000));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  10.         PWM15Duty( PWM06, (2200+2400), (2200));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  11.         PWM15Duty( PWM05, (3600+2400), (3600));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  12.         PWM15Duty( PWM04, (4800+2400), (4800));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  13.         PWM15Duty( PWM03, (6000+2400), (6000));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  14.         PWM15Duty( PWM02, (7200+2400), (7200));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  15.         PWM15Duty( PWM01, (8400+2400), (8400));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
  16.         PWM15Duty( PWM00, (9600+2400), (9600));                                                //PWM_ID, 输出低电平位置, 输出高电平位置
复制代码


222.png
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 21:51 , Processed in 0.147521 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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