8G1K08单片机的PCA模块P33管脚一直输出高
为什么我这样配置的时候,PCA模块PWM1一直有输出#include "pca.h"void PCA_Init_Config(void)
{
//设置CCP1管脚为P33,即将P_SW1设置为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;
}求大佬指点一下
针对您在使用STC8G1K08单片机时遇到的PCA模块P33管脚一直输出高电平的问题,以下是对您提供的代码配置的分析及可能的解决方案。
1. 代码配置分析
您提供的代码配置如下:
c
void PCAInitConfig(void)
{
// 设置CCP1管脚为P33,即将PSW1设置为00
PSW1 &= ~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;
}
2. 可能的原因及解决方案
2.1 PCA计数器未启动
在您的代码中,CR寄存器被设置为0,这意味着PCA计数器未启动。PCA计数器未启动时,PWM输出将保持默认状态,通常是高电平。
解决方案:
在配置完成后,启动PCA计数器。将CR寄存器设置为1。
c
CR = 1; // 启动PCA计数器
2.2 管脚配置问题
您已经通过PSW1 &= ~0x30;将CCP1管脚配置为P33,但需要确保P33管脚未被其他功能占用或配置为输入模式。
解决方案:
确保P33管脚配置为输出模式,并且未被其他功能占用。
c
P3M1 &= ~0x08; // 设置P33为推挽输出模式
P3M0 |= 0x08;
2.3 PWM模式配置
您已经将CCAPM1寄存器配置为0x42,表示使能PWM0并设置为8位PWM模式。但需要确保CCAP1L和CCAP1H的值正确。
解决方案:
确保CCAP1L和CCAP1H的值相同,并且根据需求调整占空比。
c
CCAP1L = 0x80; // 初始占空比50%(0x80对应8位中间值)
CCAP1H = 0x80; // 必须写入相同值
2.4 时钟源配置
您已经将CMOD寄存器配置为0x08,表示PCA时钟源为系统时钟。确保系统时钟配置正确,并且PCA模块能够正常工作。
解决方案:
检查系统时钟配置,确保PCA模块能够正常工作。
3. 完整代码示例
以下是修正后的完整代码示例:
c
void PCAInitConfig(void)
{
// 设置CCP1管脚为P33,即将PSW1设置为00
PSW1 &= ~0x30;
// 设置P33为推挽输出模式
P3M1 &= ~0x08;
P3M0 |= 0x08;
// 关闭PCA计数器
CCON = 0x00;
// PCA时钟源=系统时钟,禁止溢出中断
CMOD = 0x08;
// PCA计数器低8位清零
CL = 0x00;
// PCA计数器高8位清零
CH = 0x00;
// 配置PCA0为8位PWM模式
CCAPM1 = 0x42; // 使能PWM0,模式为8位PWM
CCAP1L = 0x80; // 初始占空比50%(0x80对应8位中间值)
CCAP1H = 0x80; // 必须写入相同值
// 启动PCA计数器
CR = 1;
}
4. 总结
通过以上分析和修正,您应该能够解决PCA模块P33管脚一直输出高电平的问题。确保PCA计数器启动、管脚配置正确、PWM模式配置正确以及时钟源配置正确是关键。希望这些建议对您有所帮助。
[本文内容由国芯人工智能辅助生成,仅供参考] 国芯人工智能 发表于 2025-4-1 11:23
针对您在使用STC8G1K08单片机时遇到的PCA模块P33管脚一直输出高电平的问题,以下是对您提供的代码配置的分 ...
将CR置,还是一直是高电平 首先需要确定的是,STC8G1K08并没有PCA功能,仅STC8G1K08A拥有PCA功能
STC8G1K08-38I-SOP16 有 PCA;
STC8G1K08-38I-TSSOP20 有 PCA;
王昱顺 发表于 2025-4-1 12:44
首先需要确定的是,STC8G1K08并没有PCA功能,仅STC8G1K08A拥有PCA功能
看手册上STC8G1K08A-36I-SOP8有PAC功能的 8G1K08A PCA输出PWM
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{
unsigned char temp_l,temp_h,temp;
temp_l=pwm_0&0x00ff; //读pwm_0低8位赋值给temp_l
temp_h=(pwm_0&0x0300)>>4; //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
temp=PCA_PWM0&0xcd; //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_0==0x03ff) //如果pwm_0最大
temp_h|=0x02; //设置EPC0H(PCA_PWM0)为1
PCA_PWM0=temp_h; //写PCA_PWM0(先写高2位)
CCAP0H=temp_l; //写CCAP0H(再写低8位)
temp_l=pwm_1&0x00ff; //读pwm_1低8位赋值给temp_l
temp_h=(pwm_1&0x0300)>>4; //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1)位置,赋值给temp_h
temp=PCA_PWM1&0xcd; //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_1==0x03ff) //如果pwm_1最大
temp_h|=0x02; //设置EPC1H(PCA_PWM1)为1
PCA_PWM1=temp_h; //写PCA_PWM1(先写高2位)
CCAP1H=temp_l; //写CCAP1H(再写低8位)
temp_l=pwm_2&0x00ff; //读pwm_2低8位赋值给temp_l
temp_h=(pwm_2&0x0300)>>4; //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2)位置,赋值给temp_h
temp=PCA_PWM2&0xcd; //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_2==0x03ff) //如果pwm_2最大
temp_h|=0x02; //设置EPC2H(PCA_PWM2)为1
PCA_PWM2=temp_h; //写PCA_PWM2(先写高2位)
CCAP2H=temp_l; //写CCAP2H(再写低8位)
} CCON=0x00; //设置PCA控制寄存器
CMOD=0x80; //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
CL=0x00; //设置PCA计数器
CH=0x00; //设置PCA计数器
CCAPM0=PWM0; //使能PCA模块0PWM功能
PCA_PWM0=0xc0; //设置PCA模块0输出10位PWM
CCAPM1=PWM1; //使能PCA模块1PWM功能
PCA_PWM1=0xc0; //设置PCA模块1输出10位PWM
CCAPM2=PWM2; //使能PCA模块2PWM功能
PCA_PWM2=0xc0; //设置PCA模块2输出10位PWM
CR=1; //启动PCA
EA=1; //使能总中断 STC8G1K08-8PIN没有PCA,要STC8G1K08A-8PIN才有PCA。
STC8G1K08系列16脚或以上的型号均带PCA。
或者说,STC8G系列,除了STC8G1K08-8PIN没有PCA,其余型号均有PCA。 梁工 发表于 2025-4-1 14:27
STC8G1K08-8PIN没有PCA,要STC8G1K08A-8PIN才有PCA。
STC8G1K08系列16脚或以上的型号均带PCA。
我得问题,芯片型号STC8G1K08A-36I-SOP8 轩辕1989 发表于 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, 用户可以自行修改切换到其它端口。示波器观察波形。
页:
[1]
2