ESP32類比輸出SG90

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

我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址: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要寫入的數值了

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);
}

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *