qiao--- 发表于 2023-12-7 20:13

【STM32MP135F-DK】4-舵机应用代码编写分享

<div class='showpostmsg'> 本帖最后由 qiao--- 于 2023-12-7 20:19 编辑

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

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

<p>&nbsp;</p>

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

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

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

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

<pre>
<code>duty_cycle = 2000000.0/180.0*angle+500000;</code></pre>

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

<pre>
<code>static char file_path[] = "/sys/class/pwm/pwmchip0/pwm3";
static int pwm_config(char* attr,char* val){
    char path;
    int fd;
    sprintf(path,"%s/%s",file_path,attr);
    fd = open(path,O_WRONLY);
    if(fd &lt;= 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;
}</code></pre>

<p>最后整个文件的代码如下:</p>

<pre>
<code>#include &lt;stdio.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;unistd.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
static char file_path[] = "/sys/class/pwm/pwmchip0/pwm3";
static int pwm_config(char* attr,char* val){
    char path;
    int fd;
    sprintf(path,"%s/%s",file_path,attr);
    fd = open(path,O_WRONLY);
    if(fd &lt;= 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);
    }
    if(access(file_path,F_OK)){
      fd = open("/sys/class/pwm/pwmchip0/export",O_WRONLY);
      if(fd &lt;=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);
    duty_cycle = 2000000.0/180.0*angle+500000;
    char duty_cycle_str ;
    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;
}</code></pre>

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

<p>&nbsp;</p>

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

<p>运行结果如下所示:</p>

<p>当输入以下的命令的时候</p>

<p> &nbsp;</p>

<p>运行结果如视频所示ab46981db5b869f4e9c35e9bdcea7c71</p>

<p>&nbsp;</p>

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

<p>下期测评我们测一下这个板子的在人工智能方面的应用测评,大家浅浅期待一下。</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

manhuami2007 发表于 2023-12-8 08:45

<p>厉害,你这评测的速度够快的</p>

qiao--- 发表于 2023-12-8 11:09

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

<p>哈哈,官方选择了我,我就要用心给大家做</p><br/>

emma2015 发表于 2023-12-8 17:04

<p>通过编写程序可以控制舵机转向0到180度的任意角度,该板子的pwm脉冲宽度的稳定性较好</p>
页: [1]
查看完整版本: 【STM32MP135F-DK】4-舵机应用代码编写分享