项目三:利用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模块,控制小车直流电机运动