我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


ESP32的類比輸出較為麻煩,採用的是ledcWrite指令,一般來說沒特別需要直接使用ESP32Servo即可。以下是採用ledcWrite的SG90指令。

一、設定頻道
ledcSetup(7, 50, 8);
ESP32一共有16個類比輸出頻道(0~15),我們在這裡使用頻道7,而50則是50 Hz輸出頻率也就是1秒/50=20ms寬度,8則是解析度,代表2的8次方=256。

二、附加頻道到腳位
ledcAttachPin(2, 7); 
將上述設定好的頻道7附加在GPIO 2腳位,而GPIO 2則是我們連接SG90的腳位,也就是代表後續我們只需要指定頻道7的輸出數值,就是輸出在GPIO 2上。

三、寫入數值
ledcWrite(7, 18.56);
在頻道7輸出18.56的脈衝,代表將SG90轉到90度的位置,至於18.56代表90度是如何算出的呢?
首先頻道設定為50Hz,也就是1秒/50=20ms週期,20ms週期又被分為2的8次方=256個等級,因此一個PWM單位是20/256。
另一方面SG90的脈衝為500us~2400us,也就是0.5ms~2.4ms,因此換算為PWM範圍就是0.5/(20/256)~2.4/(20/256)=6.4~30.72之間,而6.4及30.72就分別代表0及180度了,因此90度就是(6.4+30.72)/2=18.56。

以下則為SG90從0~180度的測試程式
int value=map(angle,0,180,6.4,30.72);
map是一個很方便的取比例函數,參數分別是   轉換後數值=map(數值,數值最小值,數值最大值,轉換最小時,轉換最大值)
例如90度的計算方式:map(90,0,180,6.4,30.72)得到18.56,就是ledcWrite要寫入的數值了

image


void setup()
{  
  Serial.begin(115200);
  ledcSetup(7, 50, 8);  
  ledcAttachPin(2, 7);  
}
void loop()
{
  for(int angle = 0; angle <= 180; angle++)
  {
    int value=map(angle,0,180,6.4,30.72);
    ledcWrite(7, value);
    Serial.println("角度=" + String(angle) + ",value=" + String(value));
    delay(70);    
  }
delay(1000);
}


 

image

 

 

 

arrow
arrow
    文章標籤
    esp32 arduino sg90 servo
    全站熱搜
    創作者介紹
    創作者 夜市 小霸王 的頭像
    夜市 小霸王

    夜市小霸王

    夜市 小霸王 發表在 痞客邦 留言(0) 人氣()