qzkrswbm 发表于 2026-5-15 18:17:16

STC8H1K28,PWM8_3怎么配置?



void PWM_Init(void)
{
    // 扩展寄存器
    P_SW2 |= 0x80;
   
    P0M0 |= 0x08;// P0.3 设为推挽
    P0M1 &= ~0x08;
    P1M0 |= 0x40;// P1.6 设为推挽
    P1M1 &= ~0x40;
      
    // ========== PWMA配置 (P1.6, 通道4P) ==========
    PWMA_CCMR2 = 0x68;      // PWM模式1
    PWMA_PSCRH = 0x00;
    PWMA_PSCRL = 23;          // 24MHz / (23+1) = 1MHz (1us每计数)
    PWMA_ARRH = 0x4E;         
    PWMA_ARRL = 0x20;         // 设为20000,精准对应20ms周期
    PWMA_CCR4H = 0x05;      // 1.5ms (1500us) 中位
    PWMA_CCR4L = 0xDC;
    PWMA_CCER2 = 0x01;      // CC4E=1, 使能通道4输出
    PWMA_ENO = 0x40;          // ENO4P=1, 使能P1.6物理引脚输出
    PWMA_BKR = 0x80;          // MOE=1, 主输出使能
    PWMA_CR1 = 0x81;          // 启动计数器
   
    // ========== PWMB配置 (P0.3, 通道8_3) ==========
    // 选择PWM8的第3组映射(PWM8_3)输出到P0.3
    PWMB_PS &= ~0xC0;         // 清除bit7-6
    PWMB_PS |= 0x80;          // 设置C8PS=10 (对应第3组映射)
   
    PWMB_CCMR4 = 0x68;      // 通道8配置为PWM模式1
    PWMB_PSCRH = 0x00;
    PWMB_PSCRL = 23;          // 1MHz 计数频率
    PWMB_ARRH = 0x4E;
    PWMB_ARRL = 0x20;         // 20ms 周期
    PWMB_CCR8H = 0x05;      // 1.5ms 中位
    PWMB_CCR8L = 0xDC;
   
    PWMB_CCER2 = 0x01;      // CC8E=1, 使能通道8输出
    PWMB_ENO = 0x80;          // ENO8P=1, 使能P0.3物理引脚输出
    PWMB_BKR = 0x80;          // MOE=1
    PWMB_CR1 = 0x81;          // 启动计数器
}



// ========== 舵机控制函数 ==========
void Servo1_SetAngle(unsigned char angle)// 舵机1: P0.3 (PWMB通道8)
{
    unsigned int pulse;
    if (angle > 180) angle = 180;
    // 脉宽: 500us ~ 2500us, 步长 = (2500-500)/180 ≈ 11.11
    pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
    PWMB_CCR8H = (unsigned char)(pulse >> 8);
    PWMB_CCR8L = (unsigned char)(pulse & 0xFF);
}

void Servo2_SetAngle(unsigned char angle)// 舵机2: P1.6 (PWMA通道4)
{
    unsigned int pulse;
    if (angle > 180) angle = 180;
    pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
    PWMA_CCR4H = (unsigned char)(pulse >> 8);
    PWMA_CCR4L = (unsigned char)(pulse & 0xFF);
}

舵机2,P1.6 (PWMA通道4) OK
舵机1,P0.3 (PWMB通道8) 舵机没反应

神农鼎 发表于 2026-6-5 15:34:38

STC8H1K28,PWM8_3怎么配置












qzkrswbm 发表于 2026-5-15 21:38:15

尝试了其他通道,PWMA全部都能工作,PWMB全部都不能工作,应该是PWMB操作不对,请老师指点一下{:4_197:}

神农鼎 发表于 2026-5-15 22:43:54












神农鼎 发表于 2026-5-15 22:45:08

尝试用 AiCube 来图形化配置,选择 STC8H8K64U-LQFP64

https://www.stcaimcu.com/thread-19632-1-1.html



qzkrswbm 发表于 2026-5-29 20:55:56

