使用 C 的 Beaglebone 黑色 PWM

Gib*_*ian 2 c embedded-linux beagleboneblack

我用 C 语言为 beaglebone black 编写了一个示例 pwm 函数。每当我在其他模块或 main() 中进行函数调用时,我都会遇到分段错误。请帮助我犯错的地方以及如何处理这个问题。下面是代码。

int trigger_pwm_output(unsigned input_no )
{
    FILE *pwm,*duty,*period,*run;``
    uint16_t input=0;
    uint8_t input_no=0,input_state=0;
    unsigned int duty_cycle =500000;
    pwm = fopen("/sys/devices/bone_capemgr.9/slots", "w");
    fseek(pwm,0,SEEK_SET);
    fprintf(pwm,"am33xx_pwm");
    fflush(pwm);



    switch(input_no)
    {
        case 0:

            fprintf(pwm,"bone_pwm_P8_13");
            fflush(pwm);
            period = fopen("/sys/devices/ocp.3/pwm_test_P8_13.15/period", "w");
            fseek(period,0,SEEK_SET);
            fprintf(period,"%d",500000);
            fflush(period);

            duty = fopen("/sys/devices/ocp.3/pwm_test_P8_13.15/duty", "w");
            fseek(duty,0,SEEK_SET);
            run = fopen("/sys/devices/ocp.3/pwm_test_P8_13.15/run", "w");
            fseek(run,0,SEEK_SET);
            fprintf(run,"%d",0);
            fflush(run);

            fseek(run,0,SEEK_SET);
            count++;
                do 
                {
                    duty_cycle += 10;
                    fprintf(duty,"%d",duty_cycle);
                }while(count > 0) || (count < 10));
                fflush(duty);
                fprintf(run,"%d",1);
                fflush(run);

            fclose(pwm);
            fclose(duty);
            fclose(period);
            fclose(run);
            break;
        case 1:
            fprintf(pwm,"bone_pwm_P8_19");
            fflush(pwm);
            period = fopen("/sys/devices/ocp.3/pwm_test_P8_19.16/period", "w");
            fseek(period,0,SEEK_SET);
            fprintf(period,"%d",500000);
            fflush(period);

            duty = fopen("/sys/devices/ocp.3/pwm_test_P8_19.16/duty", "w");
            fseek(duty,0,SEEK_SET);
            run = fopen("/sys/devices/ocp.3/pwm_test_P8_19.16/run", "w");
            fseek(run,0,SEEK_SET);
            fprintf(run,"%d",0);
            fflush(run);

            fseek(run,0,SEEK_SET);
            --count;
            do 
            {
                duty_cycle += 10;
                fprintf(duty,"%d",duty_cycle);
            }while(count <10);
            fflush(duty);
            fprintf(run,"%d",1);
            fflush(run);



            fclose(pwm);
            fclose(duty);
            fclose(period);
            fclose(run);
            break;



    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

`

Tho*_*ieh 6

我刚刚使用 C 在 BeagleBone Black 上成功启用了 4 个 PWM 输出,所以我希望可以给你一些合理的建议。

/sys/devices/ocp.3/为 PWM使用目录下的文件(称为设备树覆盖)不是一个好主意,原因有两个:

  • PWM 引脚目录名称的最后两位数字是任意的,例如pwm_test_P8_13.xx,由于您不检查 fopen 状态,因此可能会导致分段错误。但是,fopen 不允许在指定路径中使用通配符。我的解决方法根本不干净,是echo /sys/devices/ocp.3/pwm_test_P8_13.*/使用popen调用以检索 PWM 引脚目录的正确完整路径。
  • BeagleBone Black 上只有两个 PWM 模块,DTO 可防止您在每个模块上使用多个 PWM 引脚。因此,如果您尝试从命令行修改引脚的周期,则可能会返回写入错误。如果然后键入dmesg | tail,您可能会看到以下消息:

    [1406.652632]ehrpwm 48304200.ehrpwm:周期值与通道 1 冲突
    [1406.660047] pwm_test pwm_test_P8_19.11: pwm_config() 失败

因此,我改用了下面的文件/sys/class/pwm/。您仍然需要将am33xx_pwm您计划使用的 PWM 引脚写入文件/sys/devices/bone_capemgr.9/slots。然后,你去的目录/sys/class/pwm/,写数字(0-7)的文件export,然后修改生成的目录下的文件pwm?,其中?的数字写入export。下表显示了每个数字及其对应的引脚:

在此处输入图片说明

是我参考的教程。

希望这可以帮助!