【STM32+HAL+Proteus】系列学习教程---PWM(电机控制TB6612)

本文介绍了如何使用STM32CubeMX配置定时器3生成PWM信号,控制TB6612FNG芯片驱动电机的转速、方向,通过GPIO和按键实现电机的加速、减速、正转和反转。然而,仿真中遇到PA7管脚映射问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 实现目标

1、利用定时器输出PWM

2、学会STM32CubeMX软件输出PWM的配置

3、具体目标:利用定时器3的通道2(部分重映射到PB5管脚)输出1KHz的矩形波,实现电机转速控制(加速、减速、正转、反转)。


一、TB6612 芯片简介

        TB6612FNG是东芝半导体的一款驱动电机的芯片。一个TB6612FNG可以驱动两个电机,每一个驱动都有两个逻辑输入引脚,一个输出引脚和一个PWM引脚。可以通过给两个逻辑输入引脚不同的电平来控制电机的运行状态,通过PWM输入引脚实现电机调速。

1、芯片内部结构图

2、引脚简介

        使用时VM接电机电源的正极,GND接电机电源的负极。IN1和IN2接逻辑输入,PWM接PWM输出引脚。O1和O2接电机的正负极。

3、控制逻辑

二、原理图设计

见仿真图

三、STM32CubeMX 配置

1.定时器3时钟源

2.PWM及GPIO配置

        

四、程序设计

1.定义一个全局变量

int pwmVal = 500;

2.开启定时器3通道2产生PWM

  /* USER CODE BEGIN 2 */
  
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
  
  /* USER CODE END 2 */

3.按键调节占空比及电机正反转

			if (HAL_GPIO_ReadPin(GPIOB, K1_Pin) == 0)//按键1按下
			{
					while(!HAL_GPIO_ReadPin(GPIOB, K1_Pin));//松手检测
				  pwmVal += 50;      //		pwmVal = pwmVal + 50;	
				  if (pwmVal>= 1000)
							pwmVal= 1000;
			
				  TIM3->CCR2 = pwmVal;   // 调节占空比
			}	
			
			if (HAL_GPIO_ReadPin(GPIOB, K2_Pin) == 0)//按键2按下
			{
					while(!HAL_GPIO_ReadPin(GPIOB, K2_Pin));
				  pwmVal -= 50;				
				  if (pwmVal<= 0)
						 pwmVal= 0;
					
				  TIM3->CCR2 = pwmVal;   // 调节占空比
			}	
			
			if (HAL_GPIO_ReadPin(GPIOB, K3_Pin) == 0)//按键3按下  
			{
					while(!HAL_GPIO_ReadPin(GPIOB, K3_Pin));
					HAL_GPIO_TogglePin(GPIOA, AIN1_Pin);      //控制电机正反转
					HAL_GPIO_TogglePin(GPIOA, AIN2_Pin);
			}	

五、实验现象

开发板上无电机,本项目只作仿真。

六、仿真实现

Protues 8.8 仿真的时候TIM3输出PWM的通道2  不能够管脚重映射,PWM输出在PA7 !!!


总结

### STM32 HAL库实现PWM控制直流电机调速 为了使用STM32 HAL库通过PWM信号来调整直流电机的速度,需要完成几个关键步骤。这包括配置定时器以PWM模式运行以及设置应的GPIO引脚作为PWM输出。 #### 配置定时器用于PWM输出 首先,在`main.c`文件中初始化定时器并将其配置为PWM模式。这里假设选择了TIM2定时器: ```c // 初始化 TIM2 为 PWM 输出模式 static void MX_TIM2_Init(void) { __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim2; // 定时器基本参数结构体定义 TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 83; // 设置预分频值, 假设系统频率72MHz,则此值对应1kHz的PWM频率 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 自动重装载值设定周期数(即占空比最大范围),此处表示1ms内计满一次 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 499; // 初始脉冲宽度,决定初始占空比约为50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } } ``` 上述代码片段展示了如何创建一个基于TIM2定时器的PWM通道,并设置了初步的工作条件[^3]。 #### GPIO引脚配置 接着要确保连接到电机驱动电路的GPIO引脚被正确配置成复用推挽输出方式以便发送PWM波形给H桥或其他类型的电机控制器接口: ```c // 配置 PA0 作为 TIM2 CH1 的 PWM 输出 __HAL_AFIO_REMAP_TIM2_PARTIAL(); // 如果需要的话重新映射部分TIM2引脚 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 这部分代码负责将PA0引脚分配给TIM2_CH1的功能,并启用了内部上拉/下拉电阻[^1]。 #### 控制函数设计 最后一步是编写实际用来改变PWM占空比从而调节电机速度的函数。通常情况下会有一个全局变量存储当前期望的速度等级,该数值可以通过用户输入或者其他算法计算得出;之后根据这个比例更新PWM比较寄存器中的值即可达到目的: ```c void SetMotorSpeed(uint16_t speedPercentage) { uint32_t pulseWidth; /* 将百分比转换为对应的脉宽 */ pulseWidth = ((uint32_t)speedPercentage * (htim2.Init.Period)) / 100U; /* 更新PWM通道的脉宽 */ __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulseWidth); /* 启动PWM输出 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); } int main(void) { /* MCU Initialization ... */ MX_TIM2_Init(); SetMotorSpeed(50); // 设定启动时默认速度为一半 while (1){ // 主循环... } } ``` 以上就是完整的流程说明和示例程序框架,它能够使开发者快速理解怎样运用STM32 HAL库配合PWM技术去操控直流电机运转速率[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面包板扎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值