L298N双路驱动直流电机方案(支持PWM+正反转)

本文介绍了使用STM32F103ZET6驱动直流电机的挑战,电源问题的解决办法以及L298N双路电机驱动模块的使用。通过Arduino进行测试,实现了电机的正反转及PWM调速,并探讨了使能端对电机运行的影响。

目录

写在前面(吐槽吐槽) 

正文

最后


写在前面(吐槽吐槽) 

我想要驱动两个直流电机.

直流电机,说白了,就是那种小马达,小时候玩四驱车时那种没有正负极的马达,转速快,力矩小。

比如

 

我用它带一个扇叶,就能实现正反转以及通过PWM进行调速,问题在于,这样的一个马达驱动电流竟然达到了400ma,我是主控板(stm32F103ZET6正点原子精英版),在外接12v 1A的电源适配器后,提供的5v,3.3v的电源提供的负载的最大电流也只有1.2A,排除板子本身需要200ma以上,最大提供给负载也只有1A,为这电源我折腾了不少,什么dc电压扩展板,面包电源板等等,它们驱动一个电机还好,两个电机就不行了。

最后我找了我电信的同学,成功找到答案,用可充电锂电池组提供持久的放电,才真正意义上解决电源源头的问题。。

正文

本次用的是ST的L298N,就是淘宝是能找到的那种,双路直流电机驱动板

 

怎么用呢?它有个12v Power端口的电源输入口,实际上输入7-12v都可以,如果是在这一端输入电压,同时如果你想有一个让这个L298N提供5V电源以向外输出, 则把上图的5Venable 短接。

基于网上对这资料很杂且乱,我只能实践记录操作

### L298N双H桥直流电机反转PWM调速控制 L298N是一种常用的双H桥直流电机驱动模块,能够通过GPIO引脚发送高低电平信号来控制电机反转。同时,利用PWM信号调节占空比可以实现对电机速度的有效控制[^3]。 以下是基于STM32微控制器的一个典型代码示例,用于演示如何使用L298N模块完成直流电机反转以及PWM调速功能: #### STM32 GPIO 和 TIM 配置说明 - **IN1/IN2**: 控制电机方向。 - IN1=HIGH, IN2=LOW -> 电机转。 - IN1=LOW, IN2=HIGH -> 电机反转。 - **ENA (使能端)**: 接收来自TIM外设生成的PWM波形信号,用于调整电机的速度。 ```c #include "stm32f1xx_hal.h" // 定义GPIO引脚和定时器通道 #define MOTOR_IN1_GPIO_PIN GPIO_PIN_0 #define MOTOR_IN2_GPIO_PIN GPIO_PIN_1 #define MOTOR_ENA_TIM timHandle.Instance->CCR1 // 假设使用TIM2 CH1作为PWM输出 void Motor_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 // 初始化IN1、IN2为推挽输出模式 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = MOTOR_IN1_GPIO_PIN | MOTOR_IN2_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void PWM_Init(TIM_HandleTypeDef *htim) { __HAL_RCC_TIM2_CLK_ENABLE(); // 启用TIM2时钟 htim->Instance = TIM2; htim->Init.Prescaler = 71; // 设置预分频器值(假设系统时钟72MHz),得到约1kHz频率 htim->Init.CounterMode = TIM_COUNTERMODE_UP; htim->Init.Period = 999; // 自动重装载值设置为999,对应1ms周期 htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim); // 初始化PWM模式 TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比为0% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1); // 开始PWM计数 } void SetMotorSpeed(uint16_t speed) { if(speed > 100){ speed = 100; // 占空比最大不超过100% } uint16_t pulse_width = (speed * 999)/100; // 将百分比转换成脉宽数值 MOTOR_ENA_TIM = pulse_width; // 更新PWM比较寄存器值 } void ControlMotorDirection(int direction) { if(direction == 1){ // 转 HAL_GPIO_WritePin(GPIOA, MOTOR_IN1_GPIO_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, MOTOR_IN2_GPIO_PIN, GPIO_PIN_RESET); }else{ // 反转 HAL_GPIO_WritePin(GPIOA, MOTOR_IN1_GPIO_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, MOTOR_IN2_GPIO_PIN, GPIO_PIN_SET); } } ``` 上述代码实现了以下功能: 1. 使用`MOTOR_INIT()`函数初始化两个GPIO引脚(IN1和IN2)以便于控制电机的方向。 2. `PWM_INIT()` 函数负责配置一个通用定时器(Timer)以产生PWM信号给EN A输入端口用来改变电机速度。 3. 提供了一个接口函数`SetMotorSpeed()`, 用户可以通过传递参数指定期望达到的目标速度比例(范围从0%到100%)。 4. 方向切换由`ControlMotorDirection()`处理,传入整型变量决定是让电机顺时针还是逆时针旋转。 #### 注意事项 当实际部署此方案前,请务必确认所选MCU型号及其开发环境支持以上API定义,并适当修改硬件资源分配如使用的具体GPIO编号及时基单元等细节信息。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值