一、 【项目名称】
步进电机驱动器
二、 【项目亮点】
之前实现一个项目的过程中用了常用的DM系列雷赛驱动,因为有着较高的低抖动与静音等要求,测试后发现市面上中低成本的步进电机驱动器无法满足使用需求。
三、 【作品简介 】
TMC5160 是带步进/方向接口和串行通信接口(SPI) 的高功率步进电机控制驱动芯片,将实现自动目标定位的灵活斜坡发生器和业界最先进的步进电机驱动器结合在一起。通过外置外部晶体管,实现高动态、高扭矩电机驱动。两相双极性步进电机的高电压通用控制器/驱动器。 stealthChop™控制电机安静运行。 外加 MOSFET 实现高达 20A 的电机线圈电流控制。
PCB如下图所示:
四、【硬件部分的描述 】
板卡为双层采用AD绘制,可12-36V供电,PIN对PIN替换雷赛驱动。使用STM8作为主控,TMC5160控制步进电机。源文件如下:pcb
五、【主要器件】
六、【软件部分的描述 】(选填)
部分主函数如下:
/* Includes ------------------------------------*/
#include "STM8S003F3P.h"
#include "system.h"
/******主函数*******/
main()
{
u8 dat1,dat2,dat3,dat4;
u8 W_Register=0;
u8 X=0,Y=0;
u8 xifen=0,dianliu=0;
_asm("sim"); //禁止中断
Init_CLK();
Init_GPIO();
//Init_UART(); //
Init_SPI();
LED=1;
Delay_MS(10); //
//读取硬件细分数信息
xifen=0;
if(SW4==0)
{
xifen|=0X04;
}
if(SW5==0)
{
xifen|=0X02;
}
if(SW6==0)
{
xifen|=0X01;
}
xifen=xifen+1; //000,标示全速 ON ON ON
//读取硬件电流信息
dianliu=0;
dat1=0;
if(SW4==0)
{
dat1|=0X04;
}
if(SW5==0)
{
dat1|=0X02;
}
if(SW6==0)
{
dat1|=0X01;
}
dianliu=4*dat1+3;
M1_SPI_SET_CHOPCONF[1]=xifen|0X10; //细分数 +插入256微步
M1_SPI_SET_IHOLD_IRUN[3]=dianliu; //电流与拨码有关
Delay_MS(5);
SPI_SEND_Oneoder(&M1_SPI_SET_CHOPCONF[0],5);
SPI_SEND_Oneoder(&M1_SPI_SET_IHOLD_IRUN[0],5);
SPI_SEND_Oneoder(&M1_SPI_SET_TPOWERDOWN[0],5);
SPI_SEND_Oneoder(&M1_SPI_SET_EN_PWM_MODE[0],5);
SPI_SEND_Oneoder(&M1_SPI_SET_TPWM_THRS[0],5);
Delay_MS(5);
//写入参数
Delay_MS(5);
while (1)
{
}
}
/***************************************
CRC8_2 X8+X2+X1+1
****************************************/
u8 CRC8_2_Count(u8 *p_buffer, u8 buf_size)
{
u8 crc=0;
u8 i,j;
u8 currentbyte=0;
for(i=0;i<buf_size;i++)
{
currentbyte=p_buffer[i];
for(j=0;j<8;j++)
{
if((crc>>7)^(currentbyte&0X01))
{
crc=(crc<<1)^0x07;
}
else
{
crc=(crc<<1);
}
currentbyte=currentbyte>>1;
}
}
return crc;
}
/*******************************************************************************
*******************************************************************************/
void Motor_write(u8 M_ADDR,u8 M_Register_addr,u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 CRC_data=0;
Motor_write_data[0]=0x05;
Motor_write_data[1]=M_ADDR;
Motor_write_data[2]=M_Register_addr;
Motor_write_data[3]=dat1;
Motor_write_data[4]=dat2;
Motor_write_data[5]=dat3;
Motor_write_data[6]=dat4;
CRC_data=CRC8_2_Count(&Motor_write_data[0],7);
Motor_write_data[7]=CRC_data;
USART_SEND_DATS(&Motor_write_data[0],8);
}