DIY双路步进电机驱动器——使用DRV8825模块

背景:一个项目需要完成一个工件表面粗糙度的测量系统,该系统的驱动方式是双路的步进电机,分别驱动X轴和Y轴的工作太移动,以完成粗糙度的测量。

硬件介绍:

  主控:STM32F103C8T6

  电源:CJ7805 + AMX1117

  电机:42步进电机

  驱动:DRV8825模块*2

  通信:USART

  采样:STM32内置ADC

  调试:SWN接口

驱动器功能:

  1、双路步进电机驱动(兼容A4988以及DRV8825模块)(为了制作方便可靠,该项目中,我选择使用购买的驱动模块,而省略了驱动芯片的外围电路的设计)

  2、串口通信(由于项目中需要该测量系统与上位机通信,并且实时显示工件粗糙度的测量结果,因此这里采用了串口通信的方式,上位机采用Qt编写,通信已经调通)

  3、传感器接口(STM32内置ADC测量电压,该项目中的传感器是一个电感传感器,传感器信号经过一系列模拟电路的处理,转化成可以直径进行ADC采样的电压信号)

驱动器原理图:(工程采用AD完成)

   

 

 

 驱动器PCB三维图:

    

 

 

 软件部分代码逻辑:

  程序共有三个任务,三个任务并行工作:

    

  由于是开环控制的步进电机,故采用时间作为位移的基准。

  同时,由于没有位置编码器,为了让上位机知道电机的位置,在每次向上位机发送传感器数据的同时,也将时间信息同时发送,达到下位机与上位机的时间统一,从而使上位机获得工作台的实时位置。

  串口发送部分代码:(包括发送时间基准)

   1 void upper_send(void)
   2 {
   3     uint16_t senser_voltage_100 = 0;
   4     
   5     //header
   6     upper_send_buffer[0] = 0xAA;
   7     
   8     //time(low byte in front)
   9     upper_send_buffer[1] = (uint8_t)syscnt;
  10     upper_send_buffer[2] = (uint8_t)(syscnt>>8);
  11     upper_send_buffer[3] = (uint8_t)(syscnt>>16);
  12     upper_send_buffer[4] = (uint8_t)(syscnt>>24);
  13     
  14     //content(low byte in front)
  15     senser_voltage_100 = (uint16_t)(adc_voltage * 100);
  16     upper_send_buffer[5] = (uint8_t)senser_voltage_100;
  17     upper_send_buffer[6] = (uint8_t)senser_voltage_100>>8;
  18     
  19     //ending
  20     upper_send_buffer[7] = 0xBB;
  21     
  22     for(uint8_t i=0;i<=7;i++)
  23     {
  24         USART_SendData(USART1,upper_send_buffer[i]);
  25         
  26         while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
  27     }
  28 }

 

软件部分实现思路:

  1、使用STM32的TIM1获得系统时间

  2、在TIM1的溢出中断中实现任务的调度(可以方便设定各个任务的调度频率)

  3、使用TIM3生成两个步进电机的驱动信号(驱动信号为1KHz的方波,32细分)

  4、使用STM32的内置ADC1结合DMA采样电压

  5、使用USART1实现与上位机通信(串口接收中断处理上位机命令)  

 

工程github地址:(硬件+软件)

  https://github.com/W-yt/Stepper-driver

 

 

 

 

 

 

 

   

 

posted @ 2021-03-29 14:17  Yu_tiann  阅读(3055)  评论(0编辑  收藏  举报