ESP32-使用有刷直流电机笔记
2025-09-09 来源:cnblogs
基于ESP-IDF4.1
1 /*
2 * 刷直流电动机控制示例,代码通过L298电机芯片测试
3 */
4
5 #include 6 7 #include 'freertos/FreeRTOS.h' 8 #include 'freertos/task.h' 9 #include 'esp_attr.h' 10 11 #include 'driver/mcpwm.h' 12 #include 'soc/mcpwm_periph.h' 13 14 #define GPIO_PWM0A_OUT 15 //设置 GPIO 15 作为 PWM0A 15 #define GPIO_PWM0B_OUT 16 //设置 GPIO 16 作为 PWM0B 16 17 static void mcpwm_example_gpio_initialize(void) 18 { 19 printf('initializing mcpwm gpio...n'); 20 mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT); 21 mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT); 22 } 23 24 /** 25 * @brief 电机向前移动 26 */ 27 static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle) 28 { 29 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); 30 mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle); 31 mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); 32 } 33 34 /** 35 * @brief 电机向后移动 36 */ 37 static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle) 38 { 39 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A); 40 mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle); 41 mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); 42 } 43 44 /** 45 * @brief 电机停止 46 */ 47 static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num) 48 { 49 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A); 50 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B); 51 } 52 53 /** 54 * @brief 为有刷直流电机配置MCPWM 55 */ 56 static void mcpwm_example_brushed_motor_control(void *arg) 57 { 58 //1. mcpwm gpio 初始化 59 mcpwm_example_gpio_initialize(); 60 61 //2. 初始化 mcpwm 配置 62 printf('Configuring Initial Parameters of mcpwm...n'); 63 mcpwm_config_t pwm_config; 64 pwm_config.frequency = 1000; //频率 = 500Hz, 65 pwm_config.cmpr_a = 0; // PWMxA占空比 = 0 66 pwm_config.cmpr_b = 0; // PWMxb占空比 = 0 67 pwm_config.counter_mode = MCPWM_UP_COUNTER; 68 pwm_config.duty_mode = MCPWM_DUTY_MODE_0; 69 mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); 70 while (1) { 71 brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0); 72 vTaskDelay(2000 / portTICK_RATE_MS); 73 brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 30.0); 74 vTaskDelay(2000 / portTICK_RATE_MS); 75 brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); 76 vTaskDelay(2000 / portTICK_RATE_MS); 77 } 78 } 79 80 void app_main(void) 81 { 82 printf('Testing brushed motor...n'); 83 xTaskCreate(mcpwm_example_brushed_motor_control, 'mcpwm_examlpe_brushed_motor_control', 4096, NULL, 5, NULL); 84 }
下一篇:ESP32-使用ADC笔记
- ESP32/8266固件备份方法
- upyOS:基于 MicroPython 的模块化操作系统,兼容 ESP32、RP2040 等微控制器
- ESP32与STM32哪个更适合初学者?问题解析与对比
- STM32与ESP32核心应用场景解析及PCB设计实践(深度探讨)
- ESP32与STM32:比较并非明智之举
- ESP32与STM32:性能对比分析及选型指南
- STM32与ESP32:核心差异详解
- 串口、并口、USB、UART及RS232/RS485接口与ESP32、STM32的应用解析
- ESP32音频输入-MAX4466,MAX9814,SPH0645LM4H,INMP441
- ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 意法半导体中国本地造STM32微控制器启动规模量产
- 蓝牙信道探测技术原理与开发套件实践




