STC15W4K56S4使用pwm6点亮指示灯无输出
我这边使用pwm6驱动凯普林激光模块(K808FANCC-30.00WYIY)指示灯时发现无法单独点亮指示灯,麻烦帮忙排查下问题,使用电平拉高拉低确定是可以正常驱动指示灯的#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
void pwmInit() //PCA模块操作输出
{
P1_0 = 0;
P1_1 = 0;
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC;
CCON = 0x00; //控制寄存器设置
//CMOD = 0x02; //PCA时钟为系统时钟 2分频
CMOD = 0x0E; //PCA时钟为系统时钟 8分频
CL = 0x00; //计数器清零
CH = 0x00;
CCAPM0 = 0x00; //PCA模块0为PWM工作模式
PCA_PWM0 =0x00; //0x80; //PCA模块0输出6位PWM
CCAP0L = 0x00; //PWM占空比为50%[(40H-20H)/40H]
CCAP0H = 0x00;
CCAPM1 = 0x42; //PCA模块1为PWM工作模式
PCA_PWM1 =0x00; //0x40; //PCA模块1输出7位PWM
CCAP1L = 0x00; //PWM占空比为75%[(80H-20H)/80H]
CCAP1H = 0x00;
CR = 1; //PCA定时器开始工作
}
sbit P1_0=P1^0; // 蜂鸣器
sbit P1_1=P1^1; // TEC
#define CYCLE 0x1000L //定义PWM周期(最大值为32767)
sbit PWM2 = P3^7; // 风扇
sbit PWM3 = P2^1;
sbit PWM4 = P2^2;
sbit PWM5 = P2^3; // 808激光
sbit PWM6 = P1^6; // 光纤指示灯
sbit PWM7 = P1^7; // 灯带
/******************************/
//8A系列增强型PWM
/******************************/
void PWM_kuo_zan_init() //特殊功能PWM直接操作输出
{
P1M0 &= ~0x40;
P1M1 &= ~0x40;
P1 &= ~0x40; //设置P1.6/.P1.7电平
P2M0 &= ~0x0e;
P2M1 &= ~0x0e;
P2 &= ~0x0e; //设置P2.1/P2.2/P2.3电平
P3M0 &= ~0x80;
P3M1 &= ~0x80;
P3 &= ~0x80; //设置P3.7电平
P_SW2 |= 0x80;
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x00; //选择PWM的时钟为Fosc/(0+1)
PWMCKS = 0x08; // PWM时钟为系统时钟
PWMC = 0xff; //设置PWM周期为ffH个PWM时钟
/*PWM0T1= 0x0100; //在计数值为100H地方输出低电平
PWM0T2= 0x0500; //在计数值为500H地方输出高电平
PWM0CR= 0x00; //使能PWM0输出
PWM1T1= 0x0100;
PWM1T2= 0x0171;
PWM1CR= 0x00; */
PWM2T1= 1;
PWM2T2= 0;
PWM2CR= 0x00; //PWM2输出到P3.7
PWM3T1= 1;
PWM3T2= 0;
PWM3CR= 0x00; //PWM3输出到P2.1
PWM4T1= 1;
PWM4T2= 0;
PWM4CR = 0x00; //PWM4输出到P2.2
PWM5T1= 1;
PWM5T2= 0;
PWM5CR = 0x00; //PWM5输出到P2.3
// PWM6T1= 1;
// PWM6T2= 0;
// PWM6CR = 0x00; //PWM6输出到P1.6
PWM7T1= 1;
PWM7T2= 0;
PWM7CR = 0x00; //PWM7输出到P0.7
PWMCFG = 0x00; //配置PWM的输出初始电平
PWMCR = 0x3f; //使能PWM信号输出
PWMCR |= 0x80; //使能PWM模块
P_SW2&= ~0x80;
}
//指示灯模拟pwm6(这种方式能点亮)
uchar Timer_cnt_sim0 = 0;
void pwm6_i(uchar pwm_i)
{
PWMCR &= ~0x10; //使用pwm6这部分完全删掉了的
if(pwm_i != 0){
if(Timer_cnt_sim0 > pwm_i) PWM6=0;
else PWM6=1;
}else PWM6=0;
}
void pwm6(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x10;
PWM6 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x10;
PWM6 = 1;
}
else
{
P_SW2 |= 0x80;
PWM6T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x10;
}
}
// IO初始化部分
void IO_init()
{
P0M0 = 0xf1; //设置P0.0~P0.7为双向口模式
P0M1 = 0x00;
P1M0 = 0x03; //设置P1.0~P1.7为推挽模式
P1M1 = 0x04;
P2M0 = 0xff; //设置P2.0~P2.7为高阻输入模式
P2M1 = 0x00;
P3M0 = 0x00; //设置P3.5e~P3.7为推挽输出模式
P3M1 = 0x00;
P4M0 = 0x00; //设置P4.1P4.2为推挽输出模式
P4M1 = 0x00;
P5M0 = 0x00; //设置P5.0~P5.7为双向口模式
P5M1 = 0x00;
}
我这边确定使用模拟的pwm能正常驱动模块,使用pwm6去驱动模块出现点不亮的问题,请问这个是为什么? 为什么都是1和0
DebugLab 发表于 2025-12-29 15:13
为什么都是1和0
参考的是软件上的配置方法
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"
#define CYCLE 0x1000L //定义PWM周期(最大值为32767)
#define PWMC (*(unsigned intvolatile xdata *)0xfff0)
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1 (*(unsigned intvolatile xdata *)0xff00)
#define PWM2T1H (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2 (*(unsigned intvolatile xdata *)0xff02)
#define PWM2T2H (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1 (*(unsigned intvolatile xdata *)0xff10)
#define PWM3T1H (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2 (*(unsigned intvolatile xdata *)0xff12)
#define PWM3T2H (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1 (*(unsigned intvolatile xdata *)0xff20)
#define PWM4T1H (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2 (*(unsigned intvolatile xdata *)0xff22)
#define PWM4T2H (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1 (*(unsigned intvolatile xdata *)0xff30)
#define PWM5T1H (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2 (*(unsigned intvolatile xdata *)0xff32)
#define PWM5T2H (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1 (*(unsigned intvolatile xdata *)0xff40)
#define PWM6T1H (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2 (*(unsigned intvolatile xdata *)0xff42)
#define PWM6T2H (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1 (*(unsigned intvolatile xdata *)0xff50)
#define PWM7T1H (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2 (*(unsigned intvolatile xdata *)0xff52)
#define PWM7T2H (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR (*(unsigned char volatile xdata *)0xff54)
sfr P_SW2 = 0xba;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr PWMCFG= 0xf1;
sfr PWMCR = 0xf5;
sfr PWMIF = 0xf6;
sfr PWMFDCR = 0xf7;
sbit PWM2 = P3^7;
sbit PWM3 = P2^1;
sbit PWM4 = P2^2;
sbit PWM5 = P2^3;
sbit PWM6 = P0^7;
sbit PWM7 = P0^6;
void PWM_config(void);
void PWM2_SetPwmWide(unsigned short Wide);
void PWM3_SetPwmWide(unsigned short Wide);
void PWM4_SetPwmWide(unsigned short Wide);
void PWM5_SetPwmWide(unsigned short Wide);
void PWM6_SetPwmWide(unsigned short Wide);
void PWM7_SetPwmWide(unsigned short Wide);
void main()
{
PWM_config();
PWM2_SetPwmWide(0); //输出全低电平
PWM3_SetPwmWide(1); //输出1/2550高电平
PWM4_SetPwmWide(CYCLE); //输出全高电平
PWM5_SetPwmWide(CYCLE-1); //输出2549/2550低电平
PWM6_SetPwmWide(CYCLE/2); //输出1/2高电平
PWM7_SetPwmWide(CYCLE/3); //输出1/3高电平
while (1);
}
void PWM_config(void)
{
P0M0 &= ~0xc0;
P0M1 &= ~0xc0;
P0 &= ~0xc0; //设置P0.6/.P0.7电平
P2M0 &= ~0x0e;
P2M1 &= ~0x0e;
P2 &= ~0x0e; //设置P2.1/P2.2/P2.3电平
P3M0 &= ~0x80;
P3M1 &= ~0x80;
P3 &= ~0x80; //设置P3.7电平
P_SW2 |= 0x80;
PWMCKS = 0x00;
PWMC = CYCLE; //设置PWM周期
PWM2T1 = 1;
PWM2T2 = 0;
PWM2CR = 0x00; //PWM2输出到P3.7
PWM3T1 = 1;
PWM3T2 = 0;
PWM3CR = 0x00; //PWM3输出到P2.1
PWM4T1 = 1;
PWM4T2 = 0;
PWM4CR = 0x00; //PWM4输出到P2.2
PWM5T1 = 1;
PWM5T2 = 0;
PWM5CR = 0x00; //PWM5输出到P2.3
PWM6T1 = 1;
PWM6T2 = 0;
PWM6CR = 0x08; //PWM6输出到P0.7
PWM7T1 = 1;
PWM7T2 = 0;
PWM7CR = 0x08; //PWM7输出到P0.6
PWMCFG = 0x00; //配置PWM的输出初始电平
PWMCR = 0x3f; //使能PWM信号输出
PWMCR |= 0x80; //使能PWM模块
P_SW2 &= ~0x80;
}
void PWM2_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x01;
PWM2 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x01;
PWM2 = 1;
}
else
{
P_SW2 |= 0x80;
PWM2T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x01;
}
}
void PWM3_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x02;
PWM3 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x02;
PWM3 = 1;
}
else
{
P_SW2 |= 0x80;
PWM3T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x02;
}
}
void PWM4_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x04;
PWM4 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x04;
PWM4 = 1;
}
else
{
P_SW2 |= 0x80;
PWM4T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x04;
}
}
void PWM5_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x08;
PWM5 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x08;
PWM5 = 1;
}
else
{
P_SW2 |= 0x80;
PWM5T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x08;
}
}
void PWM6_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x10;
PWM6 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x10;
PWM6 = 1;
}
else
{
P_SW2 |= 0x80;
PWM6T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x10;
}
}
void PWM7_SetPwmWide(unsigned short Wide)
{
if (Wide == 0)
{
PWMCR &= ~0x20;
PWM7 = 0;
}
else if (Wide == CYCLE)
{
PWMCR &= ~0x20;
PWM7 = 1;
}
else
{
P_SW2 |= 0x80;
PWM7T1 = Wide;
P_SW2 &= ~0x80;
PWMCR |= 0x20;
}
}
这个是这个软件上的例程 void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
今晚打老虎 发表于 2025-12-29 15:24
参考的是软件上的配置方法
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
噢,有PWM6_SetPwmWide函数设置占空比
初始化P_SW2|=0x80打开EAXFR,后面不要再关闭
初始化PWM输出IO都设置为推挽模式
DebugLab 发表于 2025-12-29 17:15
噢,有PWM6_SetPwmWide函数设置占空比
初始化P_SW2|=0x80打开EAXFR,后面不要再关闭
初始化PWM输出IO都 ...
为什么这段初始化后关闭这个寄存器?
PWMCFG = 0x00; //配置PWM的输出初始电平
PWMCR = 0x3f; //使能PWM信号输出
PWMCR |= 0x80; //使能PWM模块
P_SW2&= ~0x80;
就是那个增强型pwm初始化的地方?为什么这个对pwm6有影响,对于pwm7没看到有影响? 今晚打老虎 发表于 2025-12-30 09:38
为什么这段初始化后关闭这个寄存器?
PWMCFG = 0x00; //配置PWM的输出初始电平
PWMCR...
EAXFR初始化时先打开,不需要再关闭
新手必读:
https://www.stcaimcu.com/thread-16535-1-1.html DebugLab 发表于 2025-12-30 09:56
EAXFR初始化时先打开,不需要再关闭
新手必读:
https://www.stcaimcu.com/thread-16535-1-1.html ...
这个文章的意思是注释掉最后关闭pwm的那段代码?
PWM7T1= 1;
PWM7T2= 0;
PWM7CR = 0x00; //PWM7输出到P0.7
PWMCFG = 0x00; //配置PWM的输出初始电平
PWMCR = 0x3f; //使能PWM信号输出
PWMCR |= 0x80; //使能PWM模块
//P_SW2&= ~0x80;
还是添加EAXFR=1?这个是stc15w4k56s4的单片机