射天狼 发表于 2019-7-18 11:31:04

一款超牛掰步进电机芯片测试,简单暴力,一起探讨 加源码

本帖最后由 射天狼 于 2019-7-19 08:33 编辑

最近有个客户想做一个4轴(4路)的42步进电机驱动
他给推荐的让我用TMC5130,心想,what? 这是个步进电机驱动? 没听过
一查资料···我勒个去{:lol:}   你们自己看吧

资料链接
https://www.trinamic.com/products/integrated-circuits/details/tmc5130a-ta/

友情渣渣翻译:
TMC5130 cDriver™是一款集成式电机驱动器和运动控制器解决方案,适用于3D打印,闭路电视摄像机,泵和其他自动化设备应用。 该设备具有集成的SixPoint™斜坡控制器,微步进分度器,无传感器失速检测技术StallGuard2™和完全无噪声的电流控制模式StealthChop™,旨在驱动双极步进电机。
输出驱动器模块由低RDSon N沟道功率MOSFET组成,配置为全H桥,以驱动电机绕组。 TMC5130能够从每个输出驱动高达2.5A的电流(通过适当的散热)。
TMC5130的供电电压为5 ... 46V。 该器件提供SPI接口,用于配置和诊断以及步进和方向接口。

驱控一体(内部集成了控制器、预驱动器、功率MOS);超静音、防抖动、不丢步、防过冲;力矩随速度动态调整;电流随负载控制(节能75%)

反正一堆功能,什么堵转检测 实时改变位置 自动加减速 超级平稳···

------------------------------华丽分割线--------------------------------------
驱动起来也超级简单 一个SPI搞定你也可以用传统的STEP+DIR控制
我用的SPI 下面请欣赏PCB(画的第一版不咋滴 凑合看吧)和部分原理图+测试视频

板子上有的:
1.四路步进电机驱动 隔离的方案 adum1411+1410
2.一个FRAM
3.隔离CAN接口
4.隔离USART-USB
5.TPS54360B电源 这玩意也是个神奇 可以关注下 噪声超级低
6.四路继电器输出
7.两路NTC温度输入(算法晚点上传 用的ADC+DMA+多段线查表法)
8.一个供电输入即可 单片机部分供电用的HDN3-24S05A1隔离

后期会再来一个TMC5160的 这玩意更猛 加MOS电流大 抗造 42 57 86···通吃 目前这个最大也就42

开始上图

















原理图:






部分源码:

晚点上传···

视频:
https://v.youku.com/v_show/id_XNDI3NzY3ODE5Mg==.html?spm=a2h1n.8251843.playList.5~5~A&f=52232667&o=1
https://v.youku.com/v_show/id_XNDI3NzY5MzE5Mg==.html?spm=a2h1n.8251843.playList.5!2~5~A&f=52232667&o=1

增加三个不同速度下的视频
代码部分 下面楼层有不少
慢速
https://v.youku.com/v_show/id_XNDI3ODU5NzE1Mg==.html?spm=a2h3j.8428770.3416059.1
中速
https://v.youku.com/v_show/id_XNDI3ODU5NzU4OA==.html?spm=a2h3j.8428770.3416059.1
稍快速
https://v.youku.com/v_show/id_XNDI3ODU5Nzk4OA==.html?spm=a2h3j.8428770.3416059.1
至于为什么用这个 可以参考这个帖子
https://blog.csdn.net/qq_20553613/article/details/78868801
作者评价:{:lol:}
TMC的东西贼贵,但可以说是最好的步进电机驱动芯片,没有之一。



yjysss 发表于 2019-7-18 11:57:57

不错,学习一下

zxq6 发表于 2019-7-18 12:08:51

这芯片能搞S曲线加减速不?

射天狼 发表于 2019-7-18 12:12:09

zxq6 发表于 2019-7-18 12:08
这芯片能搞S曲线加减速不?

自带的 设定好目标位置 会自动加速减速 是s的

ronic 发表于 2019-7-18 12:14:36

不能,除非用它外部脉冲方向控制

atonghua 发表于 2019-7-18 12:17:27

射天狼 发表于 2019-7-18 12:12
自带的 设定好目标位置 会自动加速减速 是s的

为啥要用那种黑色坨坨的电源模块?用DC-DC电源芯片有什么不妥?

shen-robot 发表于 2019-7-18 12:36:15

这玩意一个芯片 三四十太贵了

射天狼 发表于 2019-7-18 12:50:40

ronic 发表于 2019-7-18 12:14
不能,除非用它外部脉冲方向控制

