资讯专栏INFORMATION COLUMN

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

taowen / 2959人阅读

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

一、驱动芯片介绍

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.ucloud.cn/yun/118887.html

相关文章

  • 项目六:定时器一产生PWM控制舵机

    摘要:本次实验的采用的舵机是度伺服,控制关系如下二舵机电路图三高级定时器产生波相比普通定时器初始化中需要多加两句重复计数器的值主输出使能四代码电机初始化延迟初始化电机管脚初始化寻迹管脚初始化。 一、舵机工作原理     控制信号由接收机的通道进入信号调制芯片,获得直流的偏置电压。它内部有一个基准电...

    kelvinlee 评论0 收藏0
  • 基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写)

    基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让这两块板子实现四个电机上面转动呢,还要加入避障模块,自己一开始一头雾水,于是开始了漫长的借鉴之路,首先作为一个开发者,我觉得学习的地方首选是B站,所以我找了相关的做智能小车的视频 首先是B站智能小车教...

    CoffeX 评论0 收藏0
  • 10. STM32——PWM 控制舵机(超声波感应开盖垃圾桶)

    摘要:中央对齐模式向上计数时当时通道为无效电平,否则为有效电平向下计数时一旦通道为有效电平,否则为无效电平。一般来说,舵机接收的信号频率为,即周期为。 STM32——P...

    jasperyang 评论0 收藏0
  • STM32遥控小车下位机及硬件连接部分(Keil MDK5平台的C++编程)

    摘要:同时,该模块中包括小车的加减速以及小车的转向功能。在串口中断处理程序中,由于我设定的主机指令以一个字节为单位,故串口检测到一个字节的接收时就立即判断当前指令对应的动作,指令与小车动作的映射见上位机编写部分。 ...

    mykurisu 评论0 收藏0
  • 项目五:基于stm32f103的寻迹小车

    摘要:前言传感器工作原理代码部分电机初始化延迟初始化电机管脚初始化寻迹管脚初始化。电机管脚初始化函数定义管脚的结构体打开所要使用的时钟将管脚特殊功能关掉配置管脚的参数,用于驱动电机。配置管脚的参数红外传感器。 前言:传感器工作原理: 代码部分:    main.c #include motor....

    kyanag 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<