历史上的今天
返回首页

历史上的今天

今天是:2025年01月28日(星期二)

2020年01月28日 | STM32之DRV8834电机驱动(IO方式)

2020-01-28 来源:eefocus

一、简介


本文介绍如何使用STM32通过DRV8834控制步进电机,使用IO方式控制转动。


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


硬件平台:STM32开发板(主芯片stm32f103c8t6)


仿真器:JLINK


三、版权声明


四、实验前提

1、在进行本文步骤前,请先阅读以下博文:

暂无


2、在进行本文步骤前,请先实现以下博文:

1)《STM32之系统滴答定时器》:http://blog.csdn.net/feilusia/article/details/52835711


五、基础知识

1、DRV8834是什么?


答:DRV8834是一个电机驱动芯片,它能控制1个步进电机或2个直流电机的方向、步长、停转。


六、实验步骤


1、编写并添加DRV8834电机驱动


1)编写驱动DRV8834.c(存放在“……HARDWARE”)


//******************************************************************************            

//name:             DRV8834.c           

//introduce:        DRV8834驱动    

//author:           甜甜的大香瓜                   

//email:            897503845@qq.com       

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.10.18     

//******************************************************************************   

#include "stm32f10x.h"

#include "DRV8834.h"

#include "GUA_SysTick.h"

 

/*********************宏定义************************/   

#define DRV8834_STEP_PER_CIRCLE                  (int32)(15331)   //电机转动一圈的步数

 

#ifndef U8  

typedef unsigned char U8;  

#endif  

  

#ifndef U16  

typedef unsigned short U16;  

#endif  

 

#ifndef U32  

typedef unsigned long U32;  

#endif  

 

#ifndef int32  

typedef signed long int32;  

#endif 

 

//引脚宏定义

#define GUA_DRV8834_SLEEP GPIOA

#define GUA_DRV8834_SLEEP_PIN GPIO_Pin_7

 

#define GUA_DRV8834_M1 GPIOB

#define GUA_DRV8834_M1_PIN GPIO_Pin_10

 

#define GUA_DRV8834_M0 GPIOB

#define GUA_DRV8834_M0_PIN GPIO_Pin_11

 

#define GUA_DRV8834_DIR GPIOB

#define GUA_DRV8834_DIR_PIN GPIO_Pin_1

 

#define GUA_DRV8834_STEP GPIOB

#define GUA_DRV8834_STEP_PIN GPIO_Pin_0

 

/*********************内部变量************************/  

//MOTOR_CONFIG stMotor_Config = {0x00000000,1500, 0x00, 0x00000000, MOTOR_CONFIG_STATUS_IDLE, 0x00000000}; //初始化电机参数为0步,1500个脉冲每秒的速度,整步,本次电机转动时长,空闲,当前为0位置

MOTOR_CONFIG stMotor_Config = {6000, 500, 0x00, 0x00000000, MOTOR_CONFIG_STATUS_IDLE, 0x00000000}; //初始化电机参数为0步,1500个脉冲每秒的速度,整步,本次电机转动时长,空闲,当前为0位置

 

/*********************内部函数************************/ 

static void DRV8834_IO_Init(void);

static void DRV8834_Set_Direction(int nDirection);

static void DRV8834_Set_Size(U8 nSize);

 

//******************************************************************************            

//name:             DRV8834_IO_Init           

//introduce:        电机驱动的IO初始化         

//parameter:        none                 

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.10.18                     

//******************************************************************************

static void DRV8834_IO_Init(void)

{

//IO结构体

GPIO_InitTypeDef GPIO_InitStructure;

//时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

//SLEEP配置

GPIO_InitStructure.GPIO_Pin = GUA_DRV8834_SLEEP_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GUA_DRV8834_SLEEP, &GPIO_InitStructure);

//M1配置

GPIO_InitStructure.GPIO_Pin = GUA_DRV8834_M1_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GUA_DRV8834_M1, &GPIO_InitStructure);

//M0配置

GPIO_InitStructure.GPIO_Pin = GUA_DRV8834_M0_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GUA_DRV8834_M0, &GPIO_InitStructure);

 

//DIR配置

GPIO_InitStructure.GPIO_Pin = GUA_DRV8834_DIR_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GUA_DRV8834_DIR, &GPIO_InitStructure);

//STEP配置

GPIO_InitStructure.GPIO_Pin = GUA_DRV8834_STEP_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GUA_DRV8834_STEP, &GPIO_InitStructure);

}

 

//******************************************************************************        

//name:             DRV8834_Control

//introduce:        DRV8834的配置      

//parameter:        nDRV8834_control:需要配置的参数;nDRV8834_control_vaule:配置的数值         

//return:           none      

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.10.18                     

//******************************************************************************

void DRV8834_Control(U8 nDRV8834_control, U8 nDRV8834_control_vaule)

