ROS移动机器人——32电机驱动

驱动电机,我们在这里使用TB6612来驱动电机,同时,电机的内部我们有编码器进行计次

输出比较

 cnt,就是时基单元寄存器

ccr,在cnt下方,为捕获比较寄存器,cc是捕获比较的意思,r就是寄存器

他就可以在捕获与比较之间进行切换

cnt计数是自增的,CCR是我们给定的一个值,当cnt大于ccr 小于ccr 等于ccr时,CH1通道就会对应的置1 / 0 / 1 / 0,为我们需要用这个来输出PWM波形

PWM参数: 频率 = 1 / ts   占空比 = ton / ts   分辨率 = 占空比变化

 上图为输出控制OC输出PWM,相同的下面还有3个通道

我们可以控制大小,控制输出的REF的高低电平 

输出比较模式

 PWM的结构我们之前说过,就不过多介绍,看一张图我们就能明白

直流电机

有两个电极,正接正转,反接反转,我们看看TB6612电路

 

所以我们可以看出,想要驱动一个电机,我们需要配置3个IO口,一个PWM,两个AIN1/2 

TB6612.h

#ifndef TB6612_H
#define TB6612_H


#include "sys.h"


/*B0 口*/
#define AIN1_GPIO_PIN		GPIO_Pin_3
#define AIN1_GPIO_PORT	GPIOB
#define AIN1_GPIO_CLK		RCC_APB2Periph_GPIOB

/*输出高电平*/
#define AIN1_ON			GPIO_SetBits(AIN1_GPIO_PORT,AIN1_GPIO_PIN)
/*输出低电平*/
#define AIN1_OFF		GPIO_ResetBits(AIN1_GPIO_PORT,AIN1_GPIO_PIN)


/*B1口*/
#define AIN2_GPIO_PIN		GPIO_Pin_4
#define AIN2_GPIO_PORT	GPIOA
#define AIN2_GPIO_CLK		RCC_APB2Periph_GPIOA

/*高电平*/
#define AIN2_ON			GPIO_SetBits(AIN2_GPIO_PORT,AIN2_GPIO_PIN)
/*低电平*/
#define AIN2_OFF		GPIO_ResetBits(AIN2_GPIO_PORT,AIN2_GPIO_PIN)


/*B10口*/
#define BIN1_GPIO_PIN		GPIO_Pin_5
#define BIN1_GPIO_PORT	GPIOA
#define BIN1_GPIO_CLK		RCC_APB2Periph_GPIOA


#define BIN1_ON			GPIO_SetBits(BIN1_GPIO_PORT,BIN1_GPIO_PIN)

#define BIN1_OFF		GPIO_ResetBits(BIN1_GPIO_PORT,BIN1_GPIO_PIN)


/*B11口*/
#define BIN2_GPIO_PIN		GPIO_Pin_12
#define BIN2_GPIO_PORT	GPIOB
#define BIN2_GPIO_CLK		RCC_APB2Periph_GPIOB


#define BIN2_ON			GPIO_SetBits(BIN2_GPIO_PORT,BIN2_GPIO_PIN)

#define BIN2_OFF		GPIO_ResetBits(BIN2_GPIO_PORT,BIN2_GPIO_PIN)  


void AIN1_GPIO_Config(void);
void AIN2_GPIO_Config(void);
void PWMA_STOP(void);
void PWMA_Forward(int a);
void PWMA_Reverse(int a);
      
void BIN1_GPIO_Config(void);
void BIN2_GPIO_Config(void);
void PWMB_STOP(void);
void PWMB_Forward(int a);
void PWMB_Reverse(int a);

void TB6612_GPIO_Config(void);
void STOP(void);
void Forward(int a);
void Reverse(int a);
#endif

TB6612.c

#include "TB6612.h"
#include "base_generaltim.h"
#include "stm32f10x.h"


// 开启AIN1,GPIO
void AIN1_GPIO_Config(void)
{
	GPIO_InitTypeDef	GPIO_InitStruct;

	RCC_APB2PeriphClockCmd(AIN1_GPIO_CLK,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = AIN1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//使用推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(AIN1_GPIO_PORT,&GPIO_InitStruct);
}

// 开启AIN2
void AIN2_GPIO_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStruct;

	RCC_APB2PeriphClockCmd(AIN2_GPIO_CLK,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = AIN2_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(AIN2_GPIO_PORT,&GPIO_InitStruct);
}

void BIN1_GPIO_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStruct;

	RCC_APB2PeriphClockCmd(BIN1_GPIO_CLK,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = BIN1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(BIN1_GPIO_PORT,&GPIO_InitStruct);
}

void BIN2_GPIO_Config(void)
{
	GPIO_InitTypeDef		GPIO_InitStruct;

	RCC_APB2PeriphClockCmd(BIN2_GPIO_CLK,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = BIN2_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(BIN2_GPIO_PORT,&GPIO_InitStruct);
}

// 开启两个IO口,控制对应输出口
void TB6612_GPIO_Config(void)
{
   AIN1_GPIO_Config();
   AIN2_GPIO_Config();
   BIN1_GPIO_Config();
   BIN2_GPIO_Config();
}


void PWMA_STOP(void)//
{
	AIN1_OFF;
	AIN2_OFF;
	GENERAL_ccr1_Mode_Config(0); //PWM输出
//PWM的初始化,在前两个函数,放在了主函数
} 

void PWMA_Forward(int a)//01ΪÕýת
{
	AIN1_OFF;
	AIN2_ON;
	GENERAL_ccr1_Mode_Config(a);

}

void PWMA_Reverse(int a)//10Ϊ·´×ª
{
	AIN1_ON;
	AIN2_OFF;
	GENERAL_ccr1_Mode_Config(a);

}


void PWMB_STOP(void)//00Ϊֹͣ
{
	BIN1_OFF;
	BIN2_OFF;
	
	GENERAL_ccr2_Mode_Config(0);
}

void PWMB_Forward(int a)//01ΪÕýת
{
	BIN1_OFF;
	BIN2_ON;
	
	GENERAL_ccr2_Mode_Config(a);
}

void PWMB_Reverse(int a)//10Ϊ·´×ª
{
	BIN1_ON;
	BIN2_OFF;
	
	GENERAL_ccr2_Mode_Config(a);
}

void STOP(void)
{
	PWMA_STOP();
	PWMB_STOP();
}

void Forward(int a)
{
	PWMA_Forward(a);
	PWMB_Forward(a);
}

void Reverse(int a)
{
	PWMA_Reverse(a);
	PWMB_Reverse(a);
}


我们也可以直接配置,然后在Compare里面来进行设定空比(调速)

同时也要进行对电机内编码器的计算

开启IC输出比较,进行cnt计算编码器计次,通过清零读数来计算编码器脉冲,计算编码器最主要的用途是用于PID的使用,我们下一节再说明

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/128568089