标题:
请教各位工程师,为什么我的频率总是设置的不对
[打印本页]
作者:
2625860329
时间:
2025-6-11 15:18
标题:
请教各位工程师,为什么我的频率总是设置的不对
下面是我的基于STC15W408AS的代码,我想要设置 2个 频率为7KHZ,占空比为 50% ,输出相反高低电平方波,烧录后测量,频率确实43Kh,请教各位工程师,指点一下[color=rgba(0, 0, 0, 0.85)]
#include "stc15.h" // 包含STC15系列寄存器定义
#include "intrins.h"
#define FOSC 11059200L // 系统时钟频率
typedef unsigned char BYTE;
typedef unsigned int WORD;
// PCA引脚映射定义(STC15W408AS数据手册)
#define CCP_S0 0x10 // P_SW1.4,选择第二组CCP引脚(P3.4~P3.7)
#define CCP_S1 0x20 // P_SW1.5(未使用,保留为0)
// 引脚定义
sbit PWM1 = P3^5; // CCP0_2,对应PCA模块0
sbit PWM2 = P3^7; // CCP2_2,对应PCA模块2
void PCA_PWM_Init(void); // PCA初始化函数
/********************** 主函数 **********************/
void main() {
// 配置引脚为推挽输出
P3M0 |= 0x84; // P3.5(PWM1)和P3.7(PWM2)设为推挽输出(P3M0.2=1, P3M0.7=1)
P3M1 &= ~0x84; // 清除推挽输出禁止位
// 初始化PCA模块
PCA_PWM_Init();
while (1); // 主循环空转
}
/********************** PCA初始化函数 **********************/
void PCA_PWM_Init(void) {
BYTE duty = 128; // 50%占空比(8位PWM中255为满周期,128为中点)
// 1. 停止PCA计数器
CR = 0;
// 2. 配置PCA引脚映射(选择第二组CCP引脚:P3.5=CCP0_2,P3.7=CCP2_2)
P_SW1 &= ~(CCP_S0 | CCP_S0); // 清除CCP_S0和CCP_S1位
P_SW1 |= CCP_S0; // 设置CCP_S0=1,选择P3.4~P3.7作为CCP引脚
// 3. 配置时钟源为系统时钟/1T(STC15W支持1T模式,需确保AUXR设置正确)
AUXR |= 0x04; // AUXR.CT0=0(定时器0模式),AUXR.ST0=1(定时器0使用1T时钟)
CMOD = 0x09; // CMOD=0b00001001,时钟源为系统时钟/1T(CPS1=1, CPS0=0),禁止PCA定时器溢出中断
// 4. 配置PCA模块0(P3.5)为8位PWM模式
PCA_PWM0 = 0x00; // 8位PWM模式(自动重装,计数器0x00~0xFF)
CCAPM0 = 0x42; // PWM模式,允许模块中断(若需要)
CCAP0H = CCAP0L = duty; // 设置占空比(高电平持续时间)
// 5. 配置PCA模块2(P3.7)为8位PWM模式(互补波形)
PCA_PWM2 = 0x00; // 8位PWM模式
CCAPM2 = 0x42; // PWM模式
CCAP2H = CCAP2L = 255 - duty; // 互补占空比(低电平持续时间与PWM1高电平一致)
// 6. 启动PCA计数器
CR = 1;
}
复制代码
作者:
zsyzdx
时间:
2025-6-11 18:49
是不是7K这个频率不在分频点上,我记得51单片机并不是每个频率都能产生!
作者:
Y_G_G
时间:
2025-6-12 10:08
15W系列没有用过,但我用过STC8H的,它是不能自己设定频率的,只能是系统时钟的几分频而已
估计你只能根据自己要频率,去找一个差不多的时钟频率了
作者:
weisc6955
时间:
2025-7-4 21:18
毛病出在你选的8位,每周期255个脉冲,11.0592M/255=43K 。没毛病。一个简单的办法就是将PCA输入选为T0的溢出脉冲,这样你就可以通过调整T0的定时大范围调整频率了。就是修改PCA第三项,具体看datasheet.
可见这个老片子使用上不如新的STC8H好用。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1