智能车的电机驱动DRV8833、DRV8833驱动直流电机、DRV8833接线图、DRV8833 PWM、DRV8833驱动代码

以STM32F103C8T6为主控芯片,通过使用DRV8833来驱动直流电机,并用PWM来调节速度。

本文讲了DRV8833的接线、如何输出PWM、以及提供了相关的代码。

相关代码我放最后面了。

最近在用DRV8833这个驱动,但是没用过,不太懂,于是就去网上找相关资料,根据自己的理解发了本文,希望对大家有所帮助。(PS:本人能力有限,如有不对请指出)

前排提醒:

由于驱动直流电机需要的电流很大,单片机I/O的驱动能力是远远达不到的。因此需要使用专用的电机驱动芯片。此款电机驱动芯片即是基于上述的H桥电路。芯片中共有两个全H桥。因此最多可以同时驱动两个直流电机或一个步进电机。(详细的可以看这个佬的:(8条消息) 【电机驱动芯片(H桥、直流电机驱动方式)——DRV8833、TB6612、A4950、L298N的详解与比较】_h桥驱动芯片_默默无闻小菜鸡的博客-CSDN博客

这里我们只讲直流电机

1.引脚问题

电机驱动如上图。

本文用到的引脚及其功能如下图。

 

DRV8833的接线分两种情况:

一共有4个IN。(1)可以四个IN全接输出PWM的引脚                (2)四个IN可以两个接输出PWM的引脚,两个接普通引脚(不需要输出PWM)(文章下面的 2.PWM 里面我举的有例子,不懂可以先去看看),具体用哪个看实际情况。

4个PWM 接线:

        IN4和3  接PA2/PA3(TIM2的通道3和4,可输出PWM)

(只要可以输出PWM的引脚都可以,我自己用的是TIM2和3的通道3和4。请注意,C8T6只有TIM1到TIM4这4个定时器,大家用的时候注意一下,不要用到不存在的定时器)

         GND  接地

         VCC  范围在2.7V到11.8V

         IN2和1  接PB0/PB1(TIM3的通道3和4,可输出PWM)

         EEP  为保护输出,默认不用

         OUT1和2  接一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

         OUT3和4  接另一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

        ULT  不接

2个PWM+2个IO口接线:

        IN4和3  接PA5/PB0(PA5为IO口,不用于输出PWM;PB0为TIM3的通道3,输出PWM)

         GND  接地

         VCC  范围在2.7V到11.8V(最好大一点,毕竟要驱动电机。但不能超过最大值,会烧驱动的)

         IN2和1  接PA4/PB1(PA4为IO口,不用于输出PWM;PB1为TIM3的通道4,输出PWM)

         EEP  为保护输出,默认不用

         OUT1和2  接一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

         OUT3和4  接另一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

        ULT  不接

2.PWM波

这个驱动没有专门给输出PWM的引脚,它的PWM直接通过IN1/2/3/4进行输出,也可以一个输出PWM一个不输出,而是用普通IO。

(这里只拿IN1/2做例子了,IN3/4同理)

一个普通IO口和一个PWM:

当IN1接PA4作为普通IO,IN2接PB1作为输出PWM的IO口时:

PA4为低电平时(假设此时电机正转),随着IN2即PB1输出的PWM的占空比增大,电机转速增大。

PA4为高电平时(此时电机反转,和上面方向相反),随着IN2即PB1输出的PWM的占空比减小,电机转速正增大。

另一个电机也同理,只是引脚变了。

两个都是PWM:

当IN1的PWM波的占空比为零,IN2的PWM波的占空比不为零(有数值)时,电机向一个方向旋转,且转速随IN2的占空比增大而增大。

当IN1的PWM波的占空比不为零(有数值),IN2的PWM波的占空比为零,电机向相反的方向旋转,且转速随IN1的占空比增大而增大。

当IN1/2都有PWM波时,IN1/2的PWM波的两个占空比同时减去最小的那个占空比,这样就又回到了上面两种情况。

另一个电机也同理,只是引脚变了。

3.相关代码

本人是在江科大是代码上进行更改的,真正用到的只有PWM文件(输出PWM波)Motor文件(配置普通IO)和main.c。

PS:代码连接在最后面。

PWM

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
  
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
  TIM_InternalClockConfig(TIM3);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//用默认值填充每个TIM_OCInitStruct成员
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);
	//TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  //TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
	TIM_Cmd(TIM2, ENABLE);
  TIM_Cmd(TIM3, ENABLE);
}


                                                                        main

#include "stm32f10x.h"                  // Device header
#include "Motor.h"
//void PWM_SetCompare3(uint16_t Compare);
//int8_t Speed;

int main(void)
{
	Motor_Init();
	while (1)
	{
	
		//2个普通IO,2个PWM
//    GPIO_SetBits(GPIOA, GPIO_Pin_5);
//		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
     //TIM_SetCompare3(TIM3, 100);//PB0
    
//    GPIO_SetBits(GPIOA, GPIO_Pin_4);//PWM的占空比越小电机转的越快
//		GPIO_ResetBits(GPIOA, GPIO_Pin_4);//PWM占空比越大,电机转的越快
//        TIM_SetCompare4(TIM3, 10);//PB1 
    


//         4个PWM
     TIM_SetCompare3(TIM2, 90);//PA2
     TIM_SetCompare4(TIM2, 100);//PA3

  
     TIM_SetCompare3(TIM3, 100);//PB0
     TIM_SetCompare4(TIM3, 10);//PB1
     
	}
}

Motor

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	PWM_Init();
}

4.代码连接 

用的百度网盘

链接:百度网盘 请输入提取码
提取码:CSDN

  • 34
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
当然可以!下面是一个简单的代码示例,可以使用STM32驱动DRV8833芯片控制直流电机的转动。 ```c #include "stm32f4xx.h" #define MOTOR_A_IN1_GPIO_PORT GPIOA #define MOTOR_A_IN1_GPIO_PIN GPIO_Pin_0 #define MOTOR_A_IN2_GPIO_PORT GPIOA #define MOTOR_A_IN2_GPIO_PIN GPIO_Pin_1 void motor_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = MOTOR_A_IN1_GPIO_PIN | MOTOR_A_IN2_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void motor_forward(void) { GPIO_SetBits(MOTOR_A_IN1_GPIO_PORT, MOTOR_A_IN1_GPIO_PIN); GPIO_ResetBits(MOTOR_A_IN2_GPIO_PORT, MOTOR_A_IN2_GPIO_PIN); } void motor_backward(void) { GPIO_ResetBits(MOTOR_A_IN1_GPIO_PORT, MOTOR_A_IN1_GPIO_PIN); GPIO_SetBits(MOTOR_A_IN2_GPIO_PORT, MOTOR_A_IN2_GPIO_PIN); } void motor_stop(void) { GPIO_ResetBits(MOTOR_A_IN1_GPIO_PORT, MOTOR_A_IN1_GPIO_PIN); GPIO_ResetBits(MOTOR_A_IN2_GPIO_PORT, MOTOR_A_IN2_GPIO_PIN); } int main(void) { motor_init(); while(1) { motor_forward(); Delay(1000); // 延时1秒 motor_backward(); Delay(1000); // 延时1秒 motor_stop(); Delay(1000); // 延时1秒 } } ``` 以上代码假设使用的是STM32F4系列的单片机,并且将DRV8833芯片的IN1引脚连接到GPIOA的Pin 0上,IN2引脚连接到GPIOA的Pin 1上。你可以根据实际情况进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值