一.前言 最近在公司學(xué)習(xí)Arduino uno ,用它實現(xiàn)小車超聲波避障功能。實現(xiàn)的功能很簡單,就是在小車前方掛一個超聲波模塊,當(dāng)碰到障礙物時,會通過舵機(jī)進(jìn)行擺頭,判斷兩邊的距離,進(jìn)行左右轉(zhuǎn)彎。但是碰到了這樣一個問題,舵機(jī)庫和pwm輸出沖突,當(dāng)舵機(jī)旋轉(zhuǎn)時,pwm輸出函數(shù)analogWrite()不管用了。 二.解決 先分析一下問題產(chǎn)生的原因,我們之前如果想控制舵機(jī),比較常見的方法就是調(diào)用舵機(jī)庫: #include 這種做法非常方便,但是為什么會跟pwm沖突呢,因為在Arduino里的庫封裝里,它們都是用了同一個定時器1,T/C1: Pin9(OC1A)和Pin10(OC1B),所以會導(dǎo)致沖突,如何解決呢,可以在硬件上修改引腳。不費事的辦法就是通過修改代碼來解決沖突。我們可以換一種方法來實現(xiàn)舵機(jī)的控制:
int servopin = 7; //定義舵機(jī)接口數(shù)字接口7 也就是舵機(jī)的橙色信號線。
void servopulse(int angle)//定義一個脈沖函數(shù)
{
int pulsewidth=(angle*11)+500; //將角度轉(zhuǎn)化為500-2480的脈寬值
digitalWrite(servopin,HIGH); //將舵機(jī)接口電平至高
delayMicroseconds(pulsewidth); //延時脈寬值的微秒數(shù)
digitalWrite(servopin,LOW); //將舵機(jī)接口電平至低
delayMicroseconds(20000-pulsewidth);
}
void setup()
{
pinMode(servopin,OUTPUT);//設(shè)定舵機(jī)接口為輸出接口
}
void loop()
{
//把值的范圍映射到0到165左右
for( int angle = 0;angle<180;angle+=10){
for(int i=0;i<50;i++) //發(fā)送50個脈沖
{
servopulse(angle); //引用脈沖函數(shù)
} delay(1000); } }
直接通過延時函數(shù)來給舵機(jī)脈沖,達(dá)到控制的效果,因為Arduino里延時函數(shù)delay()用的是定時器0,所以就不會沖突了。 |
|