没搞定,寄存器配置看起来都是对的,
放弃pwmb,已经全部使用PWMA了{:4_187:}

李迎春 发表于 2026-6-5 15:06:13

我也遇到了一样的问题,P0.3口PWMB的8通道无输出

李迎春 发表于 2026-6-5 21:23:31

#include <stc8h.h>

// 定义快捷类型
typedef unsigned int uint;
typedef unsigned char uchar;

void PWM_Init(void)
{
    // ==========================================
    // 0. 开启 XSFR 寄存器访问权限 (必须)
    // ==========================================
    P_SW2 |= 0x80;

    // ==========================================
    // 1. 配置 I/O 口模式(STC8H 高阻输入需配置为推挽或准双向)
    // ==========================================
    // P0.3 配置为推挽输出
    P0M1 &= ~0x08; P0M0 |= 0x08;
    // P1.6 配置为推挽输出
    P1M1 &= ~0x40; P1M0 |= 0x40;

    // ==========================================
    // 2. 引脚切换映射 (Pin Switch)
    // ==========================================
    // PWMA_PS 为 C4PS,设置为 00 映射到 P1.6(PWM4P)/P1.7(PWM4N)
    PWMA_PS &= ~0xC0;
   
    // PWMB_PS 为 C8PS,设置为 10 映射到 P0.3(PWM8)
    PWMB_PS &= ~0xC0;
    PWMB_PS |= 0x80;

    // ==========================================
    // 3. 配置 PWMA 通道 4 (控制 P1.6)
    // ==========================================
    PWMA_PSCRH = 0;       // 时钟不分频 (1T)
    PWMA_PSCRL = 0;
   
    PWMA_ARRH = (uchar)(2211 >> 8); // 设置周期 (5kHz)
    PWMA_ARRL = (uchar)(2211);
   
    PWMA_CCR4H = (uchar)(1106 >> 8); // 设置占空比 (50%)
    PWMA_CCR4L = (uchar)(1106);

    PWMA_CCMR4 = 0x60;    // 配置通道 4 为 PWM 模式 1
    PWMA_CCER2 = 0x10;    // 开启通道 4 正向输出 (CC4E = 1)
    PWMA_ENO |= 0x40;   // 使能 PWM4P 端口输出
    PWMA_BKR = 0x80;      // 主输出使能 (MOE = 1)
    PWMA_CR1 = 0x01;      // 启动 PWMA 计数器

    // ==========================================
    // 4. 配置 PWMB 通道 8 (控制 P0.3)
    // ==========================================
    PWMB_PSCRH = 0;       // 时钟不分频 (1T)
    PWMB_PSCRL = 0;
   
    PWMB_ARRH = (uchar)(2211 >> 8); // 设置周期 (5kHz)
    PWMB_ARRL = (uchar)(2211);
   
    PWMB_CCR8H = (uchar)(1106 >> 8); // 设置占空比 (50%)
    PWMB_CCR8L = (uchar)(1106);

    PWMB_CCMR4 = 0x60;    // 配置通道 8 为 PWM 模式 1
    PWMB_CCER2 = 0x10;    // 开启通道 8 正向输出 (CC8E = 1)
    PWMB_ENO |= 0x40;   // 使能 PWM8 端口输出
    PWMB_BKR = 0x80;      // 主输出使能 (MOE = 1)
    PWMB_CR1 = 0x01;      // 启动 PWMB 计数器

    // 关闭 XSFR 访问权限(保持安全习惯)
    P_SW2 &= ~0x80;
}

void main(void)
{
    PWM_Init(); // 初始化并启动硬件PWM

    while (1)
    {
      // 硬件自动输出,CPU完全释放,可在此处理其他业务
    }
}

李迎春 发表于 2026-6-5 21:58:36

关键点:CCMR的值应当设置成0x60而不是0x68

PWMA_CCMR4 = 0x60;

PWMB_CCMR4 = 0x60;
这样改就OK了
页: [1]
查看完整版本: STC8H1K28,PWM8_3怎么配置?