找回密码
 立即注册
查看: 723|回复: 5

关于PWM6不输出的疑问

[复制链接]
  • TA的每日心情
    开心
    昨天 17:47
  • 签到天数: 56 天

    [LV.5]常住居民I

    15

    主题

    222

    回帖

    1201

    积分

    金牌会员

    积分
    1201
    发表于 2023-5-23 12:31:02 | 显示全部楼层 |阅读模式
    用单片机控制两个舵机,按照教程设置后,PWM1P正常输出,但是怎么改设置PWM6都没有输出!现在我都改迷茫了,请帮忙看看
    /*******************************************************
    *定义输出管脚为:P10(PWM1P)和P21(PWM6)
    *******************************************************/

    #include "PWM.h"
    #include "config.h"

    #define PWM_PSC                 (120-1)                //120分频
    #define PWM_PERIOD                 4000                //周期20毫秒
    #define PWM_1_DUTY_0                 108                        //占空比2.7%
    #define PWM_2_DUTY_0                216                        //占空比5.4%       
    #define PWM_DUTY_90                300                        //占空比7.5%
    #define PWM_DUTY_135        400                        //占空比10%
    #define PWM_DUTY_180        500                        //占空比12.5%

    bit B_10ms;

    *********************************************/
    void PWM_Config(void)
    {
            PWMA_PS = 0x00;                //0x00:默认引脚PWM1P=P1.0引脚
            PWMB_PS = 0x00;                //0x00:默认引脚PWM6= P2.1
           
            PWMA_PSCRH = (u16)(PWM_PSC >> 8);
            PWMA_PSCRL = (u16)(PWM_PSC);                                 //PWM_PSC=119+1=实际预分频120
           
            PWMB_PSCRH = (u16)(PWM_PSC >> 8);
            PWMB_PSCRL = (u16)(PWM_PSC);                                 //PWM_PSC=119+1=实际预分频120
           
    //设置PWM的工作模式
            PWMA_CCER1 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
            PWMA_CCER2 = 0x00; //捕获/比较使能寄存器
           
            PWMA_CCMR1 = 0x60; // 设置 CC1 为 PWM模式1
    //        PWMA_CCMR2 = 0x60; // 设置 CC2 为 PWM模式1  
    //        PWMA_CCMR3 = 0x60; // 设置 CC3 为 PWM模式1
    //        PWMA_CCMR4 = 0x60; // 设置 CC4 为 PWM模式1
           
            PWMA_CCER1 = 0x01; //0001 0001 使能 CC1 CC2通道  
    //        PWMA_CCER1 = 0x05; //<-1P1N互补输出时0x05(0101);   0001 0001:使能 CC1P CC2P通道       
            PWMA_CCER2 = 0x00; //关闭不使用的引脚
           
            PWMB_CCER1 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
            PWMB_CCER2 = 0x00;
           
            PWMB_CCMR1 = 0x60; // 设置 CC5 为 PWM模式1
            PWMB_CCMR2 = 0x60; // 0110 0000设置 CC6 为 PWM模式1
    //        PWMB_CCMR3 = 0x60; // 设置 CC7 为 PWM模式2
    //        PWMB_CCMR4 = 0x70; // 设置 CC8 为 PWM模式2
           
            PWMB_CCER1 = 0x11; //位: - - CC6P CC6E - - CC5P CC5E  使能  CC6通道
            PWMB_CCER2 = 0x00; // 禁用 CC7 CC8通道
           
            PWMA_CCR1H = (u8)(PWM_1_DUTY_0 >> 8); // 设置CC1占空比时间 占空比5%
            PWMA_CCR1L = (u8)(PWM_1_DUTY_0);
           
    //        PWMA_CCR2H = (u8)(PWM_DUTY_45 >> 8); // 设置CC2占空比时间 占空比5%
    //        PWMA_CCR2L = (u8)(PWM_DUTY_45);

            PWMB_CCR6H = (u8)(PWM_2_DUTY_0 >> 8); // 设置CC6占空比时间 占空比5%
            PWMB_CCR6L = (u8)(PWM_2_DUTY_0);
           
            PWMB_CCR5H = (u8)(PWM_2_DUTY_0 >> 8); // 设置CC5占空比时间 占空比5%
            PWMB_CCR5L = (u8)(PWM_2_DUTY_0);
           
            PWMA_ARRH = (u8)(PWM_PERIOD >> 8); // 设置PWMA周期20毫秒
            PWMA_ARRL = (u8)(PWM_PERIOD);
           
            PWMB_ARRH = (u8)(PWM_PERIOD >> 8); // 设置PWMB周期20毫秒
            PWMB_ARRL = (u8)(PWM_PERIOD);
           
            PWMA_ENO = 0x01; // 0101 0101 使能 PWM1P(P10) 2P(P54) 3P(P14) 4P(P16)端口输出
                                             //0001 0101 关闭P16成功  0x56:0101 0110 切换到1N输出
            PWMA_BKR = 0x80; // PWMA使能主输出
           
            PWMB_ENO = 0x55; // 0101 0101 使能 PWM5 6 7 8 端口输出
            PWMB_BKR = 0x80; // PWMB使能主输出
           
            PWMA_CR1 = 0x01; // 启动PWMA定时器,向上计数模式
            PWMB_CR1 = 0x01; // 启动PWMB定时器,向上计数模式
    //        PWMB_CR1 = 0x11; // 启动PWMB定时器,向下计数模式
    }

    //--------------------更新占空比-------------------------
    //上下舵机:下底点108=2.7%;上顶点:456=11.4%;
    //左右舵机:避让点:216=5.4%;工作点:488=12.2%;
    //
    //num=0 两舵机同时动作,num=1 舵机上下控制,num=2 舵机左右控制
    void Up_pwm_Duty(u8 num,u16 DUTY1_num,u16 DUTY2_num)       
    {
            static u16 duty1 = PWM_1_DUTY_0, duty2= PWM_2_DUTY_0;
           
            PWM_POWR = 0;        //开电源 这个开电源意思是平时不给舵机供电,供电时通过继电器给舵机供5v电压
            delay_ms(2500);
            //复位舵机
            if(num==0)
            {               
                    PWMA_CCR1H = (u8)(PWM_1_DUTY_0 >> 8);
                    PWMA_CCR1L = PWM_1_DUTY_0;
                   
                    PWMB_CCR6H = (u8)(PWM_2_DUTY_0 >> 8);
                    PWMB_CCR6L = PWM_2_DUTY_0;        
            }
           
            //第一舵机 上下
            if((num==1)&&(duty1!=DUTY1_num))
            {
                    if(duty1<DUTY1_num)
                    {
                            while(duty1!=DUTY1_num)
                            {
                                    duty1++;
                                    PWMA_CCR1H = (u8)(duty1 >> 8);
                                    PWMA_CCR1L = duty1;        
                                    delay_ms(14);                               
                            }
                            duty1=DUTY1_num;
                    }
                    else if(duty1>DUTY1_num)
                    {
                            while(duty1!=DUTY1_num)
                            {
                                    duty1--;
                                    PWMA_CCR1H = (u8)(duty1 >> 8);
                                    PWMA_CCR1L = duty1;        
                                    delay_ms(14);                               
                            }
                            duty1=DUTY1_num;
                    }
                   
            }
            //第二舵机
            if((num==2)&&(duty2!=DUTY2_num))
            {
                    if(duty2<DUTY2_num)
                    {
                            while(duty2!=DUTY2_num)
                            {
                                    duty2++;
                                    PWMB_CCR6H = (u8)(duty2 >> 8);
                                    PWMB_CCR6L = duty2;        
                                    delay_ms(14);                               
                            }
                            duty2=DUTY2_num;
                    }
                    else if(duty2>DUTY2_num)
                    {
                            while(duty2!=DUTY2_num)
                            {
                                    duty2--;
                                    PWMB_CCR6H = (u8)(duty2 >> 8);
                                    PWMB_CCR6L = duty2;        
                                    delay_ms(14);                               
                            }
                            duty2=DUTY2_num;
                    }               
            }
            delay_ms(1500);
    //        PWM_POWR = 1;        //关电源

    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 101 天

    [LV.6]常住居民II

    41

    主题

    1016

    回帖

    6973

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6973
    QQ
    发表于 2023-5-23 15:10:07 | 显示全部楼层
    看下来代码PWM配置目测 没问题呀,你是不是IO口没初始化为输出哦
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3045

    回帖

    6867

    积分

    超级版主

    积分
    6867
    发表于 2023-5-23 16:25:28 | 显示全部楼层
    楼主请参考我司的例子,直接下载PWMB的PWM测试程序,4路PWM都会有输出的。

    STC8H系列-高级PWM范例程序下载
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1779
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

    STC32G-高级PWM范例程序下载
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1778
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 17:47
  • 签到天数: 56 天

    [LV.5]常住居民I

    15

    主题

    222

    回帖

    1201

    积分

    金牌会员

    积分
    1201
     楼主| 发表于 2023-5-23 21:16:55 | 显示全部楼层
    电子DIY小家 发表于 2023-5-23 15:10
    看下来代码PWM配置目测 没问题呀,你是不是IO口没初始化为输出哦

    感谢版主帮忙测试代码,代码确实没有问题,我换第三块测试板终于验证代码没有问题,诡异的是前两块板子都是PWM6没有输出,害我怀疑自己搞错了,但是第三块板子测试就正常了,回过头再测试前两块还是没有输出,把PWM6切换到其他引脚也没有输出,打开PWM5却有输出

    点评

    自己做的板子吗难道没焊好吗  详情 回复 发表于 2023-5-24 09:16
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 101 天

    [LV.6]常住居民II

    41

    主题

    1016

    回帖

    6973

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6973
    QQ
    发表于 2023-5-24 09:16:47 | 显示全部楼层
    llyymm 发表于 2023-5-23 21:16
    感谢版主帮忙测试代码,代码确实没有问题,我换第三块测试板终于验证代码没有问题,诡异的是前两块板子都 ...

    自己做的板子吗难道没焊好吗
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 17:47
  • 签到天数: 56 天

    [LV.5]常住居民I

    15

    主题

    222

    回帖

    1201

    积分

    金牌会员

    积分
    1201
     楼主| 发表于 2023-5-24 19:28:48 | 显示全部楼层
    电子DIY小家 发表于 2023-5-24 09:16
    自己做的板子吗难道没焊好吗

    自己做了一批板子开发新设备用的,还有一块板子是买的开发板,奇怪的是自己焊的和买的板子都是这种情况,而且正好是前两块,害我一直以为自己代码写错了,幸亏版主分析代码没问题,我才想起又做了一块,测试一切正常,心里这郁闷!运气也太好了点吧!
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 10:32 , Processed in 0.081915 second(s), 53 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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