#include <LiquidCrystal_I2C.h>
// 定義腳位 (對應 NUCLEO-C031C6 的 Arduino 標籤)
#define PIN_STEP 7 // D7 (PA8)
#define PIN_DIR 8 // D8 (PA9)
#define PIN_BTN A0 // 按鈕 (PA0)
#define PIN_LED1 A1 // PA1
#define PIN_LED2 A4 // PA4
#define PIN_LED3 A5 // PA5
// 初始化 LCD (地址 0x27)
LiquidCrystal_I2C lcd(0x27, 16, 2);
int mode = 0; // 0:停止, 1:低速, 2:中速, 3:高速
unsigned long lastStepMicros = 0;
unsigned long stepInterval = 0; // 兩次步進之間的微秒間隔
void setup() {
// 設定腳位模式
pinMode(PIN_STEP, OUTPUT);
pinMode(PIN_DIR, OUTPUT);
pinMode(PIN_BTN, INPUT_PULLUP); // 啟用內部上拉,沒按時是 HIGH
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_LED3, OUTPUT);
digitalWrite(PIN_DIR, HIGH); // 設定固定轉向
// 初始化 LCD
lcd.init();
lcd.backlight();
updateSystem();
}
void loop() {
// 1. 偵測按鈕 (低電位觸發)
if (digitalRead(PIN_BTN) == LOW) {
delay(200); // 去彈跳
mode = (mode + 1) % 4; // 循環狀態 0 -> 1 -> 2 -> 3 -> 0
updateSystem();
while (digitalRead(PIN_BTN) == LOW); // 等待放開按鈕,避免連續觸發
}
// 2. 驅動馬達 (非阻塞式脈衝)
if (mode > 0) {
unsigned long currentMicros = micros();
if (currentMicros - lastStepMicros >= stepInterval) {
digitalWrite(PIN_STEP, HIGH);
delayMicroseconds(20); // 脈衝寬度,確保 A4988 抓得到
digitalWrite(PIN_STEP, LOW);
lastStepMicros = currentMicros;
}
}
}
void updateSystem() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("STM32 MOTOR CTL");
lcd.setCursor(0, 1);
// 根據不同模式設定步進間隔與 LED
// 數值越小,轉速越快
switch(mode) {
case 0:
stepInterval = 0;
lcd.print("STATUS: STOP");
digitalWrite(PIN_LED1, LOW); digitalWrite(PIN_LED2, LOW); digitalWrite(PIN_LED3, LOW);
break;
case 1:
stepInterval = 8000; // 低速
lcd.print("STATUS: LOW");
digitalWrite(PIN_LED1, HIGH); digitalWrite(PIN_LED2, LOW); digitalWrite(PIN_LED3, LOW);
break;
case 2:
stepInterval = 3000; // 中速
lcd.print("STATUS: MID");
digitalWrite(PIN_LED1, HIGH); digitalWrite(PIN_LED2, HIGH); digitalWrite(PIN_LED3, LOW);
break;
case 3:
stepInterval = 1000; // 高速
lcd.print("STATUS: HIGH");
digitalWrite(PIN_LED1, HIGH); digitalWrite(PIN_LED2, HIGH); digitalWrite(PIN_LED3, HIGH);
break;
}
}Loading
st-nucleo-c031c6
st-nucleo-c031c6