ruifantech 发表于 2025-12-5 08:35:24

STC8h4K64TL LQFP64 pwm输出问题 急

stc8h4k64tl lqfp48封装 现在想在第8脚即P1.4脚输出25k频率 占空比45% ,波形 ,初始化如下,但是输出io电平为0,帮忙分析下 急


// PWM硬件初始化
void PWM_Init_Adjustable(void) {
    // 1. 使能扩展寄存器访问
    P_SW2 |= 0x80;
   
    // 2. 配置P1.4为PWM3P输出
    P1M1 &= ~0x10;
    P1M0 |= 0x10;
    PWMA_PS &= ~0x30;      // PWM3映射到P1.4
   
    // 3. 配置PWM通道3
          PWMA_CCER1=0;
    PWMA_CCER1 &= 0xF0;    // 清零通道3配置
    PWMA_CCMR3 = 0x60;   // PWM模式1,预装载使能
    PWMA_CCER1 |= 0x02;    // 使能通道3输出
   
    // 4. 设置PWM周期(25kHz @ 11.0592MHz)
    PWMA_PSCRH = 0;
    PWMA_PSCRL = 0;
    PWMA_ARRH = (PWM_ARR_VALUE >> 8) & 0xFF;
    PWMA_ARRL = PWM_ARR_VALUE & 0xFF;
   
    // 5. 设置初始占空比
    PWM_Set_Duty(PWM_DEFAULT_CCR);
   
    // 6. 使能输出
    PWMA_BKR = 0x80;       // 主输出使能
//    PWMA_ENO |= 0x08;      // 使能PWM3P输出
                PWMA_ENO |= 0x10;      // 使能PWM3P输出
    PWMA_CR1 = 0x01;       // 启动计数器
}

// 设置占空比函数(核心函数)
void PWM_Set_Duty(unsigned short ccr_value) {
    // 限制CCR值在有效范围内
    if(ccr_value < PWM_MIN_CCR) ccr_value = PWM_MIN_CCR;
    if(ccr_value > PWM_MAX_CCR) ccr_value = PWM_MAX_CCR;
   
    // 更新PWM比较值(通道3)
    PWMA_CCR3H = (ccr_value >> 8) & 0xFF;
    PWMA_CCR3L = ccr_value & 0xFF;
}

神农鼎 发表于 2025-12-5 08:56:33

用 AiCube-ISP 图形化配置 PWM, 选择型号 STC8H8K64U,
另外 I/O 输出设置成 强推挽 或者 准双向口,
否则 上电复位后是 高阻输入,无法输出

乘风飞扬 发表于 2025-12-5 09:00:06

第3步这个寄存器设置错了,通道3使能在PWMA_CCER2,不是PWMA_CCER1:
PWMA_CCER1 |= 0x02;    // 使能通道3输出

梁工 发表于 2025-12-5 10:31:48

电话里我都说了,拿一个我的例子去掉3个通道就OK了:
先别修改程序, 直接下载"01A-PWMA-4对互补PWM输出P1口"里的"pwm.hex"测试, 下载时输入主频25.6MHz,别的主频输出PWM频率按比例变化,按你的要求,程序改为仅从P1.4输出25KHz、45%的占空比的PWM。
下载到STC8H4K64TL运行实测输出波形照片,可见输出的PWM周期是5*8=40us即25KHz,高电平18us即45%。


源码和编译好的HEX文件:


ruifantech 发表于 2025-12-5 11:09:02

已经可以实现PWM输出了感谢STC 技术支持!
页: [1]
查看完整版本: STC8h4K64TL LQFP64 pwm输出问题 急