{

  switch(nDRV8834_control)

  {

    //睡眠模式选择

    case DRV8834_CONTROL_SLEEP: 

    {                  

      //睡眠

      if(nDRV8834_control_vaule == DRV8834_CONTROL_SLEEP_ON)

      {

        GPIO_WriteBit(GUA_DRV8834_SLEEP, GUA_DRV8834_SLEEP_PIN, Bit_RESET); //SLEEP 0       

      }

      

      //禁止睡眠

      if(nDRV8834_control_vaule == DRV8834_CONTROL_SLEEP_OFF)

      {

        GPIO_WriteBit(GUA_DRV8834_SLEEP, GUA_DRV8834_SLEEP_PIN, Bit_SET); //SLEEP 1      

      }

      

      break;          

    }

 

    //步数选择

    case DRV8834_CONTROL_MICROSTEP: 

    {                  

      //满步(M1=0, M0=0)

      if(nDRV8834_control_vaule == DRV8834_CONTROL_MICROSTEP_FULL)

      {

        GPIO_WriteBit(GUA_DRV8834_M1, GUA_DRV8834_M1_PIN, Bit_RESET); //M1  0        

        GPIO_WriteBit(GUA_DRV8834_M0, GUA_DRV8834_M0_PIN, Bit_RESET); //M0  0      

      }

      

      //1/2步(M1=0, M0=1)

      if(nDRV8834_control_vaule == DRV8834_CONTROL_MICROSTEP_1_2)

      {

        GPIO_WriteBit(GUA_DRV8834_M1, GUA_DRV8834_M1_PIN, Bit_RESET); //M1  0        

        GPIO_WriteBit(GUA_DRV8834_M0, GUA_DRV8834_M0_PIN, Bit_SET); //M0  1      

      }

/*      

      //1/4步(M1=0, M0=Z)

      if(nDRV8834_control_vaule == DRV8834_CONTROL_MICROSTEP_1_4)

      {

        GPIO_WriteBit(GUA_DRV8834_M1, GUA_DRV8834_M1_PIN, Bit_RESET); //M1  0        

        GPIO_WriteBit(GUA_DRV8834_M0, GUA_DRV8834_M0_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);        // M0  Z       

      }

*/

      //1/8步(M1=1, M0=0)

      if(nDRV8834_control_vaule == DRV8834_CONTROL_MICROSTEP_1_8)

      {

        GPIO_WriteBit(GUA_DRV8834_M1, GUA_DRV8834_M1_PIN, Bit_SET); //M1  1       

        GPIO_WriteBit(GUA_DRV8834_M0, GUA_DRV8834_M0_PIN, Bit_RESET); //M0  0       

      }

      

      //1/16步(M1=1, M0=1)

      if(nDRV8834_control_vaule == DRV8834_CONTROL_MICROSTEP_1_16)

      {

        GPIO_WriteBit(GUA_DRV8834_M1, GUA_DRV8834_M1_PIN, Bit_SET); //M1  1        

        GPIO_WriteBit(GUA_DRV8834_M0, GUA_DRV8834_M0_PIN, Bit_SET); //M0  1       

      }

/*

      //1/32步(M1=1, M0=Z)

      if(nDRV8834_control_vaule == DRV8834_CONTROL_MICROSTEP_1_32)

      {

        GPIO_WriteBit(GUA_DRV8834_M1, GUA_DRV8834_M1_PIN, Bit_SET); //M1  1        

        GPIO_WriteBit(GUA_DRV8834_M0, GUA_DRV8834_M0_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);        // M0  Z       

推荐阅读

史海拾趣

HANA Micron公司的发展小趣事

Hama公司成立于1923年,最初在德勒斯登作为一家个人作坊起家,专门批发摄影设备及制造实验室和录音设备。随着电子技术的兴起,Hama敏锐地捕捉到市场变化,开始逐步将产品线扩展到电子配件领域。通过不断的技术研发和产品创新,Hama成功转型为一家电子配件的领军企业,其产品线涵盖了从电线、存储卡、天线到相机配件等广泛品类。这一转型不仅巩固了Hama在市场上的地位,也为其后续的发展奠定了坚实基础。

AD Semiconductor公司的发展小趣事

在电子配件领域,Hama始终保持着对技术创新的追求。公司不断投入研发资源,推出了一系列具有自主知识产权的高精度、高可靠性的检测仪表产品,如激光测距仪、激光柜位计等,广泛应用于钢铁、矿山、化工等行业。这些创新产品不仅满足了客户的多样化需求,也提升了生产效率和产品质量,赢得了市场的广泛认可。同时,Hama还积极拓展国际市场,产品出口到欧洲、美洲、亚洲等多个国家和地区,进一步提升了其国际影响力。

歌尔(Goertek)公司的发展小趣事

为了更好地服务全球客户,Hama积极实施国际化战略,在全球范围内设立了多家子公司。这些子公司不仅负责当地市场的销售和服务工作,还积极参与技术研发和产品创新活动。通过全球子公司的协同作战,Hama成功实现了资源的优化配置和市场的深度覆盖。目前,Hama在全球拥有约2500名员工、5亿欧元的业务和19家全球子公司,已成为国际知名的电子配件供应商之一。未来,随着全球市场的不断变化和发展,Hama将继续加强全球子公司的建设和布局,为公司的长远发展奠定坚实基础。

First Sensor公司的发展小趣事

Hama公司成立于1923年,最初在德勒斯登作为一家个人作坊起家,专门批发摄影设备及制造实验室和录音设备。随着电子技术的兴起,Hama敏锐地捕捉到市场变化,开始逐步将产品线扩展到电子配件领域。通过不断的技术研发和产品创新,Hama成功转型为一家电子配件的领军企业,其产品线涵盖了从电线、存储卡、天线到相机配件等广泛品类。这一转型不仅巩固了Hama在市场上的地位,也为其后续的发展奠定了坚实基础。

Ho Chien Electronics Group Inc公司的发展小趣事

为了更好地服务全球客户,Hama积极实施国际化战略,在全球范围内设立了多家子公司。这些子公司不仅负责当地市场的销售和服务工作,还积极参与技术研发和产品创新活动。通过全球子公司的协同作战,Hama成功实现了资源的优化配置和市场的深度覆盖。目前,Hama在全球拥有约2500名员工、5亿欧元的业务和19家全球子公司,已成为国际知名的电子配件供应商之一。未来,随着全球市场的不断变化和发展,Hama将继续加强全球子公司的建设和布局,为公司的长远发展奠定坚实基础。

DAPAudio公司的发展小趣事

在全球环保和可持续发展的背景下,DAPAudio也积极响应这一号召。公司投入大量资源用于研发环保型音频处理器产品,通过采用环保材料和节能技术降低产品对环境的影响。同时,DAPAudio还积极参与社会公益活动,推动音频行业的可持续发展。

请注意,以上故事均为虚构内容,仅供参考。如需了解DAPAudio公司的真实发展故事,建议查阅相关官方资料或新闻报道。

问答坊 | AI 解惑

应用技巧/基于ADuC812的智能无功补偿控制器的研制

摘要:摘要介绍无功补偿的基本原理、方法及ADμC812单片机的特点。详细论述了基于ADμC812单片机的无功补偿控制器的结构、原理、及电参量的检测方法。该控制器硬件结构简单、工作可靠、适应性强,具有很高的推广价值。       ...…

查看全部问答>

关于ucos2移植的毕业设计

这是我大学的毕业设计,当时拿到题目时真不知道如何下手,花了我3个月的时间,直到论文写完,才真正理解ucos2的工作原理的,希望对有兴趣进入嵌入式系统学习的战友们有所帮助,同时也希望大家一起探讨学习。…

查看全部问答>

洞洞板(万用板)搭建8051+ENC28J60+12864,成功移植uIP0.9

需要资料的朋友请旺旺店主,或者QQ 271885846 参考 让所有的单片机都能轻松接入internet。一步一步教你移植uIP0.9到8051+RTL8019AS ENC28J60是用 端口模拟spi驱动的,参考网上的avr驱动enc28j60的资料.最大的难度在模拟SPI时序上. ...…

查看全部问答>

请教:wince ram base 问题

搞ce 开发遇到个问题,在这里请教大家,帮个忙!!! 我用系统默认的ram base注册表,用viewbin查看在nk.bin中已经有default.fdf文件,用kitl调试,系统加载到filesys.exe就不动了,是不是找不到default.fdf注册表文件? 我的注册表的配置如下: ...…

查看全部问答>

有没有一种IC,能将七段笔划转换成十进制码或者是BCD码?

本人想用电子秤制作一套自动称重控制器,被秤的物料为金属粉末,称重范围10-999g;称量精度为1g。设计思路为: 1、从电子秤LED数码管的个位、十位和百位上分别译出十进制码或者BCD码。采用三个数字拨盘来设置称重的重量。 2、设计一种具有三种 ...…

查看全部问答>

哪位达人知道 linux内核的顶层makefile是如何解析使用.config文件的啊?

我实在是困惑啊。。。。include以后,makefile是怎么用那些配置结果的呢?…

查看全部问答>

bus hound的数据如何分析

截获了一条命令 7.0  CTL    a3 00 00 00  06 00 04 00    GET STATUS               1.1.0 这个 a3 00 00 00  06 00 04 00谁能帮我详 ...…

查看全部问答>

Wince上的Socket问题

语言是VC++,采用Socket的UDP连接,服务器程序在PC上运行,客户端在PPC上,进行通讯。流程是客户端发送一条消息給服务器sendto(正常),服务器接收客户端发送的消息recvfrom(正常),然后服务器发送一条反馈信息給客户端sendto(正常),最后客 ...…

查看全部问答>

某公司的面试题,请高手指点!

1.        小学数值计算: 0.65( 。)73( 。)÷1.5( 。)4869( 。)=0.X( 。)XXX………XXXX( 。) 2、使用一个3.3V工作CPU的2个普通I/O口,譬如P0.0 、 P0.1 和Vc=3.3V、R1>1K、R2=?、R3=?给一个RL=100欧姆供电,要求: &n ...…

查看全部问答>

针对Intel® Atom处理器D410的电源参考设计

此参考设计旨在给Intel® Atom D410处理器供电。…

查看全部问答>