历史上的今天
返回首页

历史上的今天

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

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

2020-01-28 来源:eefocus

一、简介


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


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


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


仿真器:JLINK


三、版权声明


四、实验前提

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

1)《STM32之DRV8834电机驱动(IO方式)》:http://blog.csdn.net/feilusia/article/details/52853951


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

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

2)《STM32之timer2的精准延时》:http://blog.csdn.net/feilusia/article/details/54434274


3)《STM32之timer3产生PWM》:http://blog.csdn.net/feilusia/article/details/53634882


五、基础知识


暂无


六、实验步骤


1、编写并添加电机驱动


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


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

//name:             GUA_DRV8834.c           

//introduce:        DRV8834驱动    

//author:           甜甜的大香瓜                   

//email:            897503845@qq.com       

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

//changetime:       2017.02.12     

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

#include "stm32f10x.h"

#include "GUA_DRV8834.h"

#include "GUA_SysTick.h"

#include "GUA_Timer3_PWM.h"

#include "GUA_Timer2.h" 

 

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

#define GUA_DRV8834_STEP_PER_CIRCLE (GUA_32)(15331)   //电机转动一圈的步数

 

//引脚宏定义

#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_2

 

#define GUA_DRV8834_STEP GPIOB

#define GUA_DRV8834_STEP_PIN GPIO_Pin_0

 

//查询电机剩余时间的宏

#define GUA_CHECK_MOVE_RESIDUE_TIME_FLAG_ON 0

#define GUA_CHECK_MOVE_RESIDUE_TIME_FLAG_OFF 1

 

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

//初始化结构体变量

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

//查询时间的标志

static GUA_U8 sGUA_CheckMoveResidueTime_Flag = GUA_CHECK_MOVE_RESIDUE_TIME_FLAG_OFF;

 

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

static void GUA_DRV8834_IO_Init(void);

static void GUA_DRV8834_Set_Direction(GUA_32 nGUA_Direction);

static void GUA_DRV8834_Set_Size(GUA_U8 nGUA_Size);

 

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

//name:             GUA_DRV8834_IO_Init           

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

//parameter:        none                 

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

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

//changetime:       2017.02.12                     

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

static void GUA_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:             GUA_DRV8834_Control

//introduce:        电机的配置      

//parameter:        nGUA_DRV8834_control:需要配置的参数;nGUA_DRV8834_control_vaule:配置的数值         

//return:           none      

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

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

//changetime:       2017.02.12                     

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

void GUA_DRV8834_Control(GUA_U8 nGUA_DRV8834_control, GUA_U8 nGUA_DRV8834_control_vaule)

