Spisu treści:
Wideo: Turbina elektryczna z ESP32: 9 kroków
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Dzisiaj będę omawiał turbinę elektryczną z ESP32. Zespół posiada część wydrukowaną w 3D. Przedstawię funkcję PWM ESP32, która nadaje się do sterowania silnikami elektrycznymi. Będzie to używane w silniku prądu stałego. Pokażę też działanie tego MCPWM (Motor Control PWM) w praktycznym zastosowaniu.
W tym projekcie użyłem ESP32 LoRa i myślę, że warto tutaj zaznaczyć, że ten mikrokontroler ma w sobie dwa bloki. Te bloki są w stanie sterować trzema silnikami każdy. Dzięki temu możliwe jest sterowanie do sześciu silników za pomocą PWM, wszystkie niezależnie. Oznacza to, że sterowanie, którego tutaj użyję, nie jest standardem (co jest czymś podobnym do Arduino). Zamiast tego sterowanie jest samym chipem, co gwarantuje ESP32 dużą elastyczność w zakresie sterowania silnikiem.
Krok 1: Demonstracja
Krok 2: Sterowanie silnikiem PWM
Ogólny schemat:
• Funkcja MCPWM ESP32 może być wykorzystana do sterowania różnymi typami silników elektrycznych. Posiada dwie jednostki.
• Każde urządzenie ma trzy pary wyjść PWM.
• Każda para wyjść A / B może być synchronizowana z jednym z trzech zegarów synchronizacji 0, 1 lub 2.
• Jeden Timer może być użyty do synchronizacji więcej niż jednej pary wyjść PWM
Pełny schemat:
• Każda jednostka może również zbierać sygnały wejściowe jako ZNAKI SYNCHRONIZACJI;
• Wykrywanie ZNAKÓW BŁĘDÓW dla przetężenia lub przepięcia silnika;
• Uzyskaj informacje zwrotne za pomocą SYGNAŁÓW PRZECHWYTU, takich jak położenie silnika
Krok 3: Wykorzystane zasoby
• Zworki do podłączenia
• Heltec Wi-Fi LoRa 32
• Wspólny silnik prądu stałego
• Mostek H - L298N
• kabel USB
• Płyta prototypowa
• Zasilacz
Krok 4: Zestaw deweloperski ESP 32 - Pinout
Krok 5: Montaż turbiny
Krok 6: Obwód - połączenia
Krok 7: Pomiar na oscyloskopie
Krok 8: Kod źródłowy
nagłówek
#include //Nie trzeba używać Arduino IDE#include "driver/mcpwm.h" //włącz bibliotekę "Motor Control PWM" natywną do ESP32 #include // Niezbędne dla Arduino 1.6.5 i później #include SSD1306.h" // o pytanie #include "SSD1306Wire.h" //OLED_SDA -- GPIO4 //OLED_SCL -- GPIO15 //OLED_RST -- GPIO16 #define SDA 4 #define SCL 15 #define RST 16 SSD1306 display (0x3c, SDA, SCL, RST); //Instanciando e ajustando os pinos do objeto "display" #define GPIO_PWM0A_OUT 12 //Declara GPIO 12 como PWM0A #define GPIO_PWM0B_OUT 14 //Declara GPIO 14 como PWM0B
Ustawiać
void setup() { Serial.begin(115200); display.init(); //display.flipScreenPionowo(); //Przejdź do ekranu pionowego display.clear(); //dostosuj ustawienie do wyświetlania.setTextAlignment(TEXT_ALIGN_LEFT); //ustaw czcionkę dla Arial 16 display.setFont(ArialMT_Plain_16); //mcpwm_gpio_init(unidade PWM 0, saya A, porta GPIO) => Instancja MCPWM0A brak pinu GPIO_PWM0A_OUT deklaruje brak kodu mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_0); //mcpwm_gpio_init(unidade PWM 0, saya B, porta GPIO) => Instancja MCPWM0B brak pinu GPIO_PWM0B_OUT deklaruje brak kodu mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_0; MCPWM_0); mcpwm_config_t pwm_config; pwm_config.częstotliwość = 1000; //częstotliwość = 500Hz, pwm_config.cmpr_a = 0; //Ciclo de trabalho (cykl pracy) do PWMxA = 0 pwm_config.cmpr_b = 0; //Ciclo de trabalho (cykl pracy) do PWMxb = 0 pwm_config.counter_mode = MCPWM_UP_COUNTER; //Para MCPWM assimetrico pwm_config.duty_mode = MCPWM_DUTY_MODE_0; //Zdefiniuj cykl pracy na wysokim poziomie //Inicia(Unidade 0, Timer 0, Config PWM) mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Zdefiniuj PWM0A i PWM0B com jako configurações acima }
Funkcje
//Zabawa w konfigurowanie operatora A MCPWM (Unidade, Timer, Porcentagem (cykl pracy)) static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) { //set0_ocpwm_timer_ (0, 1 lub 2), Operador (A lub B)); => Zapisz do MCPWM bez Operadora B (Definiuj zapisz w Baixo) mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); //mcpwm_set_duty(unidade PWM (0 lub 1), liczba do timera (0, 1 lub 2), Operador (A lub B), Ciclo de trabalho (% do PWM)); => Konfiguracja części do PWM bez Operadora A (Cilo de Trabalho) mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle); //mcpwm_set_duty_tyoe (jednostajne PWM (0 lub 1), Numer do timera (0, 1 lub 2), Operador (A lub B), Nivel do cyklu pracy (alto lub baixo)); => zdefiniuj nowy cykl pracy (alto lub baixo) mcpwm_set_duty_type (mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); //Uwaga: Chame essa função toda vez que for chamado „mcpwm_set_signal_low” lub „mcpwm_set_signal_high” na potrzeby wcześniejszej konfiguracji trabalho } //Função que configura MCPWM Doradztwo, TimerhoUnid) () static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) { mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A); //Desliga o sinal do MCPWM bez Operadora A (Definiuj sinal em Baixo) mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle); //Konfiguruj porcentagem do PWM bez Operadora B (Cilo de trabalho) mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); //zdefiniuj nowy cykl pracy (alto lub baixo) } //Função que MCPWM de ambos dla operatorów Operadores static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_mlow_num, PW_pww timerA) {mcpwm timerA; //Deliga do MCPWM bez Operadora A mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); //Desliga o sinal do MCPWM bez Operadora B }
Pętla
void loop() { //Przenieś silnik bez wysyłania horario brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0); oled("50"); opóźnienie (2000); //Para o silnik brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); oled("0"); opóźnienie (2000); //Przenieś silnik bez wysyłania antyhorario brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 25.0); oled("25"); opóźnienie (2000); //Para o silnik brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); oled("0"); opóźnienie (2000); // Aceleracao i de 1 a 100 for(int i=10;i<=100;i++){ brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, i); oled(Ciąg(i)); opóźnienie(200); } // Desaceleração i de 100 a 1 delay(5000); for(int i=100;i>=10;i--){ brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, i); oled(Ciąg(i)); opóźnienie (100); } opóźnienie(5000); }
Krok 9: Pobierz pliki
JA NIE
RYSUNEK