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

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

[复制链接]

该用户从未签到

19

主题

103

回帖

205

积分

中级会员

积分
205
发表于 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口使用,我试了下,没有成功,到底是不能这么用呢还是我设置的不对,谢谢。
回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    26

    主题

    1325

    回帖

    4127

    积分

    论坛元老

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

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    205

    积分

    中级会员

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

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

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    205

    积分

    中级会员

    积分
    205
     楼主| 发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    205

    积分

    中级会员

    积分
    205
     楼主| 发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    205

    积分

    中级会员

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

    使用道具 举报

    该用户从未签到

    46

    主题

    2997

    回帖

    6755

    积分

    超级版主

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

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    205

    积分

    中级会员

    积分
    205
     楼主| 发表于 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口使用?
    我不知道为什么不行呢。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    205

    积分

    中级会员

    积分
    205
     楼主| 发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2997

    回帖

    6755

    积分

    超级版主

    积分
    6755
    发表于 2024-3-27 16:38:27 | 显示全部楼层
    本帖最后由 梁工 于 2024-3-27 16:54 编辑
    newlined 发表于 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, 下载次数: 3)

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-12 23:17 , Processed in 0.074332 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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