嗯 不知道这个是不是S型有带S型加减速的芯片 这个我看看手册啊
不过就算不是S的不知道人家用的啥技术吧 加减速相当平滑还没噪声 很稳定

256细分的情况下 速度超级快

视频里速度设置的都是慢的 还可以加快好几倍可以参考下

射天狼 发表于 2019-7-18 12:53:23

atonghua 发表于 2019-7-18 12:17
为啥要用那种黑色坨坨的电源模块?用DC-DC电源芯片有什么不妥?

黑色坨坨是隔离的DCDC模块 给PCB下半部分供电的

罗小蘑菇 发表于 2019-7-18 12:56:32

TMC5130芯片设计的走线不好走,底下有散热焊盘,还有各种地各种电源以及电阻等,电机的四根线分布于芯片的两边,怎么走线都别扭,其他的方面这个芯片确实挺强大的。

射天狼 发表于 2019-7-18 13:05:50

罗小蘑菇 发表于 2019-7-18 12:56
TMC5130芯片设计的走线不好走,底下有散热焊盘,还有各种地各种电源以及电阻等,电机的四根线分布于芯片的 ...

{:lol:} 看来是搞过啊确实是 而且觉得芯片电机驱动输出的IO 就一个引脚···
不过供电电压别太高发热很小 敷铜的话弄2oz倒是绰绰有余
所以后期想再搞个TMC5160的

Earthman 发表于 2019-7-18 13:14:07

卖的不多,价格挺贵,提供几个链接
https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC5160_Datasheet_Rev1.10.pdf
https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC5130_datasheet_Rev1.15.pdf
https://www.trinamic.com/fileadmin/assets/Support/Appnotes/AN028-Extending_the_positioning_range_of_TMC5XXX.pdf
https://www.trinamic.com/products/integrated-circuits/details/tmc5130a-ta/
https://www.trinamic.com/products/integrated-circuits/details/tmc5160/

jiulong855@.163 发表于 2019-7-18 13:16:35

看看手册,没用过这个

NFC 发表于 2019-7-18 13:19:48

是几层板的?噪声如何?

罗小蘑菇 发表于 2019-7-18 13:25:12

5130,5160都搞过
5130适合驱动42电机及其以下(比如39的)的步进电机,5160适合驱动42电机及其以上(比如57)的步进电机。
我用5160驱动电机遇到一个问题,电机一开启会在电源地上产生很强的纹波,最高电压接近2V了,由于没做驱动芯片的通讯隔离直接影响MCU对高低电平的判断进而影响对限位光电开关的判断,所以你这块加了隔离还是很有必要的

射天狼 发表于 2019-7-18 13:35:14

Earthman 发表于 2019-7-18 13:14
卖的不多,价格挺贵,提供几个链接
https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TM ...

嗯是有点小贵 不过用这个就涂个方便 稳定 而且不用那些高速处理的DSP了 FPGA了什么的

射天狼 发表于 2019-7-18 13:35:51

NFC 发表于 2019-7-18 13:19
是几层板的?噪声如何?

问的哪方面噪声?

hexenzhou 发表于 2019-7-18 13:45:40

没感觉好在哪里,多轴之间的插补就做不了,只有单轴的S曲线加减速而已。

colinzhao 发表于 2019-7-18 13:46:24

有没有用5160做成品驱动器的呢?使用方便些

picobox 发表于 2019-7-18 13:50:00

方便发一个PDF的原理图吗?谢谢

射天狼 发表于 2019-7-18 13:53:38

hexenzhou 发表于 2019-7-18 13:45
没感觉好在哪里,多轴之间的插补就做不了,只有单轴的S曲线加减速而已。

这个看你应用场合吧好多都是用于一些扫描数据了什么的 走的也还好 都是直线 矩形 或者重复性检测功能
因为用普通的驱动1mm分辨率走的话 振动很大 传感器晃动太厉害 稳定不下来或者稳定时间很久
我用这个还上不了3D打印机、车床什么的   想用插补什么的话 用个F4或者F7+这个也可以的

射天狼 发表于 2019-7-18 14:02:34

picobox 发表于 2019-7-18 13:50
方便发一个PDF的原理图吗?谢谢

邮箱留下发你一份

picobox 发表于 2019-7-18 14:07:38

射天狼 发表于 2019-7-18 14:02
邮箱留下发你一份

给你留言了,加q讨论一下

一号纵队 发表于 2019-7-18 14:07:56

收藏了,学习下。

xuxueliang 发表于 2019-7-18 14:15:06

芯片价格多少,哪里有卖。楼主做的板子卖不,买回来测试下

