• 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,所以就不会冲突了。

  • 相关阅读:
    【转】iPython入门技巧
    Python——IPython和NumPy
    Python——类与对象,异常处理
    Python——函数,模块,简单文件读写
    给对象的key 设置成变量
    antd 表单validateFields validateFieldsAndScroll方法不执行
    css 设置禁用
    where与having区别
    重温robotframework--day1
    Linux下查看文件内容的命令
  • 原文地址:https://www.cnblogs.com/sjsxk/p/5832406.html
Copyright © 2020-2023  润新知