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

关于PWM6不输出的疑问

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 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;        //关电源

}

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 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爱好者互助交流社区)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:04 , Processed in 0.260455 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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