以狀態的來設定動作
PWM,Pulse-Width Modulation,是一種利用數位訊號控制類比電路的非常有效的方法。普通微處理器是不能直接輸出類比訊號,然而PWM技術使得實現這種轉換非常方便(數位到類比訊號的轉換)。
PWM技術利用數位腳位發送一定頻率的方波,即輸出高電位和低電位,交替持續一段時間。每組高電位和低電位的總時間一般是固定的,稱為週期(注:週期是頻率的倒數)。輸出高電位的時間一般稱為“脈衝寬度”,佔空比是脈衝持續時間或脈衝寬度(PW)佔波形總週期(T)的百分比。
所以高電位輸出持續時間越長,佔空比越長,類比訊號中對應的電壓就會越高。下圖顯示了類比訊號電壓如何在 0V-3.3V(高電平為 3.3V)之間變化,對應脈衝寬度 0%-100%:
const int ledPin = 23; // Esp32 23腳
const int freq = 5000; //頻率
const int ledChannel = 0; //通道
const int resolution = 8; //每次多少
void setup(){
ledcSetup(ledChannel, freq, resolution); //設定哪個通道開始多久依次每次多少
ledcAttachPin(ledPin, ledChannel); //設定腳位和通道
}
void loop(){
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
ledcWrite(ledChannel, dutyCycle); //由通道控制暗到亮
delay(100);
}
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
ledcWrite(ledChannel, dutyCycle); //由通道控制亮到暗
delay(100);
}
}
PWM指令器(ESP32)
//PWM_LED3
#include <analogWrite.h>
int ledpin=23; //ESP32 GPIO23
void setup() {
pinMode(ledpin,OUTPUT);
}
void loop() {
for (int i = 0; i < 255; i++) { //LED 從滅到亮
analogWrite(ledpin,i);
delay(10);
}
for (int i = 255; i > -1; i--) { //LED 從亮到滅
analogWrite(ledpin,i);
delay(10);
}
}
使用VR類比輸入,控制LED燈(ESP32 PWM)
// Motor PWM 控制
#include <analogWrite.h>
const int VR=36, LED=33; //宣告A2腳連接VR信號、3腳連接LED信號
int tmp=0; //宣告暫存變數
//==================================
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
digitalWrite(LED, 0); //LED初值設定為0
pinMode(VR, INPUT);//宣告GPIO 36作為輸入
Serial.begin(115200); //啟用串列埠,而其傳輸率設定為9600bps
}
//==================================
void loop() {
int i=analogRead(VR); //讀取VR2上的電壓
int j=map(i, 0, 4095, 0, 255); //ESP32 為12位元資料輸入(0~4095)轉換範圍PWM的範圍為8位元(0~255)
if (j!=tmp){ //若有變動
tmp=j; //儲存
analogWrite(LED,j); //輸出到LED
Serial.print("VR2: "); //在序列埠監控視窗裡展示VR2:
Serial.println(i); //展示輸入電壓,並換行
Serial.print("LED: "); //在序列埠監控視窗裡展示LED:
Serial.println(j); //展示輸出電壓,並換行
Serial.println(); //空行,並換行
}
delay(100); //暫停0.1秒
}
數位訊號分析(電位分析的方法)