You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于BeagleBone Black的C语言无库控制Tower Pro SG92R舵机故障排查

解决BeagleBone Black通过P9_14控制SG92R舵机无响应问题

核心问题分析与修复步骤

1. 缺失PWM通道导出操作

BeagleBone的sysfs PWM接口需要先导出对应通道才能操作,你的代码直接访问/sys/class/pwm/pwm-0:0,但该路径未导出时不存在。P9_14对应ehrpwm1的A通道,属于pwmchip1下的channel 0,必须先导出该通道。

2. 参数单位错误(关键)

sysfs中PWM的period和duty_cycle单位是纳秒,你的代码定义数值完全不符合舵机要求:

  • 舵机标准周期为20ms = 20000000纳秒,而非20000纳秒
  • 最小占空比1ms = 1000000纳秒,最大2ms = 2000000纳秒

3. 引脚复用配置

P9_14默认不是PWM功能,需先配置引脚复用为PWM模式。

4. 操作顺序与权限问题

  • 必须以root权限运行程序(sysfs文件需root写入权限)
  • 正确操作顺序:导出通道 → 设置周期 → 设置占空比 → 启用PWM,你的代码先启用再设置周期,逻辑错误

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// 修正为纳秒单位
#define PWM_PERIOD 20000000  
#define DUTY_MIN 1000000
#define DUTY_MAX 2000000

void writeToFile(const char* path, const char* value) {
    FILE* file = fopen(path, "w");
    if(file == NULL) {
        perror("Error opening file");
        printf("Path: %s\n", path);
        exit(1);
    }
    fprintf(file, "%s", value);
    fclose(file);
}

int main(){
    // 1. 导出PWM通道(P9_14对应pwmchip1的channel 0)
    writeToFile("/sys/class/pwm/pwmchip1/export", "0");
    
    // 2. 配置引脚复用为PWM模式
    writeToFile("/sys/devices/platform/ocp/ocp:P9_14_pinmux/state", "pwm");
    
    // 3. 先设置周期,再设置占空比,最后启用PWM
    writeToFile("/sys/class/pwm/pwmchip1/pwm0/period", "20000000");
    writeToFile("/sys/class/pwm/pwmchip1/pwm0/enable", "1");
    
    while(1){
        // 左极限位置
        writeToFile("/sys/class/pwm/pwmchip1/pwm0/duty_cycle", "1000000");
        usleep(2000000);

        // 右极限位置
        writeToFile("/sys/class/pwm/pwmchip1/pwm0/duty_cycle", "2000000");
        usleep(2000000);

        // 中间位置
        writeToFile("/sys/class/pwm/pwmchip1/pwm0/duty_cycle", "1500000");
        usleep(2000000);
    }
    
    // 程序正常退出时执行(需添加信号处理触发)
    writeToFile("/sys/class/pwm/pwmchip1/pwm0/enable", "0");
    writeToFile("/sys/class/pwm/pwmchip1/unexport", "0");

    return 0;
}

额外验证步骤

  1. 编译代码:gcc servo.c -o servo
  2. 以root权限运行:sudo ./servo
  3. 若仍无响应,手动验证PWM通道:
    # 导出通道
    echo 0 > /sys/class/pwm/pwmchip1/export
    # 设置周期
    echo 20000000 > /sys/class/pwm/pwmchip1/pwm0/period
    # 设置中间位置占空比
    echo 1500000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
    # 启用PWM
    echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
    
    若手动操作后舵机仍不动,检查接线:
    • 红色线接5V电源(BeagleBone的P9_7或P9_8)
    • 棕色线接GND(P9_1或P9_2)
    • 橙色线接P9_14

内容的提问来源于stack exchange,提问作者Jefferiouscodious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:40:08