676|3

243

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【STM32MP135F-DK】4-舵机应用代码编写分享 [复制链接]

本帖最后由 qiao--- 于 2023-12-7 20:19 编辑

在上一期我们成功驱动了舵机,不过我们是利用命令行的方式是让这舵机运行的,这种方式需要我们用至少三行的命令才能让这个舵机转起来。

这一期我们就编写一个应用层的程序让这个舵机可以简单一点的进行控制。

 

由于我用的的舵机是sg90,这个舵机精度不是很高,只能旋转0度到180度之间,所以这次我实现的是0到180度舵机的控制。360度舵机控制原理也是一样的,大家可以参考一下。

编写应用程序之前先确认一下自己的需求,我希望是直接向这个舵机里面写多少度他就可以转多少度。

需求确定好了现在就可以根据自己的舵机来写应用程序。

我的这个舵机20ms的周期当占空比为0.5ms时候为0度,2.5ms为180度,于是我得出了下面的度数与占空比之间的公式:

duty_cycle = 2000000.0/180.0*angle+500000;

占空比出来了,其他的都好说了。经过我的分析发现一直有向/sys/class/pwm/pwmchip0/pwm3这个文件夹里面的文件写数据的需求。于是我封装了下面的这个函数用于向这个文件夹里面的指定文件写数据。

static char file_path[] = "/sys/class/pwm/pwmchip0/pwm3";
static int pwm_config(char* attr,char* val){
    char path[100]; 
    int fd;
    sprintf(path,"%s/%s",file_path,attr);
    fd = open(path,O_WRONLY);
    if(fd <= 0){
        perror("open error:");
        return fd;
    }
    int len = strlen(val);
    if(len != write(fd,val,len)){
        perror("write error!");
        close(fd);
        return 1;
    }
    close(fd);
    return 0;
}

最后整个文件的代码如下:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
static char file_path[] = "/sys/class/pwm/pwmchip0/pwm3";
static int pwm_config(char* attr,char* val){
    char path[100]; 
    int fd;
    sprintf(path,"%s/%s",file_path,attr);
    fd = open(path,O_WRONLY);
    if(fd <= 0){
        perror("open error:");
        return fd;
    }
    int len = strlen(val);
    if(len != write(fd,val,len)){
        perror("write error!");
        close(fd);
        return 1;
    }
    close(fd);
    return 0;
}

int main(int argc,char *argv[]){
    int fd;
    int angle;
    long duty_cycle;
    if(argc != 2){
        printf("use err,please use %s + angle\n",
        argv[0]);
    }
    if(access(file_path,F_OK)){
        fd = open("/sys/class/pwm/pwmchip0/export",O_WRONLY);
        if(fd <=0){
            perror("open error");
            exit(-1);
            return fd;
        }
        if(1!=write(fd,"3",1)){
            perror("write error");
            close(fd);
            exit(-1);
        }
        close(fd);
    }
    angle = atoi(argv[1]);
    duty_cycle = 2000000.0/180.0*angle+500000;
    char duty_cycle_str [10];
    sprintf(duty_cycle_str,"%d",duty_cycle);
    if(pwm_config("duty_cycle",duty_cycle_str))
        exit(-1);
    if(pwm_config("enable","1"))
        exit(-1);
    return 0;
}

在虚拟机里面进行交叉编译然后拷贝到板子上就可以运行了。

 

当在板子的命令行上输入./streering 和指定的度数的时候舵机就会转动到指定度数上面。

运行结果如下所示:

当输入以下的命令的时候

 

运行结果如视频所示

IMG_7821

 

总结:通过编写程序可以控制舵机转向0到180度的任意角度,该板子的pwm脉冲宽度的稳定性较好。

下期测评我们测一下这个板子的在人工智能方面的应用测评,大家浅浅期待一下。

此帖出自stm32/stm8论坛

最新回复

通过编写程序可以控制舵机转向0到180度的任意角度,该板子的pwm脉冲宽度的稳定性较好   详情 回复 发表于 2023-12-8 17:04
点赞 关注
 

回复
举报

274

帖子

8

TA的资源

纯净的硅(初级)

沙发
 

厉害,你这评测的速度够快的

此帖出自stm32/stm8论坛

点评

哈哈,官方选择了我,我就要用心给大家做  详情 回复 发表于 2023-12-8 11:09
 
 

回复

243

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
manhuami2007 发表于 2023-12-8 08:45 厉害,你这评测的速度够快的

哈哈,官方选择了我,我就要用心给大家做


此帖出自stm32/stm8论坛
 
 

回复

56

帖子

0

TA的资源

一粒金砂(中级)

4
 

通过编写程序可以控制舵机转向0到180度的任意角度,该板子的pwm脉冲宽度的稳定性较好

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表