射天狼 发表于 2019-7-18 14:21:24

xuxueliang 发表于 2019-7-18 14:15
芯片价格多少,哪里有卖。楼主做的板子卖不,买回来测试下

{:lol:} 私信我下 加微信吧

pulan 发表于 2019-7-18 15:11:26

背面的散热片是怎么固定的?

weiwei4 发表于 2019-7-18 15:14:03

芯片不错,价格不便宜

szman5108 发表于 2019-7-18 15:17:27

相比109,弱爆了

shen-robot 发表于 2019-7-18 15:21:44

szman5108 发表于 2019-7-18 15:17
相比109,弱爆了

109具体型号是什么?

colinzhao 发表于 2019-7-18 15:23:46

szman5108 发表于 2019-7-18 15:17
相比109,弱爆了

不会吧……

shen-robot 发表于 2019-7-18 15:24:39

109是啥?

rogergui 发表于 2019-7-18 15:51:07

不错, 以后可能 就是芯片的方向了

scsdwxj2005_5 发表于 2019-7-18 16:14:04

价格也很感人吧。

appleboy 发表于 2019-7-18 16:16:39

colinzhao 发表于 2019-7-18 15:23
不会吧……

兄弟,你的模块进度怎么样了?

ylei12 发表于 2019-7-18 16:20:58

罗小蘑菇 发表于 2019-7-18 13:25
5130,5160都搞过
5130适合驱动42电机及其以下(比如39的)的步进电机,5160适合驱动42电机及其以上(比如57) ...

请问适合驱动什么类型的电机主要看哪些参数?

罗小蘑菇 发表于 2019-7-18 16:30:30

ylei12 发表于 2019-7-18 16:20
请问适合驱动什么类型的电机主要看哪些参数?

电机工作电压、工作电流。大电机肯定电流比较大,有的甚至电压也比较高。
而5130的电流最大只能是1A还是1.2A,而57的电机电流一般比这大,所以5130不太合适了

射天狼 发表于 2019-7-18 16:41:23

嗯罗小蘑菇 正解

appleboy 发表于 2019-7-18 16:43:16

这个芯片和我期望实现的模块已经非常接近了,看来可以直接用IC了

appleboy 发表于 2019-7-18 16:56:01

楼主为什么接了那么多二极管?每个驱动器你标配了4个二极管,看手册没有这个要求呀?

meirenai 发表于 2019-7-18 17:15:21

同求楼主发个电路图给我 邮箱 nikoladiAT126.com

射天狼 发表于 2019-7-18 17:36:42

appleboy 发表于 2019-7-18 16:56
楼主为什么接了那么多二极管?每个驱动器你标配了4个二极管,看手册没有这个要求呀? ...

射天狼 发表于 2019-7-18 17:43:43

meirenai 发表于 2019-7-18 17:15
同求楼主发个电路图给我 邮箱 nikoladiAT126.com

原理图已发送

appleboy 发表于 2019-7-18 17:53:16

射天狼 发表于 2019-7-18 17:36


需要这几个二极管就太复杂了,这个电流下,大多IC都是不需要的

射天狼 发表于 2019-7-18 18:15:38

appleboy 发表于 2019-7-18 17:53
需要这几个二极管就太复杂了,这个电流下,大多IC都是不需要的

非必要 不用也行官方的DEMO板子就没有我加上了而已

szman5108 发表于 2019-7-18 18:43:34

colinzhao 发表于 2019-7-18 15:23
不会吧……

TB67S109AFTG

射天狼 发表于 2019-7-18 19:01:54

额···所以说109 牛在哪里呢这不就是最普通的电机驱动么

822690a 发表于 2019-7-18 19:11:30

集成芯片用起来简单

hefq 发表于 2019-7-18 21:24:29

射天狼 发表于 2019-7-18 19:01
额···所以说109 牛在哪里呢这不就是最普通的电机驱动么

估计是性价比牛逼

射天狼 发表于 2019-7-18 21:27:23

温度处理代码:
/***********************************************************************
*FunName:      float CalculateTemperature(float fR)
*
*In:                fR -> PT100的电阻值。
*
*Out:                fTem -> 测得的温度值。
*
*Discription: 将电阻值查表算出温度值。
*
*Notes:         采用2分查找法。
*
************************************************************************/
float CalculateTemperature(float fR)
{
      float fTem;
      float fLowRValue;
      float fHighRValue;
      int   iTem;
      unsigned short int i;
      unsigned short int cBottom, cTop;

      if (fR < NTC_R_num)                // 电阻值小于表格最小值,低于量程下限。
      {
                return BELOW_LOW_LIMITE;
      }

      if (fR > NTC_R_num)      // 电阻值大于表格最大值,超出量程上限。
      {
                return EXCESS_UP_LIMITE;
      }

      cBottom = 0;
      cTop    = 330;

      for (i=165; (cTop-cBottom)!=1; )      // 2分法查表。
      {
                if (fR > NTC_R_num)
                {
                        cTop = i;
                        i = (cTop + cBottom) / 2;
                }
                else if (fR < NTC_R_num)
                {
                        cBottom = i;
                        i = (cTop + cBottom) / 2;
                }
                else
                {
                        iTem = (unsigned int)i * 1 - 30;
                        fTem = (float)iTem;

                        return fTem;
                }
      }

      iTem = (unsigned int)i * 1 - 30;

      fLowRValue= NTC_R_num;
      fHighRValue = NTC_R_num;

      fTem = ( ((fR - fLowRValue)*1) / (fHighRValue - fLowRValue) ) + iTem;      // 表格是以1度为一步的。
                                                                                                                                                      // 两点内插进行运算。

      return fTem;
}
/////////////////////////////////方法2:查表法?//////////////////////////////////////////////////
/***********************************************************************
*FunName:      float NTC_Convert(float temp)
*
*In:                temp -> 输入温度值。
*
*Out:                tt -> 返回温度值。
*
*Discription:将温度保留0.5精度。
*
*Notes: 。
*
************************************************************************/
float NTC_Convert(float temp)
{
        int number,ge,shi,bai,qian;
        float tt;
        if(temp < 0)
        {
                number = -temp * 10;
        }
        else
        {
                number = temp * 10;
        }
        qian=(number%10000)/1000;
        bai=(number%1000)/100;
        shi=(number%100)/10;
        ge=number%10;
        if(ge >= 0 && ge <5)
                ge=0;
        else
                ge =5;
        tt=qian*100.0+bai*10.0+shi+(float)(ge)/10.0;
        if(temp < 0) tt = -tt;
        return tt;
       
}温度处理部分:
/**********温度处理开始**********/
                for(i=0;i<3;i++)
                {
                        sum=0;
                        for(j=0;j<10;j++)
                        {
                                sum+=ADCConvertedValue;
                        }
                        ADC_Value=(float)sum/(10*4096)*2.5;//求平均值并转换成电压值
                        //打印(略)
                }
                //电压转换成电阻公式
                //Rx/(Rx+10K)*2.5V=Vx
                //Rx/(Rx+10K)=Vx/2.5V 交叉相乘
                //2.5Rx=10Vx+Rx*Vx
                //Rx=10Vx/(2.5-Vx)
                Rx1=10*ADC_Value/(2.5-ADC_Value);
                NTC_t1=CalculateTemperature(Rx1);
                NTC_temp1=NTC_Convert(NTC_t1);
               
               
                Rx2=10*ADC_Value/(2.5-ADC_Value);
                NTC_t2=CalculateTemperature(Rx2);       
                NTC_temp2=NTC_Convert(NTC_t2);
                /**********温度处理结束**********/

li20030505 发表于 2019-7-18 21:34:42

收藏学习了

射天狼 发表于 2019-7-18 21:45:10

串口解析代码:数据解析参考GPS解析方法(自己也写过一个 后来发现都有现成的···) 太多 就不全部上传了为了方便直观 没用modbus
处理方法1:串口+定时器超时处理 '>'号结束 回车也可以
处理方法2:串口DMA+空闲中断处理
先用的方法1,后来用成方法2,方法2更稳定些

1.首先串口的接收和发送中断:



2.串口命令的结构体定义


3.查找匹配命令结构体 注释掉的就是我原来用的方法 是把命令里数字切割开处理


4.处理


5.部分命令展示支持浮点数 整数 每步都有返回提示







射天狼 发表于 2019-7-18 21:52:09

电机处理部分: 最简单驱动void motor_run_mm(Axis temp,float mm,uint8_t slave)
{
                        temp.target_pos_f=mm;
                        temp.target_pos_i=(int)(temp.target_pos_f*temp.permm);
//                        __disable_irq();
                        spi_writeRegister(XTARGET,temp.target_pos_i, slave);   //发送位置
                        while(1){
                                temp.cur_pos_i=spi_readRegister(XACTUAL,slave);//读取状态和位置
                                if(temp.cur_pos_i == temp.target_pos_i)
                                {
                                        break;
                                }
                        }
//                        __enable_irq();
}

比如X轴要走10mm

