项目三:利用PWM波和GPIO控制电机

Posted 鑫仔_要变强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目三:利用PWM波和GPIO控制电机相关的知识,希望对你有一定的参考价值。

一、驱动芯片介绍

TB6612 的的用法:
     TB6612 是双驱动,也就是可以驱动两个电机下面分别是控制两个电机的 IO 口:STBY 口接单片机的 IO 口   ,清零电机全部停止,置 1 /0通过 AIN1 AIN2,BIN1,BIN2 来控制正反转。
二、真值表

三、电路图 

 

 四、PWM注意事项

(1)器件输出状态在驱动/制动之间切换时,电机转速和 PWM 占空比之间能保持较好的线性关系,其运行控制效果好于器件在驱动/停止状态之间切换,所以表 1 中的 INl/IN2 一般不采用 L/L 控制组合。

(2)fPWM 较高时,电机运行连续平稳、噪音小,但器件功耗会随频率升高而增大;fPWM 较低时,利于降低功耗,并能提高调速线性度,但过低的频率可能导致电机转动连贯性的降低。通常 fPWM>1 kHz 时,器件能够稳定的控制电机。

五、废话不多说上代码!!

main.c

#include "motor.h"
#include "stdio.h"
#include "delay.h"
#include "stm32f10x.h"
 u8 UART3_data,UART1_data;
 u8 UART3_rcv[20],UART3_rcv_count;
 u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;
int main(void)
{
//	int left_speed=5,right_speed=5;
	int speed=5;
	
	delay_init();
	GPIO_init();
	TIME4_init(7199,10);
	car_go(speed);
	delay_s(2);
	car_left(0,2);
	delay_s(1);
	car_go(speed);
	delay_s(2);
	car_stop();
	
}

motor.c

#include "motor.h"

//电机GPIO管脚初始化函数
/**********************************************************************************/
void GPIO_init(void)
{
	//定义管脚的结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	//打开所要使用的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//将管脚PB4特殊功能关掉
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	//配置PB4\\5\\8\\9管脚的参数,用于驱动电机
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	//初始化PB4\\5\\8\\9的管脚
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	//配置PB6\\7管脚的参数,用于产生PWM波
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	//初始化PB6\\7的管脚
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	//管脚全部先置零
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	
}
/***************************************************************************************************************/

//TIME4的初始化函数
/********************************************************************************************/
void TIME4_init(int presc,int arr)
{
	 //定义定时器的结构体
	 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	 //定义定时器PWM输出通道的结构体
	 TIM_OCInitTypeDef TIM_OCInitStruct;
	 //打开TIME4的时钟
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	 //配置TIME4结构体的参数
	 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
	 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	 TIM_TimeBaseInitStruct.TIM_Prescaler = presc;
	 TIM_TimeBaseInitStruct.TIM_Period =arr; 	 
	 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
	 //配置TIME4通道结构体的参数
	 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
	 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	 TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable ;
	 TIM_OCInitStruct.TIM_Pulse =0;
	  //TIME4通道1初始化
   TIM_OC1Init(TIM4, &TIM_OCInitStruct);
	 //使能TIME4通道1的预存寄存器
	 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
   //TIME4通道2初始化
   TIM_OC2Init(TIM4, &TIM_OCInitStruct);
	 //使能TIME4通道2的预存寄存器
   TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
   //使能TIME4
	 TIM_Cmd(TIM4, ENABLE);
}
/*******************************************************************************************************/

//小车前进函数
/********************************************************************************************************/
void car_go(int speed)
{  
	motor_left_speed(speed);
  motor_right_speed(speed);
	GPIO_SetBits(GPIOB, GPIO_Pin_9);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	GPIO_SetBits(GPIOB, GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
/****************************************************************************************************************/


//小车左转函数
/****************************************************************************************************************/

void car_left(int motor_left_speed,int motor_right_speed )
{  
  motor_left_speed(motor_left_speed);
  motor_right_speed(motor_right_speed);
	GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	GPIO_SetBits(GPIOB, GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
/****************************************************************************************************************/

//小车右转函数
/****************************************************************************************************************/
void car_right(int motor_left_speed,int motor_right_speed )
{  
	motor_left_speed(motor_left_speed);
  motor_right_speed(motor_right_speed);
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  GPIO_SetBits(GPIOB, GPIO_Pin_9);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
/****************************************************************************************************************/

//小车停止函数
/****************************************************************************************************************/
void car_stop(void)
{  
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
/****************************************************************************************************************/

//小车后退函数
/****************************************************************************************************************/
void car_back(int speed)
{  
	motor_left_speed(speed);
  motor_right_speed(speed);
	GPIO_SetBits(GPIOB, GPIO_Pin_8);
  GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
  GPIO_ResetBits(GPIOB,GPIO_Pin_4);
}
/****************************************************************************************************************/

//延迟一秒函数
/****************************************************************************************************************/
void delay_s(int s)
{
	for(;s>0;s--)
	{
	delay_ms(1000);
	}
}
/****************************************************************************************************************/

motor.h

#ifndef __MOTOR_H__
#define __MOTOR_H__

//需要调用的库
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "delay.h"

//宏定义
#define PERIOD 10  //周期为10ms,频率为1Khz
#define motor_left_speed(left_speed)   {TIM_SetCompare1(TIM4, left_speed);}  //将设置PWMA的占空比的函数宏定义
#define motor_right_speed(right_speed)  {TIM_SetCompare2(TIM4, right_speed);}//将设置PWMB的占空比的函数宏定义

//自定义的函数
void GPIO_init(void);
void TIME4_init(int presc,int arr);
void car_go(int speed);
void car_left(int motor_left_speed,int motor_right_speed );
void car_right(int motor_left_speed,int motor_right_speed );
void car_stop(void);
void car_back(int speed);
void delay_s(int s);

#endif

最后!!!我把代码注释详细点,希望以后看的懂!

以上是关于项目三:利用PWM波和GPIO控制电机的主要内容,如果未能解决你的问题,请参考以下文章

实例3,stc8a利用内置的PWM模块,控制小车直流电机运动

怎样利用51单片机发生PWM,通过调节PWM的占空比控制可控硅调节电机转速,使转速平稳?

怎么利用单片机 红外遥控 实现小车向左转和向右转

Verilog直流电机的pwm控制设计

在线仿真Arduino UNO PWM 控制直流电机转速

Jetson Nano驱动机器人的左右两路电机