找回密码
 立即注册
查看: 1004|回复: 3

P1.0/P1.1、P1.2/P1.3及P1.4/P1.5切换到P2.0/P2.1、P2.2/P2.3、P2.4/P2.5...

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:485
  • 最近打卡:2025-05-03 08:49:35
已绑定手机

23

主题

589

回帖

2817

积分

金牌会员

积分
2817
发表于 2023-3-22 17:03:16 | 显示全部楼层 |阅读模式
P1.0/P1.1、P1.2/P1.3及P1.4/P1.5切换到P2.0/P2.1、P2.2/P2.3、P2.4/P2.5输出PWM问题如下:

我看到手册上面描述说PWMA可输出4组(8路)可互补的PWM,而PWMB只能输出4路单端的PWM。但是又在功能脚切换寄存器PWMA_PS看到可通过赋值为使C1PS = 01、C2PS=01、C3PS=01即可由P1.0/P1.1、P1.2/P1.3及P1.4/P1.5切换到P2.0/P2.1、P2.2/P2.3、P2.4/P2.5来输出PWM。我的代码如下,可实际上P2.0/P2.1、P2.2/P2.3、P2.4/P2.5无论如何都无法输出PWM,不知何故?郁闷.........恳请大侠们指教,感谢不已!


#include <STC8H.H>

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

#define PWM1_1      0x00        //P1.0/P1.1
#define PWM1_2      0x01        //P2.0/P2.1

#define PWM2_1      0x00        //P1.2(/P5.4)/P1.3
#define PWM2_2      0x04        //P2.2/P2.3

#define PWM3_1      0x00        //P1.4/P1.5
#define PWM3_2      0x10        //P2.4/P2.5

#define ENO1P       0x01//宏定义
#define ENO1N       0x02//宏定义

#define ENO2P       0x04//宏定义
#define ENO2N       0x08//宏定义

#define ENO3P       0x10//宏定义
#define ENO3N       0x20//宏定义

u16 PWM1_Duty;//PWM1占空比变量
u16 PWM2_Duty;//PWM2占空比变量
u16 PWM3_Duty;//PWM3占空比变量

void UpdatePwm(void);//PWM占空比更新函数

void main()
{
    P2M1 = 0x00;   P2M0 = 0xff;   //设置为推挽输出
   
    P_SW2 |= 0x80;//外设端口切换控制寄存器2,使能访问XFR
    PWMA_CCER1 = 0x00;//写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;//写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCMR1 = 0x60;//通道模式配置
    PWMA_CCMR2 = 0x60;//通道模式配置
    PWMA_CCMR3 = 0x60;//通道模式配置
    PWMA_CCMR4 = 0x60;//通道模式配置
    PWMA_CCER1 = 0x33;//配置通道输出使能和极性
    PWMA_CCER2 = 0x33;//配置通道输出使能和极性

    PWMA_ARRH = 0x03; //设置周期时间
    PWMA_ARRL = 0xff; //设置周期时间

    PWMA_ENO = 0x00;//使能输出前,先关闭使能
    PWMA_ENO |= ENO1P; //使能P2.0输出
    PWMA_ENO |= ENO1N; //使能P2.1输出
    PWMA_ENO |= ENO2P; //使能P2.2输出
    PWMA_ENO |= ENO2N; //使能P2.3输出
    PWMA_ENO |= ENO3P; //使能P2.4输出
    PWMA_ENO |= ENO3N; //使能P2.5输出

    PWMA_PS = 0x00;    //高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_2; //切换选择 PWM1_2  通道
    PWMA_PS |= PWM2_2; //切换选择 PWM2_2  通道
    PWMA_PS |= PWM3_2; //切换选择 PWM3_2  通道

    PWMA_BKR = 0x80;   //使能主输出
    PWMA_CR1 |= 0x01;  //开始计时

    P_SW2 &= 0x7f;//外设端口切换控制寄存器2,禁止访问XFR

    PWM1_Duty = 528;//PWM1占空比初始化
    PWM2_Duty = 528;//PWM2占空比初始化
    PWM3_Duty = 528;//PWM3占空比初始化
   
    P_SW2 |= 0x80;//外设端口切换控制寄存器2,使能访问XFR
    PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;        //PWM1输出PWM
    PWMA_CCMR2 = (PWMA_CCMR2 & ~0x70) | 0x60;        //PWM1输出PWM
    PWMA_CCMR3 = (PWMA_CCMR3 & ~0x70) | 0x60;        //PWM2输出PWM
    PWMA_CCMR4 = (PWMA_CCMR4 & ~0x70) | 0x60;        //PWM2输出PWM
    //疑问:若要使PWM3的P2.4及P2,5输出PWM应如何处理??????
    UpdatePwm();//更新1次PWM占空比
    P_SW2 &= 0x7f;//外设端口切换控制寄存器2,禁止访问XFR
   
    while(1)
    {
        
    }
}

void UpdatePwm(void)//PWM占空比更新函数
{
    P_SW2 |= 0x80;//外设端口切换控制寄存器2,使能访问XFR
    PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
    PWMA_CCR1L = (u8)(PWM1_Duty);
    PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
    PWMA_CCR2L = (u8)(PWM2_Duty);
    PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //设置占空比时间
    PWMA_CCR3L = (u8)(PWM3_Duty);
    P_SW2 &= 0x7f;//外设端口切换控制寄存器2,禁止访问XFR
}


不停地学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:485
  • 最近打卡:2025-05-03 08:49:35
已绑定手机

23

主题

589

回帖

2817

积分

金牌会员

积分
2817
发表于 2023-3-22 17:04:40 | 显示全部楼层
我采用的芯片型号为STC8H3K64S4-LQFP32
不停地学习
  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2023-3-22 17:33:41 | 显示全部楼层
你的代码中只使能了PWMP输出,没有使能PWMN输出
改为下面这样就正常了

1.png
  • 打卡等级:以坛为家II
  • 打卡总天数:485
  • 最近打卡:2025-05-03 08:49:35
已绑定手机

23

主题

589

回帖

2817

积分

金牌会员

积分
2817
发表于 2023-3-22 18:08:12 | 显示全部楼层
zh*** 发表于 2023-3-22 17:33
你的代码中只使能了PWMP输出,没有使能PWMN输出
改为下面这样就正常了

嗯嗯,不好意思,是我大意了,没有仔细详细研究手册!感谢感谢!!
不停地学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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