直接:motor_run_mm(Xaxis,10.0,XAXIS_CS); 搞定

至于那些初始化、加减速配置、回零函数、限位判断什么的 更深一些的涉及到利益问题就不上传了 见谅!

射天狼 发表于 2019-7-18 21:57:04

本帖最后由 射天狼 于 2019-7-18 21:59 编辑

再来个FRAM的吧也就是EEPROM 先上变态手册

/******************************************************************
*文件名:I2C.C
*功能描述:
         需定义SDA高/低电平输出
               SCL高/低电平输出
                               SCL I/O口输入/输出
                               SDA I/O口输出
******************************************************************/


#include "header.h"



void I2C_Delay(void)
{
    uint8_t i = 1;
    while(i != 0)
    {
      i--;
    }
}

/******************************************************************
*函数描述:启动总线函数
*局部变量:
*返回变量:
******************************************************************/
void Start_IIC()
{
        SDA_H;// 发送起始条件的数据信号
        SCL_H;
        I2C_Delay();
        SDA_L;// 发送起始信号
        I2C_Delay();
        SCL_L;// 钳住IIC总线,准备发送或接收数据
      I2C_Delay();
}

/******************************************************************
*函数描述:结束总线,发送IIC结束信号
*局部变量:
*返回变量:
******************************************************************/
void Stop_IIC()
{
        SDA_L;// 发送结束条件的数据信号
        I2C_Delay();
        SCL_H;
        I2C_Delay();
        SDA_H;// 发送IIC结束信号
    I2C_Delay();
}

/******************************************************************
*函数描述:字节数据传送函数
          将数据d发送出去,可以是数据或地址,发送完毕后等待应答
*局部变量:
*返回变量:发送正常return 1 无应答return 0
******************************************************************/
uint8_t I2C_SendByte(uint8_t d)
{
        uint8_t BitCnt = 0;
        uint8_t ack = 0;


        for(; BitCnt < 8; BitCnt++)
        {
                if(((d<<BitCnt) & 0x80) == 0)
                        SDA_L;
                else
                        SDA_H;
                I2C_Delay();
                SCL_H;// 钟高,开始接收数据位
                I2C_Delay();
                SCL_L;
                I2C_Delay();
        }
        SDA_H;
        SCL_H;
        I2C_Delay();
        if(SDA_HorL)
        {
                ack = 0;
        }
        else
        {
                ack = 1;
        }
        I2C_Delay();
        SCL_L;

        return ack;
}

/******************************************************************
*函数描述:字节数据接收函数
*局部变量:
*返回变量:返回接收的字节
******************************************************************/
uint8_t I2C_ReceiveByte()
{
        uint8_t retc = 0;
        uint8_t BitCnt = 0;


        for(; BitCnt < 8; BitCnt++)
        {
                SCL_L;
                I2C_Delay();
                SCL_H;
                I2C_Delay();
                retc <<= 1;
                if(SDA_HorL)
               retc++;
                I2C_Delay();
        }
        SCL_L;
        I2C_Delay();
        return retc;
}

/******************************************************************
*函数描述:应答
*局部变量:
*返回变量:
******************************************************************/
void Ack_IIC(uint16_t a)
{
        if(a)
                SDA_H;
        else
                SDA_L;
      I2C_Delay();
        SCL_H;
        I2C_Delay();
        SCL_L;
      I2C_Delay();
      SDA_H;
      I2C_Delay();
}

/******************************************************************
*函数描述:向有子地址器件发送n个字节数据
*局部变量:IIC_Adr        IIC器件地址
                  addrNum   1:无高地址,其他:有高低地址
          addr           内存地址
          s         指向的内容
          n                 存入的字节数
*返回变量:成功return 1,失败return 0
******************************************************************/
uint8_t I2C_SendData(uint8_t IIC_Adr, uint16_t addr,uint16_t addrNum,
                           uint8_t *s, uint8_t n)
{
        uint8_t i = 0, ack = 0;

        Start_IIC();

        ack = I2C_SendByte(IIC_Adr);// 发送器件地址
        if(ack == 0) return 0;
        if(addrNum != 1)
        {
                ack = I2C_SendByte(addr >> 8);   // 发送高位地址
                if(ack == 0) return 0;
        }
        ack = I2C_SendByte(addr & 0x00FF);// 发送低位地址
        if(ack == 0) return 0;

        for(; i < n; i++)
        {
                ack = I2C_SendByte(*s);// 发送数据
                if(ack == 0) return 0;
                s++;
        }

        Stop_IIC();

//        addr = 0xFE;   // 255*6
//        while(--addr);// 连续写加上的延时,不然连续写会出错
//        Delay_ms(50);
        return 1;
}

