STM32F103与L298n电机驱动模块按键控制电机正反转及PWM调速(附源码)

功能

使用普中科技STM32-PZ6806D开发板上的按键控制电机正反转,启动,停止,PWM输出波接在开发板的LED灯上查看效果。不仅限于使用这款开发板,修改引脚配置即可。

硬件

1.普中科技STM32-PZ6806D开发板,核心STM32F103ZET6。
2.L298n电机驱动模块。
3.直流电机。

连接如图所示各个管脚图

1.模块可驱动两路直流电机,输出A接及B各接一直流电机即可
2.若使用12V供电,将12V供电端口及GND接上电源正负即可。
3.若不需要使用PWM调速,只需要控制电机正反转,则逻辑A与B跳线帽插上即可,相当于始终使能。
4.若需要使用PWM调速,需将跳线帽拔起,将使能端接上单片机IO口。
5.逻辑输入四个端口IN1、IN2、IN3、IN4接单片机四个IO口,每两个端口控制的一路电机。

如图为如何控制四个端口
如图为L298n使电机正反停的逻辑,简单地说,当控制单片机IN1所连接引脚为高电平,与IN2连接的引脚为低电平时,输出A端使电机正转,其他情况见上表。

代码(基于正点原子)

motor.c 电机的控制

#include "motor.h"
#include "stm32f10x.h" 
#include "stm32f10x_rcc.h"
#include "delay.h"

void Motor_12_Config(void)   //管脚配置
 {
   
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); 
 }
 
 void Motor_1_STOP(void)              //电机1停止
{
   
 GPIO_ResetBits(GPIOC,GPIO_Pin_0);
 GPIO_ResetBits(GPIOC,GPIO_Pin_1);
}

void Motor_1_PRun(void)           //电机1正转
{
   
 GPIO_SetBits(GPIOC,GPIO_Pin_0);
 GPIO_ResetBits(
### 如何使用 STM32 控制 L298N 电机驱动模块 #### GPIO 和 PWM 输出配置 为了使 STM32 能够控制 L298N 电机驱动模块,首先需要配置相应的 GPIO 引脚以及设置 PWM 输出。这一步骤涉及到将特定的引脚分配给不同的功能,比如 PWM 波形生成。 对于 L298N 的 IN1 至 IN4 输入端口连接到 STM32 的 GPIO 引脚上,这些引脚用来发送信号以决定电机的方向和启动/停止命令。而 ENA 和 ENB 则通常接至能够产生 PWM 信号的引脚,以便调节电机的速度[^1]。 ```c // 配置GPIO引脚作为PWM输出 void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 假设使用TIM2定时器 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` #### 定时器 TIM2 初始化 PWM 设置 接下来是对定时器 TIM2 进行初始化并设定其工作参数,包括预分频系数、自动重装载值等,从而定义了 PWM 波形的具体特性——周期 T 和占空比 D。此部分操作决定了最终输出给 L298N 的脉宽调制电压水平,进而影响电机运转速度。 ```c static void MX_TIM2_PWM_Init(TIM_HandleTypeDef* htim) { TIM_OC_InitTypeDef sConfigOC; htim->Instance = TIM2; htim->Init.Prescaler = 83; // 设定预分频数为84-1=83 (假设系统时钟72MHz),得到计数频率约为1MHz htim->Init.CounterMode = TIM_COUNTERMODE_UP; htim->Init.Period = 999; // 自动重载寄存器ARR加载数值999,则PWM周期T=(ARR+1)/f_cnt≈1ms htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(htim) != HAL_OK){ Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 499; // 占空比D=PSC/(PSC+CCR)=50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK || HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL_2) != HAL_OK){ Error_Handler(); } } ``` #### 主程序逻辑设计 在主函数中,通过改变 PWM 的占空比来调整电机转速,并利用 GPIO 来切换电机转动方向。这里展示的是一个简化版的例子,在实际应用中可能还需要加入更多保护机制和其他功能性代码。 ```c int main(void) { /* MCU Configuration */ HAL_Init(); SystemClock_Config(); // 系统时钟配置 MX_GPIO_Init(); // GPIO初始化 MX_TIM2_PWM_Init(&htim2); // TIM2 PWM初始化 uint16_t duty_cycle = 500; // 默认占空比50% while (1) { // 改变PWM占空比以调整电机转速 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty_cycle); // 更改IN1-IN4电平状态以改变电机旋转方向 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, SET); // PA0 -> HIGH HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, RESET); // PA1 -> LOW HAL_Delay(2000); // 延迟一段时间观察效果 // 反向运行 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, SET); HAL_Delay(2000); } }
评论 89
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值