找回密码
 立即注册
查看: 209|回复: 4

关于15W4K32S4的10位PWM问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-04-30 14:35:08
已绑定手机

3

主题

17

回帖

287

积分

中级会员

积分
287
发表于 2025-2-12 12:20:41 | 显示全部楼层 |阅读模式
根据15W4K32S4芯片手册854页中的描述,在不使用中断的情况下,PWMx-B9H/PWMx-B9L/PWMx-B8H/PWMx-B8L与CCAPxH/CCAPxL可以组合为10位的PWM输出,我在网上找了一个例程,但实际操作中无法实现,不知道有没有哪位大侠有做过这样的组合实现10位的PWM输出,请不吝赐教,谢谢!
例程如下:

/*************        功能说明        **************
STC15W4K60S4 2路10位PWM基本应用.
PWM0  为10位PWM.
PWM1  为10位PWM.
******************************************/
#define MAIN_Fosc                24000000L        //定义主时钟
#include        "STC15Fxxxx.H"
/******************************************/
#define        PCA0                        0
#define        PCA1                        1
#define        PCA_Counter                3
#define        PCA_P12_P11_P10        (0<<4)
#define        PCA_P34_P35_P36        (1<<4)
#define        PCA_P24_P25_P26        (2<<4)
#define        PCA_Mode_PWM                                0x42        //B0100_0010
#define        PCA_Mode_Capture                        0
#define        PCA_Mode_SoftTimer                        0x48        //B0100_1000
#define        PCA_Mode_HighPulseOutput        0x4c        //B0100_1100
#define        PCA_Clock_1T        (4<<1)
#define        PCA_Clock_2T        (1<<1)
#define        PCA_Clock_4T        (5<<1)
#define        PCA_Clock_6T        (6<<1)
#define        PCA_Clock_8T        (7<<1)
#define        PCA_Clock_12T        (0<<1)
#define        PCA_Clock_Timer0_OF        (2<<1)
#define        PCA_Clock_ECI        (3<<1)
#define        PCA_Rise_Active        (1<<5)
#define        PCA_Fall_Active        (1<<4)
#define        PCA_PWM_8bit        (0<<6)
#define        PCA_PWM_7bit        (1<<6)
#define        PCA_PWM_6bit        (2<<6)
#define        PCA_PWM_10bit        (3<<6)
/******************************************/
void        PCA_config(void);
void        UpdatePwm(u8 PCA_id, u16 pwm_value);
/******************************************/
void main(void)
{
  PCA_config();
  UpdatePwm(PCA0,800);
  while (1)
{
      
}
}
void  PCA_config(void)
{
CR = 0;
CH = 0;
CL = 0;
AUXR1 = (AUXR1 & ~(3<<4)) | PCA_P12_P11_P10;        P1n_standard(0x07);
CMOD  = (CMOD  & ~(7<<1)) | PCA_Clock_12T;
CMOD  &= ~1;
CCAPM0 = PCA_Mode_PWM;
PCA_PWM0  = (PCA_PWM0 & ~(3<<6)) | PCA_PWM_10bit;
CCAP0L = 0xff;
CCAP0H = 0xff;
CR = 1;
}
/******************************************/
void  UpdatePwm(u8 PCA_id, u16 pwm_value)
{
if(pwm_value > 1024) return;
      
if(PCA_id == PCA0)
{
if(pwm_value == 0)
{
PCA_PWM0 |= 0x32;
CCAP0H = 0xff;
}
else
{
pwm_value = ~(pwm_value-1) & 0x3ff;
PCA_PWM0 = (PCA_PWM0 & ~0x32) | ((u8)(pwm_value >> 4) & 0x30);
CCAP0H = (u8)pwm_value;
CCAP0L = CCAP0H;
}
}
}

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-29 10:30:51

13

主题

429

回帖

2366

积分

超级版主

积分
2366
发表于 2025-2-12 13:23:46 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-04-30 14:35:08
已绑定手机

3

主题

17

回帖

287

积分

中级会员

积分
287
发表于 2025-2-12 14:12:13 | 显示全部楼层
AI*** 发表于 2025-2-12 13:23
参考ISP软件里的范例程序
https://www.stcaimcu.com/data/download/Tools/AIapp-ISP-v6.95F.zip

谢谢您的回复!这个范例程序我先前有看过,需要用到中断。我需要的是不需要中断的10位PWM输出,所以才选择支持10位PWM输出的芯片。我在手册的726页看到了8位PWM的架构,但却没有看到10位PWM的架构和如何配置。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2025-2-13 18:05:37 | 显示全部楼层
改变占空比本身是不需要用到中断的,任何地方都可以改变(包括在中断中改变)。在中断中改变占空比是为了处理数据,比如SPWM。

//========================================================================
// 函数: void UpdatePwm(u8 id, u16 pwm_value)
// 描述: 更新PWM值.
// 参数:        id: PCA序号, 0~1对应 PCA0 ~ PCA1
//                 pwm_value: pwm值, 这个值是输出低电平的时间.
// 返回: none.
// 版本: V1.0, 2014-5-10
//========================================================================
void        UpdatePwm(u8 id, u16 pwm_value)
{
        if(id == 0)
        {
                PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP0H = (u8)pwm_value;
        }

        else if(id == 1)
        {
                PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP1H = (u8)pwm_value;
        }

}




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-04-30 14:35:08
已绑定手机

3

主题

17

回帖

287

积分

中级会员

积分
287
发表于 2025-2-20 10:15:40 | 显示全部楼层
梁*** 发表于 2025-2-13 18:05
改变占空比本身是不需要用到中断的,任何地方都可以改变(包括在中断中改变)。在中断中改变占空比是为了处 ...

感谢您的回复!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:31 , Processed in 0.125433 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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