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,所以就不會沖突了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM