找回密码
 立即注册
查看: 83|回复: 0

求助帖,stc8h1k08输出PWM控制舵机

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-08 14:53:43
已绑定手机

2

主题

0

回帖

18

积分

新手上路

积分
18
发表于 2026-2-8 14:53:43 | 显示全部楼层 |阅读模式
如题,这是我根据例程写的代码,不知道哪里有问题,init可以输出P脉宽1500波形,但是我的调用函数 Servo_SetPulse(unsigned int us)不生效,不能刷新脉宽


void Servo_Init(void)
{
    P_SW2 |= 0x80;  // 使能 PWMA 寄存器映射
   
    PWMA_ENO = 0x00;
    PWMA_ENO |= 0x40;  // 使能 PWM4P 输出
    PWMA_PS = 0x00;
    PWMA_PS |= 0xC0;   // PWM4P 引脚选择
   
    PWMA_PSCRH = 0x00;
    PWMA_PSCRL = 11;   // 12分频 → 1MHz → 1 tick = 1us
   
    PWMA_ARR = 20000;  // 20ms 周期
   
    // 先配置CCMR4,再设置CCR4
    PWMA_CCER2 = 0x00;  // 关闭通道4
   
    // 修改为0x68,禁用CCR4预装载(OC4PE=0)
    PWMA_CCMR4 = 0x68;  // PWM模式1,禁用预装载
    // 或者使用0x60,但需要设置EGR
   
    PWMA_CCR4 = 1500;   // 默认中位
   
    PWMA_CCER2 = 0x10;  // 使能通道4
    PWMA_BKR = 0x80;    // 主输出使能
    PWMA_CR1 |= 0x01;   // 启动计数器
}

// 如果使用方法2,Servo_SetPulse可以保持不变
void Servo_SetPulse(unsigned int us)
{
    if(us < 1000) us = 1000;
    if(us > 2000) us = 2000;
    PWMA_CCR4 = us;  // 直接更新,立即生效
}

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-2 21:14 , Processed in 0.096876 second(s), 43 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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