历史上的今天
今天是: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
史海拾趣
|
摘要:摘要介绍无功补偿的基本原理、方法及ADμC812单片机的特点。详细论述了基于ADμC812单片机的无功补偿控制器的结构、原理、及电参量的检测方法。该控制器硬件结构简单、工作可靠、适应性强,具有很高的推广价值。 ...… 查看全部问答> |
|
这是我大学的毕业设计,当时拿到题目时真不知道如何下手,花了我3个月的时间,直到论文写完,才真正理解ucos2的工作原理的,希望对有兴趣进入嵌入式系统学习的战友们有所帮助,同时也希望大家一起探讨学习。… 查看全部问答> |
|
洞洞板(万用板)搭建8051+ENC28J60+12864,成功移植uIP0.9 需要资料的朋友请旺旺店主,或者QQ 271885846 参考 让所有的单片机都能轻松接入internet。一步一步教你移植uIP0.9到8051+RTL8019AS ENC28J60是用 端口模拟spi驱动的,参考网上的avr驱动enc28j60的资料.最大的难度在模拟SPI时序上. ...… 查看全部问答> |
|
搞ce 开发遇到个问题,在这里请教大家,帮个忙!!! 我用系统默认的ram base注册表,用viewbin查看在nk.bin中已经有default.fdf文件,用kitl调试,系统加载到filesys.exe就不动了,是不是找不到default.fdf注册表文件? 我的注册表的配置如下: ...… 查看全部问答> |
|
本人想用电子秤制作一套自动称重控制器,被秤的物料为金属粉末,称重范围10-999g;称量精度为1g。设计思路为: 1、从电子秤LED数码管的个位、十位和百位上分别译出十进制码或者BCD码。采用三个数字拨盘来设置称重的重量。 2、设计一种具有三种 ...… 查看全部问答> |
|
截获了一条命令 7.0 CTL a3 00 00 00 06 00 04 00 GET STATUS 1.1.0 这个 a3 00 00 00 06 00 04 00谁能帮我详 ...… 查看全部问答> |
|
语言是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 ...… 查看全部问答> |




