プロジェクト 3: PWM 波と GPIO を使用してモーターを制御する

1. ドライバーチップのご紹介

TB6612 の使用方法:
     TB6612 は 2 つのモーターを駆動できるデュアル ドライブです. 2 つのモーターを制御する IO ポートは次のとおりです. STBY ポートはシングルチップ マイコンの IO ポートに接続されます. すべてのモーターをリセットします.停止するには、AIN1 と AIN2、BIN1、BIN2 を介して 1/0 を設定し、正転と逆転を制御します。
2. 真理値表

3.回路図 

 

 4. PWM に関する注意事項

(1) デバイスの出力状態がドライブ/ブレーキ間で切り替わるとき、モータ速度と PWM デューティ サイクルの間で良好な線形関係を維持でき、その動作制御効果はデバイスがドライブ/ブレーキ間で切り替わる場合よりも優れています。そのため、表 1 の IN1/IN2 は通常、L/L 制御の組み合わせを使用しません。

(2) fPWM が高い場合、モーターは低ノイズで連続的にスムーズに動作しますが、周波数が高くなるとデバイスの消費電力が増加します。速度調整の直線性が低すぎる 周波数が原因でモーター回転の連続性が低下する場合があります。通常、fPWM>1 kHz の場合、デバイスはモーターを安定して制御できます。

5.ナンセンスなことを言わないで、コードについて話してください! !

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

やっと!! ! コードについて詳しくコメントします。後で理解できるといいのですが!

おすすめ

転載: blog.csdn.net/qq_47541315/article/details/120039523