Table des matières:
Vidéo: Turbine électrique avec ESP32 : 9 étapes
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Aujourd'hui, je vais parler d'une turbine électrique avec ESP32. L'assemblage a une pièce qui a été imprimée en 3D. Je présenterai une fonction PWM de l'ESP32 adaptée au contrôle des moteurs électriques. Ceci sera utilisé dans un moteur à courant continu. Je démontrerai également le fonctionnement de ce MCPWM (Motor Control PWM) dans une application pratique.
J'ai utilisé ESP32 LoRa dans ce projet, et je pense qu'il est important de noter ici que ce microcontrôleur a deux blocs à l'intérieur. Ces blocs sont capables de contrôler trois moteurs chacun. Ainsi, il est possible de contrôler jusqu'à six moteurs avec PWM, tous indépendamment. Cela signifie que le contrôle que j'utiliserai ici n'est pas le standard (qui est quelque chose de similaire à l'Arduino). Au lieu de cela, le contrôle est la puce elle-même, ce qui garantit à l'ESP32 beaucoup de flexibilité en ce qui concerne le contrôle du moteur.
Étape 1: Démonstration
Étape 2: Contrôle du moteur PWM
Schéma général:
• La fonction MCPWM de l'ESP32 peut être utilisée pour contrôler différents types de moteurs électriques. Il a deux unités.
• Chaque unité possède trois paires de sorties PWM.
• Chaque paire de sorties A/B peut être synchronisée avec l'un des trois temporisateurs de synchronisation 0, 1 ou 2.
• Une minuterie peut être utilisée pour synchroniser plus d'une paire de sorties PWM
Diagramme complet:
• Chaque unité est également capable de collecter des signaux d'entrée en tant que SIGNES DE SYNCHRONISATION;
• Détecter les SIGNES DE DÉFAUT pour les surintensités ou les surtensions du moteur;
• Obtenir des commentaires avec CAPTURE SIGNALS, tels que la position du moteur
Étape 3: Ressources utilisées
• Cavaliers de connexion
• Heltec Wifi LoRa 32
• Moteur à courant continu commun
• Pont H - L298N
• Cable USB
• Protoboard
• Source de courant
Étape 4: Kit de développement ESP 32 - Brochage
Étape 5: Montage de la turbine
Étape 6: Circuit - Connexions
Étape 7: Mesure sur l'oscilloscope
Étape 8: Code source
Entête
#include //Não é necessário caso use Arduino IDE#include "driver/mcpwm.h" //inclui a biblioteca "Motor Control PWM" nativa do ESP32 #include // Necessário apenas para o Arduino 1.6.5 e posterior #include " SSD1306.h" // o mesmo que #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 //Déclara GPIO 12 como PWM0A #define GPIO_PWM0B_OUT 14 //Déclara GPIO 14 como PWM0B
Installer
void setup() { Serial.begin(115200); display.init(); // display.flipScreenVertically(); //Vira une telle verticalement display.clear(); //juste ou ajuste pour un affichage display.setTextAlignment(TEXT_ALIGN_LEFT); //juste une police pour Arial 16 display.setFont(ArialMT_Plain_16); //mcpwm_gpio_init(unidade PWM 0, saida A, porta GPIO) => Instancia o MCPWM0A no pino GPIO_PWM0A_OUT declarado no começo do código mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM); //mcpwm_gpio_init(unidade PWM 0, saida B, porta GPIO) => Instancia o MCPWM0B no pino GPIO_PWM0B_OUT declarado no começo do código mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM_PWM); mcpwm_config_t pwm_config; pwm_config.fréquence = 1000; // fréquence = 500 Hz, pwm_config.cmpr_a = 0; //Ciclo de trabalho (cycle de service) do PWMxA = 0 pwm_config.cmpr_b = 0; //Ciclo de trabalho (cycle de service) do PWMxb = 0 pwm_config.counter_mode = MCPWM_UP_COUNTER; //Para MCPWM assimetrico pwm_config.duty_mode = MCPWM_DUTY_MODE_0; //Définir ciclo de trabalho em nível alto //Inicia(Unidade 0, Timer 0, Config PWM) mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Définir PWM0A & PWM0B com comme configurações acima }
Les fonctions
//Função que configura o MCPWM operador A (Unidade, Timer, Porcentagem (ciclo de trabalho))static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) { //mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, float duty_cycle) { //mcpwm_do(set_dosignade_do (0, 1 ou 2), Opérateur (A ou B)); => Desliga o sinal do MCPWM no Operador B (Définir o sinal em Baixo) mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); //mcpwm_set_duty(unidade PWM(0 ou 1), Número do timer(0, 1 ou 2), Operador (A ou B), Ciclo de trabalho (% do PWM)); => Configura a porcentagem do PWM no Operador A (Ciclo de trabalho) mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle); //mcpwm_set_duty_tyoe(unidade PWM(0 ou 1), Número do timer(0, 1 ou 2), Operador (A ou B), Nível do ciclo de trabalho (alto ou baixo)); => définir le nível do ciclo de trabalho (alto ou baixo) mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); //Nota: Chame essa função toda vez que for chamado "mcpwm_set_signal_low" ou "mcpwm_set_signal_high" para manter o ciclo de trabalho configurado anteriormente } //Função que configura o MCPWM Do operador B (Unidade, Timer)ciclo de tracentagem (unidade, Timer)ciclo de tracentagem 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 no Operador A (Define o sinal em Baixo) mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle); //Configura a porcentagem do PWM no Operador B (Ciclo de trabalho) mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); //définir le nível do ciclo de trabalho (alto ou baixo) } //Função que para o MCPWM de ambos os Operadores static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num_num) { mcpwm_m_set_num_mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num_num); //Desliga o sinal do MCPWM no Operador A mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); //Desliga o sinal do MCPWM no Operador B }
Boucle
void loop() { //Move o motor no sentido horário brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0); oled("50"); retard (2000); //Para o moteur brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); oled("0"); retard (2000); //Move o motor no sentido antihorário brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 25.0); oled("25"); retard (2000); //Para o moteur brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); oled("0"); retard (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(String(i)); retard (200); } // Desacceleraçã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(String(i)); retard (100); } retard (5000); }
Étape 9: Télécharger les fichiers
INO
DESSIN