最近学习了通过pwm驱动直流电机,写篇博客分享一下学习经验^_^~
TB6612引脚介绍
PWMA:为电机提供pwm脉冲,也就是控制电机速度
AIN1和AIN2:控制电机的正反转
AIN1 | AIN2 | 电机转动 |
0 | 1 | 正转 |
1 | 0 | 反转 |
接线图 :
程序分享:
#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)
{
}
}