{

  switch(nGUA_DRV8834_control)

  {

    //睡眠模式选择

    case GUA_DRV8834_CONTROL_SLEEP: 

    {                  

      //睡眠

      if(nGUA_DRV8834_control_vaule == GUA_DRV8834_CONTROL_SLEEP_ON)

      {

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

      }

      

      //禁止睡眠

      if(nGUA_DRV8834_control_vaule == GUA_DRV8834_CONTROL_SLEEP_OFF)

      {

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

      }

      

      break;          

    }

 

    //步数选择

    case GUA_DRV8834_CONTROL_MICROSTEP: 

    {                  

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

      if(nGUA_DRV8834_control_vaule == GUA_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(nGUA_DRV8834_control_vaule == GUA_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(nGUA_DRV8834_control_vaule == GUA_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(nGUA_DRV8834_control_vaule == GUA_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(nGUA_DRV8834_control_vaule == GUA_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(nGUA_DRV8834_control_vaule == GUA_DRV8834_CONTROL_MICROSTEP_1_32)

      {

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

推荐阅读

史海拾趣

HANA Micron公司的发展小趣事

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

地博电子(DIBO)公司的发展小趣事

随着公司业务的不断发展,地博电子在2010年成功投产了2条全自动化PC薄膜生产线。这一举措不仅大大提高了生产效率,降低了生产成本,还确保了产品质量的稳定性和一致性。全自动化生产线的投产,为地博电子在电子材料行业中的竞争地位奠定了坚实的基础。

Gould Fiber Optics公司的发展小趣事
可能是滤波电容老化、稳压电路故障或负载变化大。
General Semiconductor ( Vishay )公司的发展小趣事

1962年,物理学家Felix Zandman博士在美国宾夕法尼亚州创立了Vishay公司,起初专注于研发和生产Bulk Metal箔电阻。这一电阻技术由Zandman博士发明,具有极高的精确性和稳定性,远超当时市场上的同类产品。公司以此为基础,逐步建立了自己在电子元件领域的地位。这一初期的成功为Vishay后续的快速发展奠定了坚实的基础。

Carlo Gavazzi公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,Carlo Gavazzi公司始终保持着创新的活力。公司不断推出新产品,从最初的电气元件到后来的控制和自动化解决方案,再到能源管理和节能方案,产品线日益丰富。这种多元化的产品策略不仅满足了客户的多样化需求,也为公司带来了更广阔的市场空间。

ECLIPTEK公司的发展小趣事

为了进一步扩大市场份额,ECLIPTEK公司决定实施国际扩张战略。公司先后在亚洲、欧洲和北美等地设立了分支机构,并在当地建立了生产基地。为了更好地满足当地客户的需求,ECLIPTEK还实施了本地化战略,根据市场特点调整产品设计和生产流程。这一举措不仅提高了公司的市场覆盖率,还增强了其国际竞争力。

问答坊 | AI 解惑

电子设计竞赛与大学生素质能力培养

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 电子设计竞赛与大学生素质能力培养 全国大学生电子设计竞赛是教育部倡导的四大学科竞赛之 一, 是面向大学生的群众性科技活动, 目的在于推动全国普通高 等学校促进信息与电子类学科面向二十一世纪 ...…

查看全部问答>

Verilog(R)黄金参考指南

周立功Verilog(R)黄金参考指南…

查看全部问答>

12114移动信息平台被质疑是捞钱工具

用手机发送短信到12114,就能搜索各地的交通、天气、股票等多种生活资讯。这是上个月12114号码出台后,12114的监管部门对外所宣传的,其监管部门与服务商一直对外宣称,12114平台可以为消费者提供公益、公交、天气、交通、抢险、金融证券等资讯查询 ...…

查看全部问答>

ATMega64工作在5伏电压下能够兼容3.3V的管脚电平么?

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata ATMega64的 符号参数条件最小值典型值最大值单位 VIL 输入低电压除了 XTAL1 和RESET 引 脚-0.5 0.2 VCC (1) V VIL1 输入低电压XTAL1 引脚,外部时钟-0.5 0.1 VCC (1) V ...…

查看全部问答>

今天做了一款5W-7W的隔离 LED驱动

一款5-7WLED驱动芯联的IC 就是不知道批量了会怎么样;有谁也有这种成熟的方案;批量的话精度都以可以接受的; 方便的话和我交流下哦, 现在这款IC适合宽电压,340MA;功率因素低了一点;才0.5; 电路里头就是一个pai型电路(2个电解一个电感) ...…

查看全部问答>

约束的问题

想问问大家:如何设置扇出的约束呢,我没有用第三方工具,用quartus11自带的。  我在想如何将某个寄存器或者说是信号约束在芯片资源的某一个位置呢?  谁能解惑呵呵。 谢谢了。…

查看全部问答>

联想无线网络不可用

1.联想笔记本电脑,在官网上按照机器型号下载了指定的无线适配器Broadcom802.11_Wlan_Vista.exe 2.安装成功,在设备管理器中查看,Broadcom802.11g网络适配器正常工作。 3.屏幕右下角的无线网络连接有个大红叉,无线网络不可用, 4.笔记本的无线 ...…

查看全部问答>

求PADS及Cadence,谢谢!

本人以前一直在用Protel DXP,99用过一点,感觉没有DXP好用(个人感觉),所以一直在用DXP,不过后来一直听很多人说PADS和Cadence很好用,所以最近也想学习一下,谁那里有这两种软件破解版的可否给小弟发一份,在此万分感谢。如果哪位仁兄有的话, ...…

查看全部问答>

瑞泰创新2812实验箱的配套实验讲义

现在开始学习DSP,先发份资料[local]1[/local]…

查看全部问答>