STM32通过TB6612驱动直流电机

 最近学习了通过pwm驱动直流电机,写篇博客分享一下学习经验^_^~

TB6612引脚介绍

 详细介绍可以看我的上一篇文章 TB6612介绍icon-default.png?t=O83Ahttps://blog.csdn.net/qq_69110655/article/details/144058892?fromshare=blogdetail&sharetype=blogdetail&sharerId=144058892&sharerefer=PC&sharesource=qq_69110655&sharefrom=from_link

PWMA:为电机提供pwm脉冲,也就是控制电机速度

AIN1和AIN2:控制电机的正反转

AIN1AIN2电机转动
01正转
10反转

接线图 :

 

程序分享:

#include "stm32f10x.h"

/*初始化PWM*/
void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 开启TIM2的时钟
	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 = 72-1;	 // 预分频(PSC值)			
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;// 重复计数器,tim2为通用定时器,在这里用不到这个参数,暂时设置为0
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); // 初始化
	
	/*输出比较初始化*/
	TIM_OCInitTypeDef TIM_OCInitStruct;              // 定义初始化结构体
	TIM_OCStructInit (&TIM_OCInitStruct);			 // 将结构体所有成员赋初始值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;   // 输出比较模式选择PWM模式1
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;   // 输出极性,选择为高,若选择极性为低,则输出高低电平取反
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
	TIM_OCInitStruct.TIM_Pulse = 0;					 // 初始的CCR值(比较寄存器)
	TIM_OC2Init(TIM2, &TIM_OCInitStruct);       // 初始化
	
	/*TIM2使能*/
	TIM_Cmd(TIM2, ENABLE);                      // 启动定时器
}
/*引脚初始化*/
void Pin_Init(void)
{
	// pwm输出引脚
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;  // 引脚输出模式为复用输出推挽
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;        // PA0引脚
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  // 引脚输出模式为推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // PB0 和 PB1
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);	
}
/*电机控制函数*/
void Motor_Run(int16_t speed) // speed 可以理解为电机的运动速度
{
	speed = speed > 100 ? 100 : (speed < -100 ? -100 : speed); // 限幅 即:将speed限定在[-100, 100]之间
	if(speed >= 0)   // 大于0定义为正转
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_0);
		GPIO_ResetBits(GPIOB, GPIO_Pin_1);
		TIM_SetCompare2(TIM2, speed);  // 设置TIM2 通道2的比较寄存器值,即CCR 
		                               //(因为计数周期ARR的值设置为100,这里也可以理解为设置pwm占空比
	}
	else if(speed < 0)  // 小于0定义为反转
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_1);
		GPIO_ResetBits(GPIOB, GPIO_Pin_0);
		TIM_SetCompare2(TIM2, -speed); // 设置TIM2 通道2的比较寄存器值,即CCR 
		                               //(因为计数周期ARR的值设置为100,这里也可以理解为设置pwm占空比
	}
}

int main(void)
{
	Pin_Init();  // 初始化引脚
	PWM_Init();  // 初始化pwm
	
	Motor_Run(50); // 驱动电机 (正转,速度为50)速度范围【-100~100】负数为反转
 
	while(1)
	{
		
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值