找回密码
 立即注册
查看: 373|回复: 7

求助帖 关于PWM配置问题

[复制链接]
  • TA的每日心情
    慵懒
    2024-2-22 09:29
  • 签到天数: 38 天

    [LV.5]常住居民I

    5

    主题

    51

    回帖

    285

    积分

    中级会员

    积分
    285
    发表于 2023-12-27 10:08:41 | 显示全部楼层 |阅读模式






    void PWMA_config(void)
    {
            u8        ccer1;
            u8        ccer2;
            u8        ps;
            P_SW2 |= 0x80;                //SFR enable   
            PWMA_ENO    = 0;        // IO输出禁止
            PWMA_IER    = 0;        // 禁止中断
            PWMA_SR1    = 0;        // 清除状态
            PWMA_SR2    = 0;        // 清除状态
            PWMA_CR1    = 0;        // 清除控制寄存器
            PWMA_CR2    = 0;        // 清除控制寄存器
            ccer1 = 0;
            ccer2 = 0;
            ps    = 0;
            eno   = 0;
            PWMA_ISR_En = 0;

            PWMA_PSCR = 100;        // 预分频寄存器, PWM时钟 = 12MHz/(11+1)=1MHz,
            PWMA_DTR  = 12;       
                                           

            PWMA_ARRH=((PWMA_DUTY-1) >> 8);
      PWMA_ARRL=((PWMA_DUTY-1) & 0xFF);
           
           
            PWMA_CCMR3 = 0x10;                // 通道模式配置, PWM模式1, 预装载允许
            PWMA_CCR3  = pwma2;         // 比较值, 控制占空比(高电平时钟数)
            ccer2 |= 0x05;                        // 开启比较输出, 高电平有效
            ps    |= 0x00;                                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
            eno   |= 0x30;                        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
            PWMA_ISR_En |= 0x08;        // 使能中断
           
            PWMA_CCMR2 = 0x68;                // 通道模式配置, PWM模式1, 预装载允许
            PWMA_CCR2  = pwma1;        // 比较值, 控制占空比(高电平时钟数)
            ccer1 |= 0x50;                        // 开启比较输出, 高电平有效
            ps    |= 0;                                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
            eno   |= 0x0C;                        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
    //        PWMA_IER     |= 0x01;        // 使能中断

            PWMA_CCER1  = ccer1;        // 捕获/比较使能寄存器1
            PWMA_CCER2  = ccer2;        // 捕获/比较使能寄存器2
            PWMA_PS     = ps;                // 选择IO

            PWMA_BRK    = 0x80;                // 主输出使能 相当于总开关
            PWMA_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
            PWMA_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
            PWMA_ENO    = 0x00;                // 允许IO输出
           
    }



    void main(void)
    {
           
            PWMA_config();
           
      
            ES = 1;
            EA = 1;        // 开启总中断
           

            while (1){}

    }

    在这一段配置代码中只要我开启语句  PWMA_IER |= 0x08;  就会导致我的I/O口电平被拉低 ,我 注释掉语句  PWMA_IER |= 0x08;  或者将该语句放到 main 函数中,I/O口状态就不会被拉低,请问各位老师这是什么原因所导致的??
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    26

    主题

    1325

    回帖

    4127

    积分

    论坛元老

    积分
    4127
    发表于 2023-12-27 10:45:00 | 显示全部楼层
    你PWM初始化函数里面最后一条指令,关闭了PWM输出通道:
    PWMA_ENO    = 0x00;
    PWM模块就不会对IO口产生影响。
    另外你没有进行IO口初始化,脚位默认是高阻输入模式。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-22 09:29
  • 签到天数: 38 天

    [LV.5]常住居民I

    5

    主题

    51

    回帖

    285

    积分

    中级会员

    积分
    285
     楼主| 发表于 2023-12-27 11:30:21 | 显示全部楼层
    乘风飞扬 发表于 2023-12-27 10:45
    你PWM初始化函数里面最后一条指令,关闭了PWM输出通道:
    PWMA_ENO    = 0x00;
    PWM模块就不会对IO口产生影响 ...

    I/O口子啊另外一个文件  是配置成准双向了
    因为一上电PWM不需要输出 只要保持高电平就行
    现在就是  PWMA_IER |= 0x08; 语句放在PWM配置文件就出问题  放在main 没事 所以现在暂时只能先这样解决着


    在 后续运行中 PWM 的输出函数  PWM_SlowChang()实际是影响着其他I/O口的电平状态,导致硬件无法开机。所以现在感觉无从下手。PWM_SlowChang()也只是配置了 PWM的占空比变换状态。
    void PWM_SlowChang(u16 PWM_Position)
    {
                            if(PWM_Position == 0 )
                    {
                            PWM_OFF = 1;
                    }
                    else if( PWM_Position != 0)
                    {
                            PWM_OFF = 0;
                    }
                   
                    while((currentValue1 < Dury1[ PWM_Position ] )&& (currentValue2< Dury3[ PWM_Position  ]))
                    {
                            while( PWM_Time);
                            currentValue1 += increment;
                            currentValue2 += increment;
                            pwma1  = currentValue1;
                            pwma2N = currentValue2;
                            if((currentValue1 == Dury1[ PWM_Position ] ) && (currentValue2 ==  Dury3[ PWM_Position  ]))
                            {
                                    pwma1  = currentValue1;
                                    pwma2N = currentValue2;
                            }
                            PWM_Time = PWM_Countdown;
                    }
                    while((currentValue1 >= Dury1[ PWM_Position  ] )&& (currentValue2 >= Dury3[ PWM_Position  ]))
                    {
                            while( PWM_Time);
                            currentValue1 -= increment;
                            currentValue2 -= increment;
                            pwma1  = currentValue1;
                            pwma2N = currentValue2;
                            if((currentValue1 == Dury1[ PWM_Position  ] ) && (currentValue2 ==  Dury3[ PWM_Position  ]))
                            {
                                    pwma1   = currentValue1;
                                    pwma2N  = currentValue2;
                                    PWM_Kut = 1;
                            }

                            PWM_Time = PWM_Countdown; //重置倒计时
                    }
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    26

    主题

    1325

    回帖

    4127

    积分

    论坛元老

    积分
    4127
    发表于 2023-12-27 13:19:54 | 显示全部楼层
    Honsiti 发表于 2023-12-27 11:30
    I/O口子啊另外一个文件  是配置成准双向了
    因为一上电PWM不需要输出 只要保持高电平就行
    现在就是  PWMA_ ...

    像这样只提供一鳞半爪的,没法帮你分析。
    你公开的main函数里面只有4条代码,完全不知道你还做过什么。
    屏蔽其它代码,只初始化IO口跟公开的PWM配置函数试试。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2990

    回帖

    6739

    积分

    超级版主

    积分
    6739
    发表于 2023-12-28 16:25:38 | 显示全部楼层
    你有PWM中断函数吗?如果没有,则各种问题都是正常的。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-22 09:29
  • 签到天数: 38 天

    [LV.5]常住居民I

    5

    主题

    51

    回帖

    285

    积分

    中级会员

    积分
    285
     楼主| 发表于 2024-1-6 10:25:14 | 显示全部楼层
    乘风飞扬 发表于 2023-12-27 13:19
    像这样只提供一鳞半爪的,没法帮你分析。
    你公开的main函数里面只有4条代码,完全不知道你还做过什么。
    ...

    目前通过重建解决了问题 现在看来是我的PWM某个配置出现了问题
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-2-22 09:29
  • 签到天数: 38 天

    [LV.5]常住居民I

    5

    主题

    51

    回帖

    285

    积分

    中级会员

    积分
    285
     楼主| 发表于 2024-1-6 10:29:05 | 显示全部楼层
    梁工 发表于 2023-12-28 16:25
    你有PWM中断函数吗?如果没有,则各种问题都是正常的。

    梁工我想问一个问题,就是PWM移相我目前是通过两路通道输出实现的,一路使用PWM模式,一路使用比较输出模式,虽然这个方法可以实现0-180度移相,但是有一个问题就是比较输出模式无法像PWM一样实现0占空比,只能通过使能PWM_EMO实现PWM的关断从而实现0占空比。
    有没有比较好的方法解决这个问题。或者是不是可以使用PWMB作为主模式  PWMA作为从模式这种方式实现移相

    点评

    最简单就是用ENO控制,输出高低均可,我就是如此。  详情 回复 发表于 2024-1-6 10:56
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2990

    回帖

    6739

    积分

    超级版主

    积分
    6739
    发表于 2024-1-6 10:56:23 | 显示全部楼层
    Honsiti 发表于 2024-1-6 10:29
    梁工我想问一个问题,就是PWM移相我目前是通过两路通道输出实现的,一路使用PWM模式,一路使用比较输出模 ...

    最简单就是用ENO控制,输出高低均可,我就是如此。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-11 19:28 , Processed in 0.067503 second(s), 60 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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