zoukankan      html  css  js  c++  java
  • Arduino学习经验(一)之解决舵机库和pwm输出冲突

      一.前言     

       最近在公司学习Arduino uno ,用它实现小车超声波避障功能。实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯。但是碰到了这样一个问题,舵机库和pwm输出冲突,当舵机旋转时,pwm输出函数analogWrite()不管用了。

      二.解决

       先分析一下问题产生的原因,我们之前如果想控制舵机,比较常见的方法就是调用舵机库:

       #include <Servo.h>
     
    Servo myservo;  // create servo
    object to control a
    servo
                   
    // a maximum of eight servo objects can be created
     
    int pos =
    0;    // variable to store the servo position
     
    void
    setup()
    {
      myservo.attach(9);  // attaches the servo on pin 9
    to the servo object
    }
     
     
    void loop()
    {
     
    for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180
    degrees
     
    {                                 
    // in steps of 1 degree
       
    myservo.write(pos);             
    // tell servo to go to position in variable 'pos'
       
    delay(15);                      
    // waits 15ms for the servo to reach the position
      }
      for(pos
    = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0
    degrees
     
    {                               
       
    myservo.write(pos);             
    // tell servo to go to position in variable 'pos'
       
    delay(15);                      
    // waits 15ms for the servo to reach the position
      }
    }

         这种做法非常方便,但是为什么会跟pwm冲突呢,因为在Arduino里的库封装里,它们都是用了同一个定时器1,T/C1: Pin9(OC1A)和Pin10(OC1B),所以会导致冲突,如何解决呢,可以在硬件上修改引脚。不费事的办法就是通过修改代码来解决冲突。我们可以换一种方法来实现舵机的控制:

     

    int servopin = 7;    //定义舵机接口数字接口7 也就是舵机的橙色信号线

     

     

     

    void servopulse(int angle)//定义一个脉冲函数

     

    {

     

      int pulsewidth=(angle*11)+500;  //将角度转化为500-2480的脉宽值

     

      digitalWrite(servopin,HIGH);    //将舵机接口电平至高

     

      delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数

     

      digitalWrite(servopin,LOW);     //将舵机接口电平至低

     

      delayMicroseconds(20000-pulsewidth);

     

    }

     

     

     

    void setup()

     

    {

     

      pinMode(servopin,OUTPUT);//设定舵机接口为输出接口

     

    }

     

     

     

     

     

     

     

    void loop()

     

    {

     

        //把值的范围映射到0到165左右

     

     for( int angle = 0;angle<180;angle+=10){

     

        for(int i=0;i<50;i++)  //发送50个脉冲

     

      {

     

           servopulse(angle);   //引用脉冲函数

     

      }   delay(1000);  } }

     

       直接通过延时函数来给舵机脉冲,达到控制的效果,因为Arduino里延时函数delay()用的是定时器0,所以就不会冲突了。

  • 相关阅读:
    java开发:分享一下百度ueditor和七牛的图片集成上传
    java开发:分享一下使用urlrewrite实现网址的个性访问
    javascript应用:页面解析list和map封装后的json数据
    JAVA开发:分享一些SpringMvc+Ibatis+spring的框架使用心得
    使用OLEDB读取excel和csv文件
    静态代码块、构造代码块
    序列化和反序列化
    windows下Mysql5.7.10免安装版配置
    form表单中的encType属性
    关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
  • 原文地址:https://www.cnblogs.com/sjsxk/p/5832406.html
Copyright © 2011-2022 走看看