TB6612四路电机驱动(STM32与MSP432P401R)内包含432的一定时器多路通道的配置

目录

模块介绍

 原理介绍:

代码工程:

STM32版

电机初始化函数

讲解:

电机驱动函数

讲解:

MSP432P401R版

电机初始化函数:

讲解:

电机驱动函数:

讲解:

对CCR解释:


模块介绍

该四路电机驱动采用的是未来世界机器人的TB6612FNG四驱电机驱动器

 原理介绍:

采用的是PWM输出控制,只需一定时器的四路通道即可

代码工程:

STM32版

电机初始化函数

/*************************************
**函数功能:电机初始化函数
**参数:
**
**************************************/
void Motor_Config(void)	 //定时器4的1、2、3、4通道
{	 
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//打开TIM4外设时钟                     
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

	TIM_TimeBaseStructure.TIM_Period = 999;
	TIM_TimeBaseStructure.TIM_Prescaler = 71;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

	
	TIM_OCInitStructure.TIM_Pulse = 0;  
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OC1Init(TIM4, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能的预装载寄存器
	
	TIM_OCInitStructure.TIM_Pulse = 0; 
	TIM_OC2Init(TIM4, &TIM_OCInitStructure); 
	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能的预装载寄存器
	
	TIM_OCInitStructure.TIM_Pulse = 0;  
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OC3Init(TIM4, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能的预装载寄存器
	
	TIM_OCInitStructure.TIM_Pulse = 0; 
	TIM_OC4Init(TIM4, &TIM_OCInitStructure); 
	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//使能的预装载寄存器
	
	TIM_ARRPreloadConfig(TIM4, ENABLE);	//使能定时器4
	TIM_Cmd(TIM4, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure); 

	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_Init(GPIOD, &GPIO_InitStructure);
	
}

讲解:

目的是对电机进行初始化配置,包括定时器、PWM 输出通道和GPIO管脚的设置。

首先,通过打开定时器4外设时钟和GPIOB、GPIOD外设时钟来使能相应的外设。

然后,配置定时器 TIM4 的基本参数,包括计数周期(TIM_Period)、预分频系数(TIM_Prescaler)、时钟分割(TIM_ClockDivision)和计数模式(TIM_CounterMode)。

接着,初始化 TIM4 的四个输出比较通道(TIM_OC1、TIM_OC2、TIM_OC3、TIM_OC4),设置输出模式为 PWM1 模式,并使能输出状态。

然后,分别配置四个输出比较通道的初始脉冲值(TIM_Pulse)、输出极性(TIM_OCPolarity)和预装载寄存器的使能。

最后,使能定时器4的自动重装载寄存器的预装载,并启动定时器4。

同时,配置 GPIOB 端口的引脚 PB6、PB7、PB8 和 PB9 为复用推挽输出模式,速度为50MHz。

最后,配置 GPIOD 端口的引脚 PD0、PD1、PD2 和 PD3 为推挽输出模式。

电机驱动函数

/*************************************
**函数功能:电机驱动函数
**参数: Motor_A: 右上轮,Motor_B: 右下轮,Motor_C: 左下轮,Motor_D: 左上轮
**		 (取值范围:-100至100,负值为向后转,正值为向前转)
**方向:PD0控制电机A方向、PD1控制电机B方向,PD2控制电机C方向、PD3控制电机D方向
**************************************/
void motor(int Motor_A, int Motor_B, int Motor_C, int Motor_D)
{
	右上轮方向控制	
	if(Motor_A >= 0) { DIR_A = 0; TIM4->CCR1 =  Motor_A * 10;	}		
	else if(Motor_A < 0) { DIR_A = 1; TIM4->CCR1 =  -Motor_A * 10; }		
右下轮方向控制	
	if(Motor_B >= 0) { DIR_B = 0; TIM4->CCR2 =  Motor_B * 10;	}		
	else if(Motor_B < 0) { DIR_B = 1; TIM4->CCR2 =  -Motor_B * 10; }		
左下轮方向控制	
	if(Motor_C >= 0) { DIR_C = 0; TIM4->CCR3 =  Motor_C * 10;	}		
	else if(Motor_C < 0) { DIR_C = 1; TIM4->CCR3 =  -Motor_C * 10; }		
左上轮方向控制	
	if(Motor_D >= 0) { DIR_D = 0; TIM4->CCR4 =  Motor_D * 10;	}		
	else if(Motor_D < 0) { DIR_D = 1; TIM4->CCR4 =  -Motor_D * 10; }
}

讲解:

首先,针对右上轮电机(Motor_A),根据 Motor_A 的值判断电机的转动方向,如果 Motor_A 大于等于0,则设置 DIR_A 为0,表示正向转动;如果 Motor_A 小于0,则设置 DIR_A 为1,表示反向转动。然后,通过改变 TIM4 的通道1(CCR1)的脉冲值来调整电机的转速,脉冲值的大小是 Motor_A 乘以10。

接着,根据相同的逻辑,分别控制右下轮电机(Motor_B)、左下轮电机(Motor_C)和左上轮电机(Motor_D)的方向和转速。

总结:该函数根据传入的参数控制四个电机的转动方向和转速,通过改变定时器 TIM4 的输出比较寄存器的脉冲值来控制电机的转速,通过改变相应的引脚状态来控制电机的转动方向。

 这样通过对motor函数的的调用,即可完成对电机的驱动

MSP432P401R版

不明白定时器的可以参考:MSP432第四讲:定时器_三马分享家的博客-CSDN博客

电机初始化函数:

void TimA1_PWM_Init(void)
{
    
	/*初始化引脚*/
     GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4 | GPIO_PIN6 | GPIO_PIN5 | GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
		GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5);
    Timer_A_PWMConfig pwmConfig;
    /*定时器PWM初始化*/
    pwmConfig.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;             //时钟源
    pwmConfig.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_64;                            //时钟分频 范围1-64
    pwmConfig.timerPeriod = 4499;  	//自动重装载值(ARR)
    
		pwmConfig.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1; //通道一 (引脚定义)
    pwmConfig.compareOutputMode = TIMER_A_OUTPUTMODE_TOGGLE_SET;   //输出模式
		MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);

    pwmConfig.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;//通道2
    MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);

    pwmConfig.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_3;//通道3
    MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);

    pwmConfig.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_4;//通道4
    MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);
		motor(0,0,0,0);
}

