找回密码
 立即注册
查看: 217|回复: 13

8G1K08单片机的PCA模块P33管脚一直输出高

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-02 14:39:27
已绑定手机

3

主题

11

回帖

43

积分

新手上路

积分
43
发表于 2025-4-1 11:21:08 | 显示全部楼层 |阅读模式
为什么我这样配置的时候,PCA模块PWM1一直有输出#include "pca.h"

void PCA_Init_Config(void)
{
        //设置CCP1管脚为P33,即将P_SW1[5:4]设置为00
         P_SW1 &=~0x30;
         CCON=0X00;//关闭PCA计数器
         CMOD = 0x08;       // PCA时钟源=系统时钟,禁止溢出中断
         CL = 0x00;         // PCA计数器低8位清零
   CH = 0x00;         // PCA计数器高8位清零
         // 配置PCA0为8位PWM模式
   CCAPM1 = 0x42;     // 使能PWM0,模式为8位PWM
   CCAP1L = 0x80;     // 初始占空比50%(0x80对应8位中间值)
   CCAP1H = 0x80;     // 必须写入相同值
         CR=0;
         
}求大佬指点一下

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-1 11:23:00 | 显示全部楼层
针对您在使用STC8G1K08单片机时遇到的PCA模块P33管脚一直输出高电平的问题,以下是对您提供的代码配置的分析及可能的解决方案。

1. 代码配置分析
您提供的代码配置如下:
  1. c
  2. void PCAInitConfig(void)
  3. {
  4.     // 设置CCP1管脚为P33,即将PSW1设置为00
  5.     PSW1 &= ~0x30;
  6.     CCON = 0x00; // 关闭PCA计数器
  7.     CMOD = 0x08; // PCA时钟源=系统时钟,禁止溢出中断
  8.     CL = 0x00;   // PCA计数器低8位清零
  9.     CH = 0x00;   // PCA计数器高8位清零
  10.     // 配置PCA0为8位PWM模式
  11.     CCAPM1 = 0x42; // 使能PWM0,模式为8位PWM
  12.     CCAP1L = 0x80; // 初始占空比50%(0x80对应8位中间值)
  13.     CCAP1H = 0x80; // 必须写入相同值
  14.     CR = 0;
  15. }
复制代码

2. 可能的原因及解决方案

2.1 PCA计数器未启动
在您的代码中,CR寄存器被设置为0,这意味着PCA计数器未启动。PCA计数器未启动时,PWM输出将保持默认状态,通常是高电平。

解决方案:
在配置完成后,启动PCA计数器。将CR寄存器设置为1。
  1. c
  2. CR = 1; // 启动PCA计数器
复制代码

2.2 管脚配置问题
您已经通过PSW1 &= ~0x30;将CCP1管脚配置为P33,但需要确保P33管脚未被其他功能占用或配置为输入模式。

解决方案:
确保P33管脚配置为输出模式,并且未被其他功能占用。
  1. c
  2. P3M1 &= ~0x08; // 设置P33为推挽输出模式
  3. P3M0 |= 0x08;
复制代码

2.3 PWM模式配置
您已经将CCAPM1寄存器配置为0x42,表示使能PWM0并设置为8位PWM模式。但需要确保CCAP1L和CCAP1H的值正确。

解决方案:
确保CCAP1L和CCAP1H的值相同,并且根据需求调整占空比。
  1. c
  2. CCAP1L = 0x80; // 初始占空比50%(0x80对应8位中间值)
  3. CCAP1H = 0x80; // 必须写入相同值
复制代码

2.4 时钟源配置
您已经将CMOD寄存器配置为0x08,表示PCA时钟源为系统时钟。确保系统时钟配置正确,并且PCA模块能够正常工作。

解决方案:
检查系统时钟配置,确保PCA模块能够正常工作。

