131 lines
3.1 KiB
C
131 lines
3.1 KiB
C
/******************** (C) COPYRIGHT 2023 GeekRebot *****************************
|
||
* File Name : moto.c
|
||
* Current Version : V1.0 & ST 3.5.0
|
||
* Author : zhanli 719901725@qq.com
|
||
* Date of Issued : 2023.04.06 zhanli: Create
|
||
* Comments : 直流减速电机控制
|
||
********************************************************************************/
|
||
#include "moto.h"
|
||
#include "bsp_sys.h"
|
||
/**----------------------------------------------------------------------
|
||
硬件连接说明:
|
||
|
||
// 电机控制
|
||
PB0 -> R_PWM
|
||
PB13-> R_IN2
|
||
PB12-> R_IN1
|
||
|
||
PB1 -> L_PWM
|
||
PB14-> L_IN2
|
||
PB15-> L_IN1
|
||
|
||
PA0 -> LA
|
||
PA1 -> LB
|
||
|
||
// 编码器
|
||
|
||
// 左电机编码器计数
|
||
PA0----接 编码器A相 或者电机驱动的B2B标识
|
||
PA1----接 编码器B相 或者电机驱动的B2A标识
|
||
|
||
// 右电机编码器计数
|
||
PB6----接 编码器B相 或者电机驱动的B1A标识
|
||
PB7----接 编码器A相 或者电机驱动的B1B标识
|
||
|
||
TB6612驱动中, 小车车头对应前进方向, Left对应A,Right对应B
|
||
*---------------------------------------------------------------------**/
|
||
|
||
//PWM在timer3里配置
|
||
void MOTO_GPIO_Init(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*开启GPIO的外设时钟*/
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; /*选择要控制的GPIO引脚*/
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */
|
||
GPIO_Init(GPIOB, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/
|
||
}
|
||
|
||
//左电机
|
||
void MOTO_Left(char state)
|
||
{
|
||
if(state == GO)//左前电机前进
|
||
{
|
||
GPIO_SetBits(GPIOB,GPIO_Pin_12);
|
||
GPIO_SetBits(GPIOB,GPIO_Pin_14);
|
||
GPIO_SetBits(GPIOB,GPIO_Pin_15);
|
||
TIM3->CCR4=1500;
|
||
}
|
||
if(state == BACK)//左前电机后退
|
||
{
|
||
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
|
||
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
|
||
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
|
||
TIM3->CCR4=1500;
|
||
}
|
||
if(state == STOP)//停转
|
||
{
|
||
TIM3->CCR4=0; //更新pwm
|
||
}
|
||
}
|
||
|
||
//右电机
|
||
void MOTO_Right(char state)
|
||
{
|
||
if(state == GO)//左前电机前进
|
||
{
|
||
GPIO_SetBits(GPIOB,GPIO_Pin_13);
|
||
|
||
TIM3->CCR3=1500; //更新pwm
|
||
}
|
||
if(state == BACK)//左前电机后退
|
||
{
|
||
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
|
||
|
||
TIM3->CCR3=1500; //更新pwm
|
||
}
|
||
if(state == STOP)//停转
|
||
{
|
||
TIM3->CCR3=0; //更新pwm
|
||
}
|
||
}
|
||
|
||
//***************************前进***************************//
|
||
//只要配置()的状态就可以改变电机转动方向
|
||
void Car_Go(void)
|
||
{
|
||
//左电机 前 //右电机 前
|
||
MOTO_Left(GO); MOTO_Right(GO);
|
||
}
|
||
|
||
void Car_Back(void)
|
||
{
|
||
//左电机 后 //右电机 后
|
||
MOTO_Left(BACK); MOTO_Right(BACK);
|
||
}
|
||
|
||
//***************************向左转圈***************************//
|
||
void Car_Turn_Left(void)
|
||
{
|
||
//左电机 后 //右电机 前
|
||
MOTO_Left(BACK); MOTO_Right(GO);
|
||
}
|
||
|
||
|
||
//***************************向右转圈***************************//
|
||
void Car_Turn_Right(void)
|
||
{
|
||
//左电机 前 //右电机 后
|
||
MOTO_Left(GO); MOTO_Right(BACK);
|
||
}
|
||
|
||
//***************************停车***************************//
|
||
void Car_Stop(void)
|
||
{
|
||
MOTO_Left(STOP);
|
||
MOTO_Right(STOP);
|
||
}
|
||
|
||
|
||
|