赞
踩
以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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。