3. 完整代码示例
以下是修正后的完整代码示例:
  1. c
  2. void PCAInitConfig(void)
  3. {
  4.     // 设置CCP1管脚为P33,即将PSW1设置为00
  5.     PSW1 &= ~0x30;
  6.     // 设置P33为推挽输出模式
  7.     P3M1 &= ~0x08;
  8.     P3M0 |= 0x08;
  9.     // 关闭PCA计数器
  10.     CCON = 0x00;
  11.     // PCA时钟源=系统时钟,禁止溢出中断
  12.     CMOD = 0x08;
  13.     // PCA计数器低8位清零
  14.     CL = 0x00;
  15.     // PCA计数器高8位清零
  16.     CH = 0x00;
  17.     // 配置PCA0为8位PWM模式
  18.     CCAPM1 = 0x42; // 使能PWM0,模式为8位PWM
  19.     CCAP1L = 0x80; // 初始占空比50%(0x80对应8位中间值)
  20.     CCAP1H = 0x80; // 必须写入相同值
  21.     // 启动PCA计数器
  22.     CR = 1;
  23. }
复制代码

4. 总结
通过以上分析和修正,您应该能够解决PCA模块P33管脚一直输出高电平的问题。确保PCA计数器启动、管脚配置正确、PWM模式配置正确以及时钟源配置正确是关键。希望这些建议对您有所帮助。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 0 反对 1

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-02 14:39:27
已绑定手机

3

主题

11

回帖

43

积分

新手上路

积分
43
发表于 2025-4-1 11:29:48 | 显示全部楼层
国芯人*** 发表于 2025-4-1 11:23
针对您在使用STC8G1K08单片机时遇到的PCA模块P33管脚一直输出高电平的问题,以下是对您提供的代码配置的分 ...

将CR置,还是一直是高电平
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-4-1 12:44:20 | 显示全部楼层
首先需要确定的是,STC8G1K08并没有PCA功能,仅STC8G1K08A拥有PCA功能
截图202504011244164411.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-4-1 12:51:42 | 显示全部楼层
STC8G1K08-38I-SOP16 有 PCA;
STC8G1K08-38I-TSSOP20 有 PCA;



截图202504011251065423.jpg

截图202504011251394989.jpg


截图202504011252356310.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-02 14:39:27
已绑定手机

3

主题

11

回帖

43

积分

新手上路

积分
43
发表于 2025-4-1 13:39:34 | 显示全部楼层
王*** 发表于 2025-4-1 12:44
首先需要确定的是,STC8G1K08并没有PCA功能,仅STC8G1K08A拥有PCA功能

看手册上STC8G1K08A-36I-SOP8有PAC功能的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-1 13:51:35 | 显示全部楼层
8G1K08A PCA输出PWM
  1. void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
  2. {
  3.         unsigned char temp_l,temp_h,temp;
  4.         
  5.         temp_l=pwm_0&0x00ff;                //读pwm_0低8位赋值给temp_l
  6.         temp_h=(pwm_0&0x0300)>>4;        //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0[5:4])位置,赋值给temp_h
  7.         temp=PCA_PWM0&0xcd;                        //读PCA_PWM0,XCCAP2H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
  8.         temp_h|=temp;                                //写其他位到temph
  9.         if(pwm_0==0x03ff)                        //如果pwm_0最大
  10.                 temp_h|=0x02;                        //设置EPC0H(PCA_PWM0[1])为1
  11.         PCA_PWM0=temp_h;                        //写PCA_PWM0(先写高2位)
  12.         CCAP0H=temp_l;                                //写CCAP0H(再写低8位)
  13.         
  14.         temp_l=pwm_1&0x00ff;                //读pwm_1低8位赋值给temp_l
  15.         temp_h=(pwm_1&0x0300)>>4;        //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1[5:4])位置,赋值给temp_h
  16.         temp=PCA_PWM1&0xcd;                        //读PCA_PWM1,XCCAP1H(PCA_PWM2[5:4])、EPC1H(PCA_PWM1[1])清零后赋值给temp
  17.         temp_h|=temp;                                //写其他位到temph
  18.         if(pwm_1==0x03ff)                        //如果pwm_1最大
  19.                 temp_h|=0x02;                        //设置EPC1H(PCA_PWM1[1])为1
  20.         PCA_PWM1=temp_h;                        //写PCA_PWM1(先写高2位)
  21.         CCAP1H=temp_l;                                //写CCAP1H(再写低8位)
  22.         
  23.         temp_l=pwm_2&0x00ff;                //读pwm_2低8位赋值给temp_l
  24.         temp_h=(pwm_2&0x0300)>>4;        //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2[5:4])位置,赋值给temp_h
  25.         temp=PCA_PWM2&0xcd;                        //读PCA_PWM2,XCCAP2H(PCA_PWM2[5:4])、EPC2H(PCA_PWM2[1])清零后赋值给temp
  26.         temp_h|=temp;                                //写其他位到temph
  27.         if(pwm_2==0x03ff)                        //如果pwm_2最大
  28.                 temp_h|=0x02;                        //设置EPC2H(PCA_PWM2[1])为1
  29.         PCA_PWM2=temp_h;                        //写PCA_PWM2(先写高2位)
  30.         CCAP2H=temp_l;                                //写CCAP2H(再写低8位)
  31. }
