一、驅動芯片介紹
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
最后!!!我把代碼注釋詳細點,希望以后看的懂!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296949.html
標籤:其他
