#define STEP_PIN 26
#define DIR_PIN 27
#define BUTTON_PIN 33
int i_FOREWARD_STEP=1600;//前进到多少位置并返回
// setting PWM properties
const uint8_t MAX_freq_PWM = 500;//设置最高频率,控制速度
const uint8_t channel_PWM = 0;//通道号,取值0 ~ 15
const uint8_t resolution_PWM = 10;//PWM分辨率,取值0 ~ 20
uint8_t N_freq_PWM=MAX_freq_PWM/5;
unsigned long STEP=0;
void IRAM_ATTR isr() {
//下降沿触发中断
if(digitalRead(DIR_PIN)==HIGH){
STEP++;
if(N_freq_PWM<MAX_freq_PWM){
if(STEP%10==0){
if(STEP<100){
N_freq_PWM++;
ledcWriteTone(channel_PWM,N_freq_PWM++);
}
else{
N_freq_PWM=MAX_freq_PWM;
ledcWriteTone(channel_PWM,N_freq_PWM++);
}
}
}
}
else{
STEP--;
if(N_freq_PWM<MAX_freq_PWM){
if(STEP%10==0){
if(i_FOREWARD_STEP-STEP<100){
N_freq_PWM++;
ledcWriteTone(channel_PWM,N_freq_PWM++);
}
else{
N_freq_PWM=MAX_freq_PWM;
ledcWriteTone(channel_PWM,N_freq_PWM++);
}
}
}
}
}
void task1(void *pt) {
Serial.println("RUN");
digitalWrite(DIR_PIN, HIGH);//正转
N_freq_PWM=MAX_freq_PWM/5;
ledcWriteTone(channel_PWM,N_freq_PWM);
Serial.println(ledcReadFreq(channel_PWM));
while (STEP<i_FOREWARD_STEP){//到位
vTaskDelay(5);
}
N_freq_PWM=MAX_freq_PWM/5;
digitalWrite(DIR_PIN, LOW);//反转
while (STEP>0){//回位
vTaskDelay(5);
}
Serial.println("STOP");
ledcWriteTone(channel_PWM,0);
vTaskDelete(NULL); //删除自身函数
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(DIR_PIN, OUTPUT);
ledcSetup(channel_PWM, MAX_freq_PWM, resolution_PWM); // 设置通道
ledcAttachPin(STEP_PIN, channel_PWM); //将 LEDC 通道绑定到指定 IO 口上以实现输出
attachInterrupt(digitalPinToInterrupt(STEP_PIN), isr, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(BUTTON_PIN)==LOW){
delay(100);
if (digitalRead(BUTTON_PIN)==LOW){
xTaskCreate(task1,
"task1",
1024,
NULL,
1,
NULL);
}
}
delay(10);
}