找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 248|回复: 8
打印 上一主题 下一主题
收起左侧

PWM两通道不能同时用?

[复制链接]
跳转到指定楼层
楼主
ID:1167397 发表于 2026-2-18 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void PCA_Init(void)               
{        CL = 0;                        
        CH = 0;
        CMOD = 0x0E;                    // 设置PCA时钟频率 SYSclk/8
        CCAP0H = CCAP0L = 0x3F;         //
        CCAPM0 = 0x42;                  //
        PCA_PWM0 = 0x03;
        CCAP1H = CCAP1L = 0x80;         //
        CCAPM1 = 0x42;                  //PCA工作模式PWM无中断
        PCA_PWM1 = 0x03;                                                //
        CR = 1;                                                                         //PCA计数器启动  CCON.6
        
//        CMOD|=1<<0;                            //PCA溢出中断使能   
}

型号STC12C5A60S2  测试发现PWM两通道不能同时打开,只能一个一个的来,不知问题出现哪里

用示波器观赛的
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1133081 发表于 2026-2-19 09:05 | 只看该作者
这PWM初始化程序没有问题,查查应用程序。
回复

使用道具 举报

板凳
ID:1167397 发表于 2026-2-19 09:18 | 只看该作者
没有什么应用,只是功能测试。用示波器观察发现的问题
回复

使用道具 举报

地板
ID:1133081 发表于 2026-2-19 11:41 | 只看该作者
YYYYYU 发表于 2026-2-19 09:18
没有什么应用,只是功能测试。用示波器观察发现的问题

仔细看了一下是模式设置错误 PCA_PWM0 = 0x03;  实际只有3种设置  PCA_PWM0 = 0x00 //8位PMW,PCA_PWM0 = 0x40 //7位PMW,PCA_PWM0 = 0x80 //6位PMW。
回复

使用道具 举报

5#
ID:1167397 发表于 2026-2-19 13:48 | 只看该作者
发表于 2026-2-19 11:41
仔细看了一下是模式设置错误 PCA_PWM0 = 0x03;  实际只有3种设置  PCA_PWM0 = 0x00 //8位PMW,PCA_PWM0 = ...

你说的是什么型号。STC12C5A60S2 PCA_PWMx只有bit1 bit0 两个位, 0x80怎么设置。
不过资料的资料太简单,跟没说一样!
回复

使用道具 举报

6#
ID:1133081 发表于 2026-2-19 17:16 | 只看该作者
YYYYYU 发表于 2026-2-19 13:48
你说的是什么型号。STC12C5A60S2 PCA_PWMx只有bit1 bit0 两个位, 0x80怎么设置。
不过资料的资料太简单 ...

手上没有STC12C5A60S2,是用IAP15W4K58S测试的,两者PWM模式设置确有区别。
回复

使用道具 举报

7#
ID:1161211 发表于 2026-2-20 00:17 | 只看该作者
PWM应配置IO选择和IO输出允许,仔细看看手册
回复

使用道具 举报

8#
ID:876947 发表于 2026-2-20 13:12 | 只看该作者
只要足够的I/O ,N个通道都可以呀!
回复

使用道具 举报

9#
ID:1167529 发表于 2026-2-20 16:59 | 只看该作者
核心问题定位与解决方案

你遇到的STC12C5A60S2两路PCA PWM无法同时输出,核心问题出在CCAPMn寄存器配置错误,同时补充其他常见坑的排查方案。

 

一、核心错误:PWM模式未正确使能

你当前代码中  CCAPM0 = 0x42 、 CCAPM1 = 0x42  是错误的:

-  0x42  二进制为  0100 0010 ,对应STC12的CCAPMn寄存器定义:
- Bit2(PWMn,PWM模式使能位)= 0,根本没有开启PWM模式
- 仅开启了Bit1(ECOMn,比较器使能)和Bit6(CAPPn,上升沿捕获),属于捕获/比较模式,并非PWM输出模式

正确配置:
要开启PWM模式,必须同时置1 ECOMn(Bit1) 和 PWMn(Bit2):

- 无需捕获功能: CCAPMn = 0x06 (二进制  0000 0110 )
- 保留上升沿捕获(和你原代码兼容): CCAPMn = 0x46 (二进制  0100 0110 )

 

二、修正后的完整初始化代码

c
  
void PCA_Init(void)
{
    CL = 0;
    CH = 0;
    CMOD = 0x0E;  // PCA时钟 = 系统时钟/8,你的配置正确
   
    // 通道0 PWM配置(对应IO:P1.3)
    CCAP0H = 0x3F;  // 仅设置高8位,硬件会自动加载到CCAP0L,无需手动赋值CCAP0L
    CCAPM0 = 0x46;  // 修正:开启PWM模式+比较器+上升沿捕获,无中断
    PCA_PWM0 = 0x00; // 修正:默认8位PWM(你原代码0x03是10位模式,普通场景用8位更稳定)
   
    // 通道1 PWM配置(对应IO:P1.4)
    CCAP1H = 0x80;  // 仅设置高8位
    CCAPM1 = 0x46;  // 修正:和通道0一致,正确开启PWM模式
    PCA_PWM1 = 0x00; // 8位PWM模式
   
    CR = 1;  // 启动PCA计数器,你的配置正确
    // CMOD|=1<<0;  // 无需溢出中断,保持注释即可
}
 

 

三、其他必查的常见坑

1. IO口配置确认
STC12C5A60S2的PCA输出引脚是固定的:
- CEX0(通道0)→ P1.3
- CEX1(通道1)→ P1.4
确保这两个IO口没有被其他功能占用,且没有被设置为高阻输入。如需更强驱动能力,可设置为推挽输出:

c
  
P1M0 |= 0x18; // P1.3、P1.4 推挽输出
P1M1 &= ~0x18;
 
2. 10位PWM模式注意事项
如果你确实需要10位PWM(保留 PCA_PWMn=0x03 ),则占空比计算需要匹配10位宽度,不能直接用8位的 0x3F 、 0x80 ,否则会出现占空比异常,甚至看起来无输出。
3. 占空比测试建议
调试时先将两路占空比都设为50%( CCAPnH=0x80 ),方便示波器快速确认是否有输出,避免占空比极端值导致误判。

 

四、为什么你之前“单个通道能输出”

大概率是你测试单通道时,不小心修改了CCAPMn的配置(比如误写成0x46),或者单通道下比较模式的翻转输出被你误判为PWM输出,双路时配置冲突导致彻底无输出。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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