复制代码
  1.         CCON=0x00;                                //设置PCA控制寄存器
  2.         CMOD=0x80;                                //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
  3.         CL=0x00;                                //设置PCA计数器
  4.         CH=0x00;                                //设置PCA计数器
  5.         CCAPM0=PWM0;                        //使能PCA模块0PWM功能
  6.         PCA_PWM0=0xc0;                        //设置PCA模块0输出10位PWM
  7.         CCAPM1=PWM1;                        //使能PCA模块1PWM功能
  8.         PCA_PWM1=0xc0;                        //设置PCA模块1输出10位PWM
  9.         CCAPM2=PWM2;                        //使能PCA模块2PWM功能
  10.         PCA_PWM2=0xc0;                        //设置PCA模块2输出10位PWM
  11.         CR=1;                                        //启动PCA
  12.         
  13.         EA=1;                                        //使能总中断
复制代码
DebugLab
回复 支持 反对

使用道具 举报 送花

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

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2025-4-1 14:27:58 | 显示全部楼层
STC8G1K08-8PIN没有PCA,要STC8G1K08A-8PIN才有PCA。
STC8G1K08系列16脚或以上的型号均带PCA。

或者说,STC8G系列,除了STC8G1K08-8PIN没有PCA,其余型号均有PCA。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-02 14:39:27
已绑定手机

3

主题

11

回帖

43

积分

新手上路

积分
43
发表于 2025-4-1 15:13:25 | 显示全部楼层
梁*** 发表于 2025-4-1 14:27
STC8G1K08-8PIN没有PCA,要STC8G1K08A-8PIN才有PCA。
STC8G1K08系列16脚或以上的型号均带PCA。

我得问题,芯片型号STC8G1K08A-36I-SOP8

点评

你的主贴说的是STC8G1K08,没有带A,所以我被误判。 请下载附件,解压缩。 请先别修改程序, 直接下载"01A-STC8G1K08A-8PIN-PCA-3路PWM-C语言"里的"PCA.hex"测试,并告知测试结果。 3路PCA都配置成PWM的应用. 本例  详情 回复 发表于 2025-4-1 16:22
回复 支持 反对

使用道具 举报 送花

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

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2025-4-1 16:22:24 | 显示全部楼层
轩辕*** 发表于 2025-4-1 15:13
我得问题,芯片型号STC8G1K08A-36I-SOP8

你的主贴说的是STC8G1K08,没有带A,所以我被误判。

请下载附件,解压缩。

请先别修改程序, 直接下载"01A-STC8G1K08A-8PIN-PCA-3路PWM-C语言"里的"PCA.hex"测试,并告知测试结果。
3路PCA都配置成PWM的应用.

本例 PWM0-->P3.2, PWM1-->P3.3, PWM2-->P5.4, 用户可以自行修改切换到其它端口。示波器观察波形。



STC8G系列-PCA相关程序.rar (309.7 KB, 下载次数: 2)

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:19 , Processed in 0.300289 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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