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
やっと!! ! コードについて詳しくコメントします。後で理解できるといいのですが!