- //******************************************************************************
- //name: DRV8834.c
- //introduce: DRV8834驱动
-
- //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[url=home.php?mod=space&uid=752448]@qq.com[/url]
- //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
- }
- */
- break;
- }
- //方向选择
- case DRV8834_CONTROL_DIR:
- {
- //正向
- if(nDRV8834_control_vaule == DRV8834_CONTROL_DIR_POSITIVE)
- {
- GPIO_WriteBit(GUA_DRV8834_DIR, GUA_DRV8834_DIR_PIN, Bit_RESET); //DIR 0
- }
-
- //反向
- if(nDRV8834_control_vaule == DRV8834_CONTROL_DIR_NEGATIVE)
- {
- GPIO_WriteBit(GUA_DRV8834_DIR, GUA_DRV8834_DIR_PIN, Bit_SET); //DIR 1
- }
-
- break;
- }
- //脉冲脚电平选择
- case DRV8834_CONTROL_STEP:
- {
- //初始化时,拉低电平做好准备
- if(nDRV8834_control_vaule == DRV8834_CONTROL_STEP_INIT)
- {
- GPIO_WriteBit(GUA_DRV8834_STEP, GUA_DRV8834_STEP_PIN, Bit_RESET); //STEP 0
- }
- //拉低STEP
- if(nDRV8834_control_vaule == DRV8834_CONTROL_STEP_LOW)
- {
- GPIO_WriteBit(GUA_DRV8834_STEP, GUA_DRV8834_STEP_PIN, Bit_RESET); //STEP 0
- }
- //拉高STEP
- if(nDRV8834_control_vaule == DRV8834_CONTROL_STEP_HIGH)
- {
- GPIO_WriteBit(GUA_DRV8834_STEP, GUA_DRV8834_STEP_PIN, Bit_SET); //STEP 1
- }
-
- break;
- }
- //其他
- default:
- {
- break;
- }
- }
- }
- //******************************************************************************
- //name: DRV8834_Set_Direction
- //introduce: DRV8834的电机设置方向
- //parameter: nDirection:1为正向,0为反向
- //return: none
- //author: 甜甜的大香瓜
- //email: 897503845@qq.com
- //QQ group 香瓜单片机之STM8/STM32(164311667)
- //changetime: 2016.10.18
- //******************************************************************************
- static void DRV8834_Set_Direction(int nDirection)
- {
- //方向
- switch(nDirection)
- {
- //电机转轴朝上,逆时针,反向
- case MOTOR_CONFIG_DIRECTION_NEGATIVE:
- {
- DRV8834_Control(DRV8834_CONTROL_DIR, DRV8834_CONTROL_DIR_NEGATIVE);
- break;
- }
-
- //电机转轴朝上,顺时针,正向
- case MOTOR_CONFIG_DIRECTION_POSITIVE:
- {
- DRV8834_Control(DRV8834_CONTROL_DIR, DRV8834_CONTROL_DIR_POSITIVE);
- break;
- }
-
- //其他
- default:
- {
- break;
- }
- }
- }
- //******************************************************************************
- //name: DRV8834_Set_Size
- //introduce: DRV8834的电机设置步长
- //parameter: nSize:0为整步,1为半步
- //return: none
- //author: 甜甜的大香瓜
- //email: 897503845@qq.com
- //QQ group 香瓜单片机之STM8/STM32(164311667)
- //changetime: 2016.10.18
- //******************************************************************************
- static void DRV8834_Set_Size(U8 nSize)
- {
- //步长大小
- switch(nSize)
- {
- //整步
- case MOTOR_CONFIG_SIZE_FULL:
- {
- DRV8834_Control(DRV8834_CONTROL_MICROSTEP, DRV8834_CONTROL_MICROSTEP_FULL);
- break;
- }
-
- //半步
- case MOTOR_CONFIG_SIZE_1_2:
- {
- DRV8834_Control(DRV8834_CONTROL_MICROSTEP, DRV8834_CONTROL_MICROSTEP_1_2);
- break;
- }
-
- //其他
- default:
- {
- break;
- }
- }
- }
- //******************************************************************************
- //name: DRV8834_Step_Move
- //introduce: DRV8834的电机控制
- //parameter: pMotor_Config:电机核心参数结构体数据
- //return: 运行时间
- //author: 甜甜的大香瓜
- //email: 897503845@qq.com
- //QQ group 香瓜单片机之STM8/STM32(164311667)
- //changetime: 2016.10.18
- //******************************************************************************
- U32 DRV8834_Step_Move(MOTOR_CONFIG *pMotor_Config)
- {
- int32 nSteps = pMotor_Config->DirectionSteps; //保存步数
- int32 nDirection = (nSteps >= 0)?1:-1; //计算方向
- U8 nSize = pMotor_Config->Size; //保存步长
- U32 nPulse_duration = (500000L/pMotor_Config->PulsePerSecond); //计算延时时间:1000000uS/每秒步数=需要几S,再/2为一个周期均分两段
-
- //唤醒
- DRV8834_Control(DRV8834_CONTROL_SLEEP, DRV8834_CONTROL_SLEEP_OFF);
-
- //获取步数
- nSteps = nSteps * nDirection; //获取步数
-
- //设置方向
- DRV8834_Set_Direction(nDirection);
- //设置步长
- DRV8834_Set_Size(nSize);
- //清除步数计算值
- pMotor_Config->StepsCount = 0;
-
- //电机转动
- while(nSteps && (pMotor_Config->Status == MOTOR_CONFIG_STATUS_ACTIVE))
- {
- //计算
- nSteps--; //计算剩余步数
- pMotor_Config->DirectionPosition += nDirection*1; //每走1步,计算一次位移
- pMotor_Config->StepsCount++; //计算走过的步数
-
- //STEP低
- DRV8834_Control(DRV8834_CONTROL_STEP, DRV8834_CONTROL_STEP_LOW);
-
- //延时
- GUA_Delay_us(nPulse_duration);
-
- //STEP高
- DRV8834_Control(DRV8834_CONTROL_STEP, DRV8834_CONTROL_STEP_HIGH);
-
- //延时
- GUA_Delay_us(nPulse_duration);
- }
-
- //清除状态
- pMotor_Config->DirectionSteps = 0;
- pMotor_Config->Status = MOTOR_CONFIG_STATUS_IDLE;
-
- //睡眠
- DRV8834_Control(DRV8834_CONTROL_SLEEP, DRV8834_CONTROL_SLEEP_ON);
- //计算实际位移
- pMotor_Config->DirectionPosition %= DRV8834_STEP_PER_CIRCLE; //每DRV8834_STEP_PER_CIRCLE次为1圈,重新计数
-
- //换算所用时间为ms为单位,实际走的步数*每步所花的ms数
- return(pMotor_Config->StepsCount*2*nPulse_duration/10);
- }
- //******************************************************************************
- //name: DRV8834_Init
- //introduce: DRV8834的初始化
- //parameter: none
- //return: none
- //author: 甜甜的大香瓜
- //email: 897503845@qq.com
- //QQ group 香瓜单片机之STM8/STM32(164311667)
- //changetime: 2016.10.18
- //******************************************************************************
- void DRV8834_Init(void)
- {
- //IO初始化
- DRV8834_IO_Init();
-
- //睡眠
- DRV8834_Control(DRV8834_CONTROL_SLEEP, DRV8834_CONTROL_SLEEP_ON);
- //nENBL使能
- DRV8834_Control(DRV8834_CONTROL_OUTPUTS, DRV8834_CONTROL_OUTPUTS_ENABLE);
-
- //STEP低
- DRV8834_Control(DRV8834_CONTROL_STEP, DRV8834_CONTROL_STEP_INIT);
- }