找回密码
 立即注册
查看: 1599|回复: 14

请教大家,关于STC32G的PWM的使用

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 11:59:26 | 显示全部楼层 |阅读模式
请教大家,我正在用STC32G单片机的PWM功能输出一个方波,我希望用PWMA的第一个通道的PWM1P(管脚选为P2.0)输出方波,,PWM1N(P2.1)关掉输出,另作为普通的IO使用。我看STC32G的手册是这样写的“当使用第一组 PWM 定时器输出 PWM 波形时,可单独使能 PWM1P/PWM2P/PWM3P/PWM4P 输出,也可单独使能 PWM1N/PWM2N/PWM3N/PWM4N 输出。例如:若单独使能了 PWM1P 输出,则 PWM1N就不能再独立输出,除非 PWM1P 和 PWM1N 组成一组互补对称输出。”但是我忘记了是在哪里看到的了,说当使用PWM1P输出时,关掉PWM1N的输出,PWM1N就可以作为一个普通IO口使用,我试了下,没有成功,到底是不能这么用呢还是我设置的不对,谢谢。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-3-27 13:23:07 | 显示全部楼层
PWMx_ENO寄存器,不作为PWM的通道置0,就可以作为普通IO口使用。设置好IO口模式就可以输入/输出。
截图202403271321404498.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 13:33:39 | 显示全部楼层
乘风*** 发表于 2024-3-27 13:23
PWMx_ENO寄存器,不作为PWM的通道置0,就可以作为普通IO口使用。设置好IO口模式就可以输入/输出。
...

谢谢乘风老师的回复,我再试试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 15:37:21 | 显示全部楼层
乘风*** 发表于 2024-3-27 13:23
PWMx_ENO寄存器,不作为PWM的通道置0,就可以作为普通IO口使用。设置好IO口模式就可以输入/输出。
...

乘风老师:遇到一个奇怪的现象,当我把第一个通道的PWM1P(管脚选为P2.0)当做普通的IO口使用,PWM1N(P2.0)设置为PWM,可以工作,程序如下:

void PWMA_Init(void)                        //PWMA的初始化
{
        EAXFR = 1;                                                         //扩展寄存器(XFR)访问使能
        PWMA_PSCRH = 0;                                        //1分频
        PWMA_PSCRL = 0;
       
        PWMA_ARRH  = (u8)(PWM_ARR>>8);
        PWMA_ARRL  = (u8)(PWM_ARR);
       
        PWMA_CCR1H  = (u8)(PWM_CCR>>8);
        PWMA_CCR1L  = (u8)(PWM_CCR);       
               
        //3.输入输出的引脚配置
               
        PWMA_ENO         |=         0x01;                                //关PWM1p(P2.0)通道输出,使能PWM1n(P2.1)通道输出
       
        PWMA_PS         |=         0x01;                                //选择PWM1从P2.0、P2.1引脚输出
       
        //4.输入输出模式设置
        PWMA_CCER1 = 0x00;
        PWMA_CCMR1 = 0x68;                                //pwm模式1 配置置位输出
        PWMA_CCER1 = 0x04;                                //开启输出比较通道
        PWMA_BKR =         0x80;                                        //使能主输出
        PWMA_CR1 |= 0x01;                                        //启动计数器
}

波形如下:上方是P2.0作为普通IO口输出的一个周期为2mS的方波,下方是P2.1用PWM的方式输出的波形。
IMG_20240327_152831.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 15:44:44 | 显示全部楼层
当我把第一个通道的PWM1P(管脚选为P2.0)当做PWM口使用,PWM1N(P2.1)设置为普通的IO口时,就不行了,P2.0(PWM)没有输出,P2.1还有输出。

程序如下:

void PWMA_Init(void)                        //PWMA的初始化
{
        EAXFR = 1;                                                         //扩展寄存器(XFR)访问使能
        PWMA_PSCRH = 0;                                        //1分频
        PWMA_PSCRL = 0;
       
        PWMA_ARRH  = (u8)(PWM_ARR>>8);
        PWMA_ARRL  = (u8)(PWM_ARR);
       
        PWMA_CCR1H  = (u8)(PWM_CCR>>8);
        PWMA_CCR1L  = (u8)(PWM_CCR);       
               
        //3.输入输出的引脚配置
               
        PWMA_ENO         |=         0x01;                                //使能PWM1p(P2.0)通道输出,关PWM1n(P2.1)通道输出
       
        PWMA_PS         |=         0x01;                                //选择PWM1从P2.0、P2.1引脚输出
       
        //4.输入输出模式设置
        PWMA_CCER1 = 0x00;
        PWMA_CCMR1 = 0x68;                                //pwm模式1 配置置位输出
        PWMA_CCER1 = 0x04;                                //开启输出比较通道
        PWMA_BKR =         0x80;                                        //使能主输出
        PWMA_CR1 |= 0x01;                                        //启动计数器
}

波形如下:上方的P2.0(PWM1P)没有输出,下方作为普通IO口的P2.1有输出。这个问题出在哪里?程序哪里设置的不对吗?
IMG_20240327_152936.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 15:51:51 | 显示全部楼层
撤回
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-3-27 16:01:12 | 显示全部楼层
PWMA_ENO设置即可,没有允许输出PWM的IO,就没有PWM功能,可以随意使用其其余功能。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 16:10:10 | 显示全部楼层
梁*** 发表于 2024-3-27 16:01
PWMA_ENO设置即可,没有允许输出PWM的IO,就没有PWM功能,可以随意使用其其余功能。 ...

是不是执行:
PWMA_ENO         |=         0x01;     //使能PWM1p(P2.0)通道输出,关PWM1n(P2.1)通道输出
这一句?P2.0有PWM有输出,P2.1作为普通IO口使用?
我不知道为什么不行呢。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:352
  • 最近打卡:2025-05-03 06:08:08

35

主题

189

回帖

837

积分

高级会员

积分
837
发表于 2024-3-27 16:12:16 | 显示全部楼层
梁*** 发表于 2024-3-27 16:01
PWMA_ENO设置即可,没有允许输出PWM的IO,就没有PWM功能,可以随意使用其其余功能。 ...

梁工您好:您看首贴,P2.0可以作为普通IO口使用,P2.1输出PWM,翻过来就不行了。

点评

随意,P2.1输出PWM,P2.0做IO。  详情 回复 发表于 2024-3-27 16:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-3-27 16:38:27 | 显示全部楼层
本帖最后由 梁工 于 2024-3-27 16:54 编辑
newl*** 发表于 2024-3-27 16:12
梁工您好:您看首贴,P2.0可以作为普通IO口使用,P2.1输出PWM,翻过来就不行了。 ...

随意,P2.1输出PWM,P2.0做IO。

主函数:
void main(void)
{
        u16        i;

        WTST = 0;
        CKCON = 0;
        P_SW2 |= 0x80;                //SFR enable

        PWMA_config();
        P2M0 = 0;

        P2M1 = 0;

        while (1)
        {
                for(i=0; i<100; i++)
                {
                        NOP(10);
                }
                P20 = ~P20;
        }
}

我只是禁止掉P2.0输出PWM,其余P2.1~P2.7继续输出PWM。
        PWMA_CCMR1  = 0x68;                // 通道模式配置, PWM模式1, 预装载允许
        PWMA_CCR1H  = 400/256;        // 比较值, 控制占空比(高电平时钟数)
        PWMA_CCR1L  = 400%256;
        ccer1 |= 0x05;                        // 开启比较输出, 高电平有效
        ps    |= 1;                                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
//        eno   |= 0x03;                        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
        eno   |= 0x02;                        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//        PWMA_ISR_En|= 0x02;                // 使能中断

下面就是示波器波形,蓝色的是P2.1输出PWM,黄色是P2.0在主程序取反输出。
截图202403271653509080.jpg



01A-PWMA-4对互补PWM输出P2口.rar (49.91 KB, 下载次数: 86)

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:05 , Processed in 0.219950 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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