/******************************************************************
*函数描述:读取n字节数据
*局部变量:IIC_Adr        IIC器件地址
                  addrNum   1:无高地址,其他:有高低地址
          addr        数据存进的地址
          s         指向的存储区
          n         读取n个字节
*返回变量:成功return 1,失败return 0
******************************************************************/
uint8_t I2C_ReceiveData(uint8_t IIC_Adr, uint16_t addr, uint16_t addrNum,
                                  uint8_t *s, uint8_t n)
{
        uint8_t i = 0, ack = 0;

        Start_IIC();

        ack = I2C_SendByte(IIC_Adr);// 发送器件地址
        if(ack == 0) return 0;
        if(addrNum != 1)
        {
                ack = I2C_SendByte(addr >> 8);   // 发送高位地址
                if(ack == 0) return 0;
        }
        ack = I2C_SendByte(addr & 0x00FF);// 发送低位地址
        if(ack == 0) return 0;

        Start_IIC();
        ack = I2C_SendByte(++IIC_Adr);
        if(ack == 0) return 0;

        for(i = 0; i < n-1; i++)
        {
                *s = I2C_ReceiveByte();
                Ack_IIC(0);// 发送应答位
                s++;
        }
        *s = I2C_ReceiveByte();
        Ack_IIC(1);// 发送非应答位

        Stop_IIC();
        return 1;
}


llysc 发表于 2019-7-18 21:59:19

MARK,已收藏,多谢楼主!

射天狼 发表于 2019-7-18 22:00:29

