stm32f103步进电机驱动控制

一、硬件接线方法

本文采用混合式二相步进电机-J8HB2401-野火42步进电机,驱动器为野火EBF-MSD4805,下面是常用接线方式:
如上图所示通常采用共阴接线方式,具体接线按照自己需求进行完成。
另外二相电机步距角1.8°,步进驱动器侧面SW1-SW8分别为细分设定、电流设定和驱动模式选择开关。

二、程序

代码如下(示例):

1.main.c

#include "stm32f10x.h"
#include "tim.h"
#include "bsp_usart.h"
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"
/* 共阴 */
/*
PUL+->PA.1  PUL-接GND
DIR+->PA.8  DIR-接GND
*/
extern int motor_dir2;
extern int motor_speed;int main(void)
{   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     USART_Config();         Driver_Init();/* GPIO_Init */           TIM2_Init(999,72-1);       while(1) {   Locate_Rle2(motor_speed,motor_dir2);/* 变速以及方向 */    }
}

2.tim.c

#include "tim.h"
#include "bsp_usart.h"long current_pos[2] = {0,0};
int motor_dir2 = 0;
u8 count[2] = {0,0};
u32 motor_speed = 0;
u8 rcr_remainder;     //重复计数余数部分
u8 is_rcr_finish = 1;   //重复计数器是否设置完成
long rcr_integer;     //重复计数整数部分
long target_pos = 0;    //有符号方向/* 电机转速与方向函数 */
void Locate_Rle2(u32 frequency,DIR_Type dir)
{motor_dir2 = dir;DRIVER_DIR = motor_dir2;if(motor_dir2 == CW){motor_speed = 3000;}/* motor_dir2高电平时转速3000Hz */else if(motor_dir2 == CCW){motor_speed = 10000;}/* motor_dir2低电平时转速10000Hz */frequency = motor_speed;if(TIM2->CR1&0x01){printf("\r\nThe last time pulses is not send finished,wait please!\r\n");return;}if((frequency<20)||(frequency>100000)){printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");return;}TIM2_Startup(frequency);
}/* PA8 - DIR+*/
void Driver_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(GPIOA, &GPIO_InitStructure);                  GPIO_SetBits(GPIOA,GPIO_Pin_8);
}/* PA1- PUL+ TIM2_CH2 */
void TIM2_Init(u16 arr,u16 psc)
{                            GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);                                                                          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Period = arr;                  TIM_TimeBaseStructure.TIM_Prescaler =psc;             TIM_TimeBaseStructure.TIM_ClockDivision = 0;           TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);              TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Regular); TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = arr>>1;               TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM2, &TIM_OCInitStructure);                 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);       TIM_ARRPreloadConfig(TIM2, ENABLE);                     TIM_ITConfig(TIM2, TIM_IT_Update ,ENABLE);              NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStructure);                         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);             TIM_Cmd(TIM2, DISABLE);
}void TIM2_Startup(u32 frequency)
{u16 temp_arr=1000000/frequency-1; TIM_SetAutoreload(TIM2,temp_arr);TIM_SetCompare2(TIM2,temp_arr>>1); TIM_SetCounter(TIM2,0);TIM_Cmd(TIM2, ENABLE);
}

3.tim.h

#include "stm32f10x.h"
#include "stdlib.h"#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
#define PAout(n)          BIT_ADDR(GPIOA_ODR_Addr,n)
#define GPIOA_ODR_Addr    (GPIOA_BASE+12)
#define DRIVER_DIR        PAout(8) typedef enum
{CW = 1,//高电平顺时针CCW = 0,//低电平逆时针
}DIR_Type;void Driver_Init(void);
void TIM2_Init(u16 arr,u16 psc);
void TIM2_Startup(u32 frequency);
void Locate_Rle2(u32 frequency,DIR_Type dir);

4.stm32f10x_it.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "tim.h"
#include "bsp_usart.h"
#include "systick.h"extern u8 count[2];
extern long current_pos[2]; //有符号方向
extern int motor_dir2;
int counter = 0;/******* TIM2 - 1ms*********/
void TIM2_IRQHandler(void)
{if(TIM_GetITStatus(TIM2,TIM_FLAG_Update)!=RESET){TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); count[0]++;counter ++;TIM_GenerateEvent(TIM2,TIM_EventSource_Update);TIM_Cmd(TIM2, ENABLE);                       if(count[0]==200){if(motor_dir2==CW)                        current_pos[0]+=count[0];else                                     current_pos[0]-=count[0];TIM_Cmd(TIM2, DISABLE);                         printf("\r\n motor2=%ld\r\n",current_pos[0]);count[0]=0;}if(counter <= 5000){motor_dir2=CW;}/* 定时器前5s拉高motor_dir2电平 */else if((counter > 5000) && (counter <= 10000)){motor_dir2=CCW;}/* 拉低电平 */else if(counter > 10000){counter=0;}/* 复位 */}
}

a.中断函数可以从保准库中进行拷贝,具体采用哪一个串口自己需要对照原理图;
b.PAout(n)函数采用GPIO-位带操作, 把“位带地址+ 位序号”转换成别名地址宏统一公式如下,详见野火指南:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))


总结

很多网友例程都对PAout(n)函数为加讲解,初学者不太容易get;另外在很多博主主函数或者定时器函数中都采用delay()函数进行延时操作是不对的,因为MCU在delay时间内无法进行其他动作。

