找回密码
 立即注册
查看: 119|回复: 8

STC8H1K28,PWM8_3怎么配置?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-29 20:55:56
已绑定手机

2

主题

2

回帖

14

积分

新手上路

积分
14
发表于 2026-5-15 18:17:16 | 显示全部楼层 |阅读模式
  1. void PWM_Init(void)
  2. {
  3.     // 扩展寄存器
  4.     P_SW2 |= 0x80;  
  5.    
  6.     P0M0 |= 0x08;  // P0.3 设为推挽
  7.     P0M1 &= ~0x08;
  8.     P1M0 |= 0x40;  // P1.6 设为推挽
  9.     P1M1 &= ~0x40;
  10.         
  11.     // ========== PWMA配置 (P1.6, 通道4P) ==========
  12.     PWMA_CCMR2 = 0x68;        // PWM模式1
  13.     PWMA_PSCRH = 0x00;
  14.     PWMA_PSCRL = 23;          // 24MHz / (23+1) = 1MHz (1us每计数)
  15.     PWMA_ARRH = 0x4E;         
  16.     PWMA_ARRL = 0x20;         // 设为20000,精准对应20ms周期
  17.     PWMA_CCR4H = 0x05;        // 1.5ms (1500us) 中位
  18.     PWMA_CCR4L = 0xDC;
  19.     PWMA_CCER2 = 0x01;        // CC4E=1, 使能通道4输出
  20.     PWMA_ENO = 0x40;          // ENO4P=1, 使能P1.6物理引脚输出
  21.     PWMA_BKR = 0x80;          // MOE=1, 主输出使能
  22.     PWMA_CR1 = 0x81;          // 启动计数器
  23.    
  24.     // ========== PWMB配置 (P0.3, 通道8_3) ==========
  25.     // 选择PWM8的第3组映射(PWM8_3)输出到P0.3
  26.     PWMB_PS &= ~0xC0;         // 清除bit7-6
  27.     PWMB_PS |= 0x80;          // 设置C8PS=10 (对应第3组映射)
  28.    
  29.     PWMB_CCMR4 = 0x68;        // 通道8配置为PWM模式1
  30.     PWMB_PSCRH = 0x00;
  31.     PWMB_PSCRL = 23;          // 1MHz 计数频率
  32.     PWMB_ARRH = 0x4E;
  33.     PWMB_ARRL = 0x20;         // 20ms 周期
  34.     PWMB_CCR8H = 0x05;        // 1.5ms 中位
  35.     PWMB_CCR8L = 0xDC;
  36.    
  37.     PWMB_CCER2 = 0x01;        // CC8E=1, 使能通道8输出
  38.     PWMB_ENO = 0x80;          // ENO8P=1, 使能P0.3物理引脚输出
  39.     PWMB_BKR = 0x80;          // MOE=1
  40.     PWMB_CR1 = 0x81;          // 启动计数器
  41. }
  42. // ========== 舵机控制函数 ==========
  43. void Servo1_SetAngle(unsigned char angle)  // 舵机1: P0.3 (PWMB通道8)
  44. {
  45.     unsigned int pulse;
  46.     if (angle > 180) angle = 180;
  47.     // 脉宽: 500us ~ 2500us, 步长 = (2500-500)/180 ≈ 11.11
  48.     pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
  49.     PWMB_CCR8H = (unsigned char)(pulse >> 8);
  50.     PWMB_CCR8L = (unsigned char)(pulse & 0xFF);
  51. }
  52. void Servo2_SetAngle(unsigned char angle)  // 舵机2: P1.6 (PWMA通道4)
  53. {
  54.     unsigned int pulse;
  55.     if (angle > 180) angle = 180;
  56.     pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
  57.     PWMA_CCR4H = (unsigned char)(pulse >> 8);
  58.     PWMA_CCR4L = (unsigned char)(pulse & 0xFF);
  59. }
复制代码

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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-6-5 15:34:38 | 显示全部楼层
STC8H1K28,PWM8_3怎么配置



截图202606051532054353.jpg

截图202606051532426249.jpg

截图202606051533193156.jpg

截图202606051533389640.jpg

截图202606051534342378.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-29 20:55:56
已绑定手机

2

主题

2

回帖

14

积分

新手上路

积分
14
发表于 2026-5-15 21:38:15 | 显示全部楼层
尝试了其他通道,PWMA全部都能工作,PWMB全部都不能工作,应该是PWMB操作不对,请老师指点一下
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-5-15 22:43:54 | 显示全部楼层

截图202605152241186262.jpg

截图202605152240577001.jpg


截图202605152242541030.jpg

截图202605152243174120.jpg

截图202605152243507543.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2026-5-15 22:45:08 | 显示全部楼层
尝试用 AiCube 来图形化配置,选择 STC8H8K64U-LQFP64

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


截图202605152245515861.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-05-29 20:55:56
已绑定手机

2

主题

2

回帖

14

积分

新手上路

积分
14
发表于 2026-5-29 20:55:56 | 显示全部楼层
没搞定,寄存器配置看起来都是对的,
放弃pwmb,已经全部使用PWMA了
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-06-05 15:06:13

0

主题

3

回帖

8

积分

新手上路

积分
8
发表于 2026-6-5 15:06:13 | 显示全部楼层
我也遇到了一样的问题,P0.3口PWMB的8通道无输出
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-06-05 15:06:13

0

主题

3

回帖

8

积分

新手上路

积分
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 [7:6] 为 C4PS,设置为 00 映射到 P1.6(PWM4P)/P1.7(PWM4N)
    PWMA_PS &= ~0xC0;
   
    // PWMB_PS [7:6] 为 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完全释放,可在此处理其他业务
    }
}
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-06-05 15:06:13

0

主题

3

回帖

8

积分

新手上路

积分
8
发表于 2026-6-5 21:58:36 | 显示全部楼层
关键点:CCMR的值应当设置成0x60而不是0x68

PWMA_CCMR4 = 0x60;

PWMB_CCMR4 = 0x60;
这样改就OK了
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 09:48 , Processed in 0.077353 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表