调用过程参考:
void write_eeprom(uint8_t temp)
{
        uint8_t i;
                WP_L;
if(temp == 1){
i2c.tmp = 0;
I2C_SendData(0xA2, 0x0000, HAV_H, i2c.arry, 4);

}
                I2C_ReceiveData(0xA2, 0x0000, HAV_H, i2c.arry, 4);
                if(i2c.tmp != 123456)
                {
                        //int class
                        i2c.tmp = 123456;
                        I2C_SendData(0xA2, 0x0000, HAV_H, i2c.arry, 4);
                       
                        i2c.tmp = 0; //P00
                        I2C_SendData(0xA2, 0x0004, HAV_H, i2c.arry, 4);//int
                       
                        i2c_2.tmp = 9.0; //motor_x1
                        I2C_SendData(0xA2, 0x0008, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 36.0; //motor_z1
                        I2C_SendData(0xA2, 0x000C, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 2.4; //motor_p1
                        I2C_SendData(0xA2, 0x0010, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 3.0; //motor_n
                        I2C_SendData(0xA2, 0x0014, HAV_H, i2c_2.arry, 4);//float
                       
                       
                        i2c_2.tmp = 48.0; //motor_x2
                        I2C_SendData(0xA2, 0x0018, HAV_H, i2c_2.arry, 4);//float

                        i2c_2.tmp = 62.0; //motor_y2
                        I2C_SendData(0xA2, 0x001C, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 35.0; //motor_z2
                        I2C_SendData(0xA2, 0x0020, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 0.1; //motor_p2
                        I2C_SendData(0xA2, 0x0024, HAV_H, i2c_2.arry, 4);//float

                       
                        i2c_2.tmp = 1.92; //motor_p3
                        I2C_SendData(0xA2, 0x0028, HAV_H, i2c_2.arry, 4);//float

                        i2c_2.tmp = 5.0; //motor_p4
                        I2C_SendData(0xA2, 0x002C, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 24.0; //motor_p5
                        I2C_SendData(0xA2, 0x0030, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c_2.tmp = 21.0; //motor_x3
                        I2C_SendData(0xA2, 0x0034, HAV_H, i2c_2.arry, 4);//float
                       
                       
                        i2c_2.tmp = 25.0; //set_t1
                        I2C_SendData(0xA2, 0x0038, HAV_H, i2c_2.arry, 4);//float
                       
                        i2c.tmp = 0;//t1_enable_flag
                        I2C_SendData(0xA2, 0x003C, HAV_H, i2c.arry, 1);//u8
                       
                        i2c.tmp = 0;//t2_enable_flag
                        I2C_SendData(0xA2, 0x003D, HAV_H, i2c.arry, 1);//u8
                       
                       
                       
                        i2c.tmp = 2;//xspeed
                        I2C_SendData(0xA2, 0x0040, HAV_H, i2c.arry, 1);//u8                       
                       
                        i2c.tmp = 2;//yspeed
                        I2C_SendData(0xA2, 0x0041, HAV_H, i2c.arry, 1);//u8       

                        i2c.tmp = 5;//zspeed
                        I2C_SendData(0xA2, 0x0042, HAV_H, i2c.arry, 1);//u8       
                       
                        i2c.tmp = 2;//pspeed
                        I2C_SendData(0xA2, 0x0043, HAV_H, i2c.arry, 1);//u8       
                       
                       
                }
                WP_H;       
}
//
//
void read_eeprom(void)
{
                        uint8_t i;
                        WP_L;   //保存校准值到eeprom
                        i2c.tmp = 0; //P00
                        I2C_ReceiveData(0xA2, 0x0004, HAV_H, i2c.arry, 4);//int
//                        ipara_p00=i2c.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0008, HAV_H, i2c_2.arry, 4);//float
                        motor_x1=i2c_2.tmp;

                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x000C, HAV_H, i2c_2.arry, 4);//float
                        motor_z1=i2c_2.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0010, HAV_H, i2c_2.arry, 4);//float
                        motor_p1=i2c_2.tmp;
                                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0014, HAV_H, i2c_2.arry, 4);//float
                        motor_n=i2c_2.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0018, HAV_H, i2c_2.arry, 4);//float
                        motor_x2=i2c_2.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x001C, HAV_H, i2c_2.arry, 4);//float
                        motor_y2=i2c_2.tmp;

                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0020, HAV_H, i2c_2.arry, 4);//float
                        motor_z2=i2c_2.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0024, HAV_H, i2c_2.arry, 4);//float
                        motor_p2=i2c_2.tmp;                       
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0028, HAV_H, i2c_2.arry, 4);//float
                        motor_p3=i2c_2.tmp;                       
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x002C, HAV_H, i2c_2.arry, 4);//float
                        motor_p4=i2c_2.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0030, HAV_H, i2c_2.arry, 4);//float
                        motor_p5=i2c_2.tmp;                       
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0034, HAV_H, i2c_2.arry, 4);//float
                        motor_x3=i2c_2.tmp;
                       
                        i2c_2.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0038, HAV_H, i2c_2.arry, 4);//float
                        set_t1=i2c_2.tmp;               
                       
                        i2c.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x003C, HAV_H, i2c.arry, 1);//u8
                        t1_enable_flag=i2c.tmp;
                       
                        i2c.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x003D, HAV_H, i2c.arry, 1);//u8
                        t2_enable_flag=i2c.tmp;       

                        i2c.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0040, HAV_H, i2c.arry, 1);//u8
                        xspeed=i2c.tmp;       

                        i2c.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0041, HAV_H, i2c.arry, 1);//u8
                        yspeed=i2c.tmp;       

                        i2c.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0042, HAV_H, i2c.arry, 1);//u8
                        zspeed=i2c.tmp;

                        i2c.tmp = 0;
                        I2C_ReceiveData(0xA2, 0x0043, HAV_H, i2c.arry, 1);//u8
                        pspeed=i2c.tmp;
                       
                        WP_H;

}


minomi12345678 发表于 2019-7-19 20:49:24

图看不清,请给发个原理图吧154408372@qq.com

keil_c51 发表于 2019-7-19 21:12:23

请问有专门发出控制脉冲的芯片吗?也就是不用单片机自己运算s曲线了。单片机给这个芯片发出位置指令,芯片发出带加减速的脉冲。

athena_min 发表于 2019-7-20 15:51:45

很感兴趣,方便的话请楼主发份PDF原理图,谢谢,xfcxm2004@163.com

bailao99 发表于 2019-7-20 20:13:15

AMIS30623,汽车上非常成熟的方案

Earthman 发表于 2019-7-20 21:18:52

感兴趣,然后搜索了下,发现一个不错的 blog Jim's Embeddedtronics
作者测试了不同的集成步进电机驱动ic波形,Trinamic 的产品波形最好(256微步)












射天狼 发表于 2019-7-21 10:29:34

Earthman 发表于 2019-7-20 21:18
感兴趣,然后搜索了下,发现一个不错的 blog Jim's Embeddedtronics
作者测试了不同的集成步进电机驱动ic波 ...

专业,大牛

boycn 发表于 2019-7-21 11:13:51

板子上淘宝吧,方便有需要的人

关于以后 发表于 2019-7-21 11:30:17

不错不错。 真是开拓了思路。

tianbianren 发表于 2019-7-23 16:28:03

你好,方便给一下pdf的原理图吗?805339842@qq.com

射天狼 发表于 2019-7-23 17:10:50

