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