展望

后续会更新升降电机过程中的梯形、S型加减速,相对,绝对,回原点,PID调节。

STM32F103步进电机驱动简单控制相关推荐

  1. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  2. 步进电机驱动基础2——细分驱动、加减速控制

    之前小白白写过一篇步进电机驱动基础,讲了最基本的步进电机驱动方法:步进电机驱动基础_xiaobaibai_2021的博客-CSDN博客_步进电机驱动 这里,接着以前的文章,再讲一些步进电机驱动相关的知 ...

  3. 步进电机驱动控制总结(一)

    文章目录 1.步进电机驱动原理 2.步进电机驱动设计 3.步进电机驱动编写 4.源码 本文驱动的步进电机为较基础的28BYJ-48步进电机,属于入门级水平,比较好驱动,价格也是相对便宜的,因而步进电机 ...

  4. arduino步进电机程序库_Arduino入门教程15(步进电机驱动库的使用):Arduino Uno R3+ULN2003+步进电机 使用Stepper驱动库,控制步进电机转动角度...

    本篇介绍步进电机驱动库的使用,通过读取电位器输入,控制步进电机转动相应角度. Stepper库是官方提供的驱动库,我们启动Arduino IDE,点击「文件」-「示例」就能找到Stepper库,官方提 ...

  5. 【Proteus仿真】51单片机+按键控制步进电机驱动+LCD1602显示

    [Proteus仿真]51单片机+按键控制步进电机驱动+LCD1602显示 Proteus仿真 在Proteus当中,步进电机选取的不同,接线的顺序不同,为了避免在接线出错,将里面的两种步进电机都选择 ...

  6. TMC260/TMC2660/TMC262步进电机驱动

    1.TMC260   TCM260是德国TRINAMIC公司产的步进电机驱动芯片,综合性能应该是步进电机驱动芯片中排前列的,当然价格也是.TMC260程序上兼容TMC2660.TMC262,其中TMC ...

  7. 【电机驱动芯片(单、双极性步进电机驱动方式/四相五线和42步进电机)——ULN2003、双H桥芯片(DRV8833/DRV8825)】

    文章目录 一.步进电机工作原理 1.基本原理 2.相关总结 二.单极性步进电机驱动(以ULN2003芯片+28BYJ-48电机为例) 1.28BYJ-48四相五线步进电机介绍 2.ULN2003芯片介 ...

  8. NX300 步进电机驱动电路图

    NX300 步进电机驱动电路图 最近工作原因,一直很忙,过完年后就没有什么时间玩这个控制程序了,学习需要持之以恒,这些革命工作还得继续!上次说要把拆下的步进电机驱动电路专门设计,只有参考原来的打印机控 ...

  9. TB6600步进电机驱动(包含原理图以及PCB,打样测试可用,性能良好)

    一.TB6600步进电机驱动芯片介绍 TB6600数据手册写的驱动电流可以达到5A,有五种细分方式(1,1/2,1/4,1/8,1/16) 注意当M1=M2=M3=1(均为高电平)或M1=M2=M3= ...

最新文章

  1. 一个成功的Git分支模型
  2. Maven集成指令总结
  3. 数据结构——顺序栈和链式栈的简单实现和解析(C语言版)
  4. 深入Java集合学习系列:ConcurrentHashMap之实现细节
  5. 信捷触摸屏c语言脚本_信捷触摸屏TG系列产品型号说明及功能介绍
  6. yolov5的wts权重转成tensorrt的engine权重一定要注意的问题:版本匹配(有什么问题可以私信我)
  7. 无人驾驶车辆模型预测控制配套代码_代码详解——最简NMPC路径跟踪仿真代码...
  8. oppo手机android功能,向日葵Android客户端保持在线设置(OPPO手机篇)
  9. SSM框架Web程序的流程(Spring SpringMVC Mybatis)
  10. Windows 7下可以使用的虚拟光驱软件
  11. c语言中英文字幕怎么相加,excel表格怎么快速分离中英文双语字幕? excel分离中英文字符串的技巧...
  12. 网页唤起QQ在线聊天
  13. kafka web页面监控KafkaOffsetMonitor
  14. 180902 逆向-网鼎(4-dalao)
  15. iOS视频添加水印两种方式(不用到第三方框架)
  16. LeetCode接雨水 动态规划
  17. 当代人类不可或缺的至宝—WiFi
  18. MVC AJAXPro
  19. iOS旧版微信SDK升级1.8.6版本小白踩坑记
  20. 【多线程编程学习笔记6】终止线程执行,千万别踩这个坑!

热门文章

  1. python nlp文本摘要实现_用TextRank算法实现自动文本摘要
  2. 自制F1C200S demo板(六、裸机寄存器点灯)
  3. 离散数学——基本等价式、基本蕴含式
  4. Swift的UIImage裁剪,缩放等代码实现
  5. Gif动图如何在线编辑?教你三步在线编辑动图
  6. BugkuCTF之misc题之图穷匕见
  7. 视频教程-Ajax+jquery从入门到精通2017视频教程-JavaScript
  8. pdo_dblib.dll for php7,php_pdo_dblib.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  9. 如何调用股票交易软件api接口?
  10. 【Linux】x86结构