tianbianren 发表于 2019-7-23 16:28
你好,方便给一下pdf的原理图吗?

原理图已发

射天狼 发表于 2019-7-23 17:11:25

minomi12345678 发表于 2019-7-19 20:49
图看不清,请给发个原理图吧

原理图已发

射天狼 发表于 2019-7-23 17:11:49

athena_min 发表于 2019-7-20 15:51
很感兴趣,方便的话请楼主发份PDF原理图,谢谢,

原理图已发

eedesign 发表于 2019-7-23 20:40:08

准备用下试试,楼主方便的话请发份PDF原理图。370584768@qq.com

Wesson 发表于 2019-7-23 21:42:45

很有兴趣,方便给张原理图。感谢!357641124@qq.com

ruxz@263.net 发表于 2019-7-23 22:05:18

MARK一下!

lcmdw 发表于 2019-7-23 22:16:55

学习一下,谢楼主

zjy9430 发表于 2019-7-23 23:01:01

看了下价钱,比较贵哦

蓝蓝的恋 发表于 2019-7-24 08:23:31

采样电阻的线太细了吧

射天狼 发表于 2019-7-24 09:10:45

蓝蓝的恋 发表于 2019-7-24 08:23
采样电阻的线太细了吧

这个没办法 芯片焊盘也就0.3mm 我是0.6过渡到0.3的 不过2oz厚度 1.2A多 绰绰有余 实际用不了那么大

土三安 发表于 2019-7-24 11:48:04

mark,持续关注.

苍蓝 发表于 2019-7-24 20:16:59

mark 看起来很不错

waterx3 发表于 2019-7-24 21:43:09

PDF原理图不能上传到这里?

pzt 发表于 2019-7-24 22:02:19

看起来确实不错

射天狼 发表于 2019-7-25 08:51:13

原理图已上传

闲鱼翻身 发表于 2019-7-25 13:43:51

感谢分享,学习了

wkman 发表于 2019-7-25 14:24:15

TMC 的,一个贵 字就可以不用了{:lol:}

xuxueliang 发表于 2019-7-25 14:52:18

楼主,私信怎么不回复啊

迅得电子 发表于 2019-7-25 14:58:15

东西不错,价格感人

kinsno 发表于 2019-7-25 15:12:57

曾经在16年的时候,打算用这个做泵,后来项目暂停了。。

射天狼 发表于 2019-7-25 16:09:07

xuxueliang 发表于 2019-7-25 14:52
楼主,私信怎么不回复啊

不好意思啊一直没看里面消息   已经回您了

射天狼 发表于 2019-7-25 16:12:01

wkman 发表于 2019-7-25 14:24
TMC 的,一个贵 字就可以不用了

是有点贵不过值{:lol:}

marshallemon 发表于 2019-7-25 20:14:12

LZ出个开发板?

射天狼 发表于 2019-7-26 13:09:15

marshallemon 发表于 2019-7-25 20:14
LZ出个开发板?

{:lol:} 开发板就算了成本有点高大部分人接受不了要是有想做验证性实验或者想要的 私信我

ShuJi187 发表于 2019-8-30 18:31:26

电机驱动 mark

向北 发表于 2019-8-30 19:55:20

zxq6 发表于 2019-7-18 12:08
这芯片能搞S曲线加减速不?

大佬 您想要的这里有

开始 发表于 2019-9-19 09:47:11

谢谢收藏了

go2deathward 发表于 2019-10-26 12:09:04

楼主,你用的电机带编码器输出吗?
如果电机本身没有编码器输出,那么芯片的位置获取功能就无法实现了吧?

ylshuan0221 发表于 2020-2-26 15:44:29

了解一下!

kaomantou 发表于 2020-3-3 00:35:45

芯片好,就是贵~~~

cdl35 发表于 2020-3-3 00:51:59

好芯片啊,记下了

jackrich 发表于 2020-3-3 08:36:49

谢谢,值得一看

Firman 发表于 2020-3-3 09:41:23

楼主,我想知道,这芯片能解决断电后外力转动步进电机的问题吗?
我做很多次步进驱动器,都死在这里。拔电后,外力转动步进电机,它会成一个发电机,发电电压高就会炸管。
当然,加继电器断电机线圈就没意思了。

Yorha 发表于 2020-7-14 11:19:16

好东西 学习一下

lb0857 发表于 2020-7-14 12:55:00

带S曲线步进电机芯片,果然牛掰{:victory:}
页: [1] 2
查看完整版本: 一款超牛掰步进电机芯片测试,简单暴力,一起探讨 加源码