讲解:

首先,该函数调用了 GPIO_setAsPeripheralModuleFunctionOutputPin() 函数来初始化引脚,将 P2.4、P2.5、P2.6、P2.7 设置为主模块功能输出引脚,并将 P4.2、P4.3、P4.4、P4.5 设置为输出引脚。

接着,定义了一个 Timer_A_PWMConfig 结构体 pwmConfig,用于配置定时器PWM的参数。

然后,设置了定时器的时钟源为 SMCLK,时钟分频为 64,定时器自动重装载值为 4499(timerPeriod)。

接下来,通过设置 pwmConfigcompareRegister 参数为 TIMER_A_CAPTURECOMPARE_REGISTER_1,即通道一,设置输出模式为 TIMER_A_OUTPUTMODE_TOGGLE_SET,并调用 MAP_Timer_A_generatePWM() 函数生成 PWM 信号。通过相同的方式,设置通道二、通道三和通道四的 PWM 信号。

电机驱动函数:

void motor(int Motor_A, int Motor_B, int Motor_C, int Motor_D)
{
    右上轮方向控制
    if (Motor_A >= 0) {
		GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN2);
        TIMER_A0->CCR[1] = Motor_A * 10;
    } else if (Motor_A < 0) {
		GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN2);
        TIMER_A0->CCR[1] = -Motor_A * 10;
    }
    右下轮方向控制
    if (Motor_B >= 0) {
				GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN3);
        TIMER_A0->CCR[2] = Motor_B * 10;
    } else if (Motor_B < 0) {   
		GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN3);
        TIMER_A0->CCR[2] = -Motor_B * 10;
    }

    左下轮方向控制
    if (Motor_C >= 0) {   
		GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN4);
        TIMER_A0->CCR[3] = Motor_C * 10;
    } else if (Motor_C < 0) {    
		GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN4);
        TIMER_A0->CCR[3] = -Motor_C * 10;
    }

    左上轮方向控制
    if (Motor_D >= 0) {      
		GPIO_setOutputLowOnPin(GPIO_PORT_P4,GPIO_PIN5);
        TIMER_A0->CCR[4] = Motor_D * 10;
    } else if (Motor_D < 0) {
		GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN5);
        TIMER_A0->CCR[4] = -Motor_D * 10;
    }
}

讲解:

函数接受四个整数参数 Motor_AMotor_BMotor_CMotor_D,分别表示四个电机的转速。正数表示正转速,负数表示反转速,0 表示停止转动。

首先,根据 Motor_A 的值判断右上轮的转速和方向。如果 Motor_A >= 0,则将 P4.2 引脚输出低电平,表示正转方向;然后通过 TIMER_A0->CCR[1] 设置通道一的占空比为 Motor_A * 10,即转速大小。如果 Motor_A < 0,则将 P4.2 引脚输出高电平,表示反转方向;然后通过 TIMER_A0->CCR[1] 设置通道一的占空比为 -Motor_A * 10,即转速大小。

接着,根据同样的逻辑判断右下轮、左下轮和左上轮的转速和方向,并设置相应的引脚状态和占空比。右下轮使用 P4.3 引脚和通道二,左下轮使用 P4.4 引脚和通道三,左上轮使用 P4.5 引脚和通道四。

对CCR解释:

CCR 是 Timer_A 的 Capture/Compare Register(捕获/比较寄存器)的缩写。

Timer_A 是一个计时器/计数器,用于生成定时和计数操作。它具有多个捕获/比较通道(Capture/Compare Channels),每个通道都有一个对应的 CCR 寄存器。这些寄存器可以用来设置定时器的比较值或捕获值,并与定时器的计数值进行比较。

在这段代码中,使用了 Timer_A0 模块的 CCR[1]、CCR[2]、CCR[3] 和 CCR[4] 寄存器来控制四个电机的转速。通过设置这些寄存器的值,可以调整 PWM(脉冲宽度调制)信号的占空比,从而控制电机的转速。

具体地,通过设置 CCR[1] 的值,可以控制右上轮电机的转速;CCR[2] 控制右下轮电机的转速;CCR[3] 控制左下轮电机的转速;CCR[4] 控制左上轮电机的转速。

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值