STM32-微项目03-pwm控制直流电机运行

一,项目目标

实现利用STM32F103C8T6+TB6612,输出不同占空比输出的PWM波,从而实现电机不同转速的运行、正反转的功能;

 

 二、硬件涉及

1,STM32核心板

2,TB6612直流电机驱动模块

3,直流电机 

三、硬件接线涉及

1,先看TB6612直流电机驱动模块:

①驱动模块是具备两路PWM输入,两路out口,两路AIN,可以实现对两个不同电机的转速控制、方向控制;

②模块引脚

仅使用第一路电机

PWMA控制电机占空比、AIN1 AIN2控制输入、A01 A02电机驱动

核心点:PWM控制电机转速、AIN控制转向、AO用于输出

 

2,STM32核心板接线

四、前置知识介绍

1,定时器输出比较,输出PWM波

见微项目02介绍

 五、代码模块介绍

1,思路分析:

①开始RCC时钟,GPIO和TIM2时钟模块

②开启TIM2时钟输入源为内部72MHZ

③配置时钟模块,ARR和PSC模块

④输出比较模块配置

⑤配置TIM2输出端口的GPIO,复用推挽输出

⑥开始使能时钟

⑦动态配置CCR

⑧配置PA4,PA5控制输出、配置GPIO模块

下面开始代码介绍:

①配置GPIO时钟和TIM2的模块时钟

//配置时钟RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

②配置TIM2的时钟源,内部时钟72MHZ

//配置时钟源为RCC -72mhz
	TIM_InternalClockConfig(TIM2);

③配置时基模块,主要是ARR和PSC

	//配置时基单元数值
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;  //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;  //psc
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);

④输出比较单元配置

	//输出比较单元配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1 ;
	
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High ;
	
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=0;//设置CCR数值

	TIM_OC3Init(TIM2, &TIM_OCInitStruct);

⑤配置PWM输出的端口PA2的GPIO  ---复用推挽输出

	// 配置PA2端口
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);

⑥开启时钟

//启动定时器
	TIM_Cmd(TIM2,ENABLE);

⑦动态配置CCR函数

void pwm_setcompare( uint16_t compare)
{
	TIM_SetCompare3(TIM2, compare);
}

⑧配置PA4,PA5控制输出、配置GPIO模块---推挽输出 

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);

到此核心代码已经配置完成

具体在代码各个模块的体现

PWM模块

#include "stm32f10x.h"                  // Device header

void pwm_init(void)
{
	//配置时钟RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//配置时钟源为RCC -72mhz
	TIM_InternalClockConfig(TIM2);
	
	//配置时基单元数值
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;  //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;  //psc
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	//输出比较单元配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1 ;
	
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High ;
	
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=0;//设置CCR数值

	TIM_OC3Init(TIM2, &TIM_OCInitStruct);
	
	// 配置PA2端口
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);
	
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void pwm_setcompare( uint16_t compare)
{
	TIM_SetCompare3(TIM2, compare);
}

motor模块配置,对于pwm模块二次封装和调整

#include "stm32f10x.h"                  // Device header
#include "pwm.h" 

void motor_init(void)
{
	pwm_init();
	//初始化方向控制的PA4 PA5
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);
	
}

void motor_setspeed(int8_t speed)
{
	if(speed >=0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_4);
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		pwm_setcompare(speed);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_5);
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
		pwm_setcompare(-speed);
	}
}

在主函数的中简单配置

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.H"
#include "motor.H"
#include "key.H"



uint8_t keyn=0;
int8_t speed=0;
int main()
{
	
	OLED_Init();
	motor_init();
	keyinit();
	

	OLED_ShowString(1,1,"SPEED");
	OLED_ShowSignedNum(2,1,speed,3);
	while(1)
	{
		keyn=key_getnum();
		if(keyn==1)
		{
			speed+=20;
			if(speed>100)
			{
				speed=-100;
			}
			OLED_ShowSignedNum(2,1,speed,3);
		}
		motor_setspeed(speed);
	}
}

  • 7
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
stm32cubemx是ST官方提供的一款基于STM32控制器的代码生成工具,它可以通过图形化界面配置STM32控制器的各个模块,其中包括PWM模块。PWM(Pulse Width Modulation)控制技术是一种通过改变电信号占空比来控制电机转速的方法,通过快速调整高低电平间隔时间比例实现电机转速精确控制。 在使用stm32cubemx进行PWM控制直流电机转速的过程中,首先需要选择合适的STM32控制器,然后通过图形化配置界面对PWM相关寄存器进行设置,包括控制位宽、定时器预分频、定时器周期、占空比等参数。接着,通过编写一定的控制算法和程序逻辑,根据物理实验结果调整参数,实现电机转速的精确控制。 具体地,PWM控制直流电机转速的实现过程如下:首先,在GPIO配置界面中选择需要控制PWM的引脚,设置为PWM输出模式,接着进入TIMx配置界面,配置计数器的定时器预分频和计数周期,选择PWM模式为Edge-aligned,PWM输出为单极性,PWM极性为低电平有效,最后选择APB1时钟频率并生成代码。然后,在代码中编写PWM控制函数,通过改变占空比实现直流电机转速的控制,最后在主函数中调用PWM控制函数即可。 总之,基于stm32cubemx的PWM控制直流电机转速需要进行一系列的配置和编程,但是这种方法配置简单,实现方便,能够快速实现精确的电机转速控制,更加符合现代工业应用需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值