搜索
bottom↓
回复: 106

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

  [复制链接]

出0入16汤圆

发表于 2019-7-18 11:31:04 | 显示全部楼层 |阅读模式
本帖最后由 射天狼 于 2019-7-19 08:33 编辑

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

资料链接
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
作者评价:
TMC的东西贼贵,但可以说是最好的步进电机驱动芯片,没有之一。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2019-7-18 11:57:57 | 显示全部楼层
不错,学习一下

出0入22汤圆

发表于 2019-7-18 12:08:51 | 显示全部楼层
这芯片能搞S曲线加减速不?

出0入16汤圆

 楼主| 发表于 2019-7-18 12:12:09 来自手机 | 显示全部楼层
zxq6 发表于 2019-7-18 12:08
这芯片能搞S曲线加减速不?

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

出0入4汤圆

发表于 2019-7-18 12:14:36 来自手机 | 显示全部楼层
不能,除非用它外部脉冲方向控制

出0入0汤圆

发表于 2019-7-18 12:17:27 | 显示全部楼层
射天狼 发表于 2019-7-18 12:12
自带的 设定好目标位置 会自动加速减速 是s的

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

出0入0汤圆

发表于 2019-7-18 12:36:15 来自手机 | 显示全部楼层
这玩意一个芯片 三四十  太贵了

出0入16汤圆

 楼主| 发表于 2019-7-18 12:50:40 | 显示全部楼层
ronic 发表于 2019-7-18 12:14
不能,除非用它外部脉冲方向控制

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

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

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

出0入16汤圆

 楼主| 发表于 2019-7-18 12:53:23 | 显示全部楼层
atonghua 发表于 2019-7-18 12:17
为啥要用那种黑色坨坨的电源模块?用DC-DC电源芯片有什么不妥?

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

出0入0汤圆

发表于 2019-7-18 12:56:32 | 显示全部楼层
TMC5130芯片设计的走线不好走,底下有散热焊盘,还有各种地各种电源以及电阻等,电机的四根线分布于芯片的两边,怎么走线都别扭,其他的方面这个芯片确实挺强大的。

出0入16汤圆

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

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

出0入0汤圆

发表于 2019-7-18 13:14:07 | 显示全部楼层
卖的不多,价格挺贵,提供几个链接
https://www.trinamic.com/fileadm ... tasheet_Rev1.10.pdf
https://www.trinamic.com/fileadm ... tasheet_Rev1.15.pdf
https://www.trinamic.com/fileadm ... ange_of_TMC5XXX.pdf
https://www.trinamic.com/product ... etails/tmc5130a-ta/
https://www.trinamic.com/product ... ts/details/tmc5160/

出0入4汤圆

发表于 2019-7-18 13:16:35 | 显示全部楼层
看看手册,没用过这个

出0入0汤圆

发表于 2019-7-18 13:19:48 | 显示全部楼层
是几层板的?噪声如何?

出0入0汤圆

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

出0入16汤圆

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

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

出0入16汤圆

 楼主| 发表于 2019-7-18 13:35:51 | 显示全部楼层
NFC 发表于 2019-7-18 13:19
是几层板的?噪声如何?

问的哪方面噪声?

出0入0汤圆

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

出0入0汤圆

发表于 2019-7-18 13:46:24 来自手机 | 显示全部楼层
有没有用5160做成品驱动器的呢?使用方便些

出0入0汤圆

发表于 2019-7-18 13:50:00 | 显示全部楼层
方便发一个PDF的原理图吗?谢谢

出0入16汤圆

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

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

出0入16汤圆

 楼主| 发表于 2019-7-18 14:02:34 来自手机 | 显示全部楼层
picobox 发表于 2019-7-18 13:50
方便发一个PDF的原理图吗?谢谢

邮箱留下  发你一份

出0入0汤圆

发表于 2019-7-18 14:07:38 | 显示全部楼层
射天狼 发表于 2019-7-18 14:02
邮箱留下  发你一份

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

出0入9汤圆

发表于 2019-7-18 14:07:56 | 显示全部楼层
收藏了,学习下。

出0入0汤圆

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

出0入16汤圆

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

私信我下 加微信吧

出0入137汤圆

发表于 2019-7-18 15:11:26 | 显示全部楼层
背面的散热片是怎么固定的?

出0入13汤圆

发表于 2019-7-18 15:14:03 | 显示全部楼层
芯片不错,价格不便宜

出40入70汤圆

发表于 2019-7-18 15:17:27 | 显示全部楼层
相比109,弱爆了

出0入0汤圆

发表于 2019-7-18 15:21:44 来自手机 | 显示全部楼层
szman5108 发表于 2019-7-18 15:17
相比109,弱爆了

109具体型号是什么?

出0入0汤圆

发表于 2019-7-18 15:23:46 来自手机 | 显示全部楼层
szman5108 发表于 2019-7-18 15:17
相比109,弱爆了

不会吧……

出0入0汤圆

发表于 2019-7-18 15:24:39 来自手机 | 显示全部楼层
109是啥?

出0入12汤圆

发表于 2019-7-18 15:51:07 | 显示全部楼层
不错, 以后可能 就是芯片的方向了

出0入0汤圆

发表于 2019-7-18 16:14:04 | 显示全部楼层
价格也很感人吧。

出0入0汤圆

发表于 2019-7-18 16:16:39 | 显示全部楼层

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

出0入10汤圆

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

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

出0入0汤圆

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

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

出0入16汤圆

 楼主| 发表于 2019-7-18 16:41:23 | 显示全部楼层
嗯  罗小蘑菇 正解

出0入0汤圆

发表于 2019-7-18 16:43:16 | 显示全部楼层
这个芯片和我期望实现的模块已经非常接近了,看来可以直接用IC了

出0入0汤圆

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

出0入0汤圆

发表于 2019-7-18 17:15:21 | 显示全部楼层
同求楼主发个电路图给我 邮箱 nikoladiAT126.com

出0入16汤圆

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入16汤圆

 楼主| 发表于 2019-7-18 17:43:43 | 显示全部楼层
meirenai 发表于 2019-7-18 17:15
同求楼主发个电路图给我 邮箱 nikoladiAT126.com

原理图  已发送

出0入0汤圆

发表于 2019-7-18 17:53:16 来自手机 | 显示全部楼层
射天狼 发表于 2019-7-18 17:36

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

出0入16汤圆

 楼主| 发表于 2019-7-18 18:15:38 | 显示全部楼层
appleboy 发表于 2019-7-18 17:53
需要这几个二极管就太复杂了,这个电流下,大多IC都是不需要的

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

出40入70汤圆

发表于 2019-7-18 18:43:34 | 显示全部楼层

TB67S109AFTG

出0入16汤圆

 楼主| 发表于 2019-7-18 19:01:54 | 显示全部楼层
额···  所以说109 牛在哪里呢  这不就是最普通的电机驱动么

出0入0汤圆

发表于 2019-7-18 19:11:30 来自手机 | 显示全部楼层
集成芯片用起来简单

出0入0汤圆

发表于 2019-7-18 21:24:29 | 显示全部楼层
射天狼 发表于 2019-7-18 19:01
额···  所以说109 牛在哪里呢  这不就是最普通的电机驱动么

估计是性价比牛逼

出0入16汤圆

 楼主| 发表于 2019-7-18 21:27:23 | 显示全部楼层
温度处理代码:
  1. /***********************************************************************
  2. *FunName:        float CalculateTemperature(float fR)
  3. *
  4. *In:                fR -> PT100的电阻值。
  5. *
  6. *Out:                fTem -> 测得的温度值。
  7. *
  8. *Discription: 将电阻值查表算出温度值。
  9. *
  10. *Notes:         采用2分查找法。
  11. *
  12. ************************************************************************/
  13. float CalculateTemperature(float fR)
  14. {
  15.         float fTem;
  16.         float fLowRValue;
  17.         float fHighRValue;
  18.         int   iTem;
  19.         unsigned short int i;
  20.         unsigned short int cBottom, cTop;

  21.         if (fR < NTC_R_num[330])                // 电阻值小于表格最小值,低于量程下限。
  22.         {
  23.                 return BELOW_LOW_LIMITE;
  24.         }

  25.         if (fR > NTC_R_num[0])        // 电阻值大于表格最大值,超出量程上限。
  26.         {
  27.                 return EXCESS_UP_LIMITE;
  28.         }

  29.         cBottom = 0;
  30.         cTop    = 330;

  31.         for (i=165; (cTop-cBottom)!=1; )        // 2分法查表。
  32.         {
  33.                 if (fR > NTC_R_num[i])
  34.                 {
  35.                         cTop = i;
  36.                         i = (cTop + cBottom) / 2;
  37.                 }
  38.                 else if (fR < NTC_R_num[i])
  39.                 {
  40.                         cBottom = i;
  41.                         i = (cTop + cBottom) / 2;
  42.                 }
  43.                 else
  44.                 {
  45.                         iTem = (unsigned int)i * 1 - 30;
  46.                         fTem = (float)iTem;

  47.                         return fTem;
  48.                 }
  49.         }

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

  51.         fLowRValue  = NTC_R_num[cBottom];
  52.         fHighRValue = NTC_R_num[cTop];

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

  55.         return fTem;
  56. }
  57. /////////////////////////////////方法2:查表法?//////////////////////////////////////////////////
  58. /***********************************************************************
  59. *FunName:        float NTC_Convert(float temp)
  60. *
  61. *In:                temp -> 输入温度值。
  62. *
  63. *Out:                tt -> 返回温度值。
  64. *
  65. *Discription:  将温度保留0.5精度。
  66. *
  67. *Notes: 。
  68. *
  69. ************************************************************************/
  70. float NTC_Convert(float temp)
  71. {
  72.         int number,ge,shi,bai,qian;
  73.         float tt;
  74.         if(temp < 0)
  75.         {
  76.                 number = -temp * 10;
  77.         }
  78.         else
  79.         {
  80.                 number = temp * 10;
  81.         }
  82.         qian=(number%10000)/1000;
  83.         bai=(number%1000)/100;
  84.         shi=(number%100)/10;
  85.         ge=number%10;
  86.         if(ge >= 0 && ge <5)
  87.                 ge=0;
  88.         else
  89.                 ge =5;
  90.         tt=qian*100.0+bai*10.0+shi+(float)(ge)/10.0;
  91.         if(temp < 0) tt = -tt;
  92.         return tt;
  93.        
  94. }
复制代码
温度处理部分:
  1.   /**********温度处理开始**********/
  2.                 for(i=0;i<3;i++)
  3.                 {
  4.                         sum=0;
  5.                         for(j=0;j<10;j++)
  6.                         {
  7.                                 sum+=ADCConvertedValue[j][i];
  8.                         }
  9.                         ADC_Value[i]=(float)sum/(10*4096)*2.5;//求平均值并转换成电压值
  10.                         //打印(略)
  11.                 }
  12.                 //电压转换成电阻公式
  13.                 //Rx/(Rx+10K)*2.5V=Vx
  14.                 //Rx/(Rx+10K)=Vx/2.5V 交叉相乘
  15.                 //2.5Rx=10Vx+Rx*Vx
  16.                 //Rx=10Vx/(2.5-Vx)
  17.                 Rx1=10*ADC_Value[0]/(2.5-ADC_Value[0]);
  18.                 NTC_t1=CalculateTemperature(Rx1);
  19.                 NTC_temp1=NTC_Convert(NTC_t1);
  20.                  
  21.                
  22.                 Rx2=10*ADC_Value[1]/(2.5-ADC_Value[1]);
  23.                 NTC_t2=CalculateTemperature(Rx2);       
  24.                 NTC_temp2=NTC_Convert(NTC_t2);
  25.                 /**********温度处理结束**********/
复制代码


出0入0汤圆

发表于 2019-7-18 21:34:42 | 显示全部楼层
收藏学习了

出0入16汤圆

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

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



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


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


4.处理


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







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入16汤圆

 楼主| 发表于 2019-7-18 21:52:09 | 显示全部楼层
电机处理部分: 最简单驱动
  1. void motor_run_mm(Axis temp,float mm,uint8_t slave)
  2. {
  3.                         temp.target_pos_f=mm;
  4.                         temp.target_pos_i=(int)(temp.target_pos_f*temp.permm);
  5. //                        __disable_irq();
  6.                         spi_writeRegister(XTARGET,temp.target_pos_i, slave);   //发送位置
  7.                         while(1){
  8.                                 temp.cur_pos_i=spi_readRegister(XACTUAL,slave);  //读取状态和位置
  9.                                 if(temp.cur_pos_i == temp.target_pos_i)
  10.                                 {
  11.                                         break;
  12.                                 }
  13.                         }
  14. //                        __enable_irq();
  15. }
复制代码


比如X轴要走10mm

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

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

出0入16汤圆

 楼主| 发表于 2019-7-18 21:57:04 | 显示全部楼层
本帖最后由 射天狼 于 2019-7-18 21:59 编辑

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

  1. /******************************************************************
  2. *文件名:I2C.C
  3. *功能描述:
  4.            需定义SDA高/低电平输出
  5.                  SCL高/低电平输出
  6.                                  SCL I/O口输入/输出
  7.                                  SDA I/O口输出
  8. ******************************************************************/


  9. #include "header.h"



  10. void I2C_Delay(void)
  11. {
  12.     uint8_t i = 1;
  13.     while(i != 0)
  14.     {
  15.         i--;
  16.     }
  17. }

  18. /******************************************************************
  19. *函数描述:启动总线函数
  20. *局部变量:
  21. *返回变量:
  22. ******************************************************************/
  23. void Start_IIC()
  24. {
  25.         SDA_H;  // 发送起始条件的数据信号
  26.         SCL_H;
  27.         I2C_Delay();
  28.         SDA_L;  // 发送起始信号
  29.         I2C_Delay();
  30.         SCL_L;  // 钳住IIC总线,准备发送或接收数据
  31.         I2C_Delay();
  32. }

  33. /******************************************************************
  34. *函数描述:结束总线,发送IIC结束信号
  35. *局部变量:
  36. *返回变量:
  37. ******************************************************************/
  38. void Stop_IIC()
  39. {
  40.         SDA_L;  // 发送结束条件的数据信号
  41.         I2C_Delay();
  42.         SCL_H;
  43.         I2C_Delay();
  44.         SDA_H;  // 发送IIC结束信号
  45.     I2C_Delay();
  46. }

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


  57.         for(; BitCnt < 8; BitCnt++)
  58.         {
  59.                 if(((d<<BitCnt) & 0x80) == 0)
  60.                         SDA_L;
  61.                 else
  62.                         SDA_H;
  63.                 I2C_Delay();
  64.                 SCL_H;  // 钟高,开始接收数据位
  65.                 I2C_Delay();
  66.                 SCL_L;
  67.                 I2C_Delay();
  68.         }
  69.         SDA_H;
  70.         SCL_H;
  71.         I2C_Delay();
  72.         if(SDA_HorL)
  73.         {
  74.                 ack = 0;
  75.         }
  76.         else
  77.         {
  78.                 ack = 1;
  79.         }
  80.         I2C_Delay();
  81.         SCL_L;

  82.         return ack;
  83. }

  84. /******************************************************************
  85. *函数描述:字节数据接收函数
  86. *局部变量:
  87. *返回变量:返回接收的字节
  88. ******************************************************************/
  89. uint8_t I2C_ReceiveByte()
  90. {
  91.         uint8_t retc = 0;
  92.         uint8_t BitCnt = 0;


  93.         for(; BitCnt < 8; BitCnt++)
  94.         {
  95.                 SCL_L;
  96.                 I2C_Delay();
  97.                 SCL_H;
  98.                 I2C_Delay();
  99.                 retc <<= 1;
  100.                 if(SDA_HorL)
  101.                  retc++;
  102.                 I2C_Delay();
  103.         }
  104.         SCL_L;
  105.         I2C_Delay();
  106.         return retc;
  107. }

  108. /******************************************************************
  109. *函数描述:应答
  110. *局部变量:
  111. *返回变量:
  112. ******************************************************************/
  113. void Ack_IIC(uint16_t a)
  114. {
  115.         if(a)
  116.                 SDA_H;
  117.         else
  118.                 SDA_L;
  119.         I2C_Delay();
  120.         SCL_H;
  121.         I2C_Delay();
  122.         SCL_L;
  123.         I2C_Delay();
  124.         SDA_H;
  125.         I2C_Delay();
  126. }

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

  140.         Start_IIC();

  141.         ack = I2C_SendByte(IIC_Adr);  // 发送器件地址
  142.         if(ack == 0) return 0;
  143.         if(addrNum != 1)
  144.         {
  145.                 ack = I2C_SendByte(addr >> 8);   // 发送高位地址
  146.                 if(ack == 0) return 0;
  147.         }
  148.         ack = I2C_SendByte(addr & 0x00FF);// 发送低位地址
  149.         if(ack == 0) return 0;

  150.         for(; i < n; i++)
  151.         {
  152.                 ack = I2C_SendByte(*s);  // 发送数据
  153.                 if(ack == 0) return 0;
  154.                 s++;
  155.         }

  156.         Stop_IIC();

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

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

  175.         Start_IIC();

  176.         ack = I2C_SendByte(IIC_Adr);  // 发送器件地址
  177.         if(ack == 0) return 0;
  178.         if(addrNum != 1)
  179.         {
  180.                 ack = I2C_SendByte(addr >> 8);   // 发送高位地址
  181.                 if(ack == 0) return 0;
  182.         }
  183.         ack = I2C_SendByte(addr & 0x00FF);// 发送低位地址
  184.         if(ack == 0) return 0;

  185.         Start_IIC();
  186.         ack = I2C_SendByte(++IIC_Adr);
  187.         if(ack == 0) return 0;

  188.         for(i = 0; i < n-1; i++)
  189.         {
  190.                 *s = I2C_ReceiveByte();
  191.                 Ack_IIC(0);  // 发送应答位
  192.                 s++;
  193.         }
  194.         *s = I2C_ReceiveByte();
  195.         Ack_IIC(1);  // 发送非应答位

  196.         Stop_IIC();
  197.         return 1;
  198. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

发表于 2019-7-18 21:59:19 | 显示全部楼层
MARK,已收藏,多谢楼主!

出0入16汤圆

 楼主| 发表于 2019-7-18 22:00:29 | 显示全部楼层
调用过程参考:
  1. void write_eeprom(uint8_t temp)
  2. {
  3.         uint8_t i;
  4.                 WP_L;
  5. if(temp == 1){
  6.   i2c.tmp = 0;
  7.   I2C_SendData(0xA2, 0x0000, HAV_H, i2c.arry, 4);
  8.   
  9. }
  10.                 I2C_ReceiveData(0xA2, 0x0000, HAV_H, i2c.arry, 4);
  11.                 if(i2c.tmp != 123456)
  12.                 {
  13.                         //int class
  14.                         i2c.tmp = 123456;
  15.                         I2C_SendData(0xA2, 0x0000, HAV_H, i2c.arry, 4);
  16.                        
  17.                         i2c.tmp = 0; //P00
  18.                         I2C_SendData(0xA2, 0x0004, HAV_H, i2c.arry, 4);//int
  19.                        
  20.                         i2c_2.tmp = 9.0; //motor_x1
  21.                         I2C_SendData(0xA2, 0x0008, HAV_H, i2c_2.arry, 4);//float
  22.                        
  23.                         i2c_2.tmp = 36.0; //motor_z1
  24.                         I2C_SendData(0xA2, 0x000C, HAV_H, i2c_2.arry, 4);//float
  25.                        
  26.                         i2c_2.tmp = 2.4; //motor_p1
  27.                         I2C_SendData(0xA2, 0x0010, HAV_H, i2c_2.arry, 4);//float
  28.                        
  29.                         i2c_2.tmp = 3.0; //motor_n
  30.                         I2C_SendData(0xA2, 0x0014, HAV_H, i2c_2.arry, 4);//float
  31.                        
  32.                        
  33.                         i2c_2.tmp = 48.0; //motor_x2
  34.                         I2C_SendData(0xA2, 0x0018, HAV_H, i2c_2.arry, 4);//float

  35.                         i2c_2.tmp = 62.0; //motor_y2
  36.                         I2C_SendData(0xA2, 0x001C, HAV_H, i2c_2.arry, 4);//float
  37.                        
  38.                         i2c_2.tmp = 35.0; //motor_z2
  39.                         I2C_SendData(0xA2, 0x0020, HAV_H, i2c_2.arry, 4);//float
  40.                        
  41.                         i2c_2.tmp = 0.1; //motor_p2
  42.                         I2C_SendData(0xA2, 0x0024, HAV_H, i2c_2.arry, 4);//float

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

  46.                         i2c_2.tmp = 5.0; //motor_p4
  47.                         I2C_SendData(0xA2, 0x002C, HAV_H, i2c_2.arry, 4);//float
  48.                        
  49.                         i2c_2.tmp = 24.0; //motor_p5
  50.                         I2C_SendData(0xA2, 0x0030, HAV_H, i2c_2.arry, 4);//float
  51.                        
  52.                         i2c_2.tmp = 21.0; //motor_x3
  53.                         I2C_SendData(0xA2, 0x0034, HAV_H, i2c_2.arry, 4);//float
  54.                        
  55.                        
  56.                         i2c_2.tmp = 25.0; //set_t1
  57.                         I2C_SendData(0xA2, 0x0038, HAV_H, i2c_2.arry, 4);//float
  58.                        
  59.                         i2c.tmp = 0;//t1_enable_flag
  60.                         I2C_SendData(0xA2, 0x003C, HAV_H, i2c.arry, 1);//u8
  61.                        
  62.                         i2c.tmp = 0;//t2_enable_flag
  63.                         I2C_SendData(0xA2, 0x003D, HAV_H, i2c.arry, 1);//u8
  64.                        
  65.                        
  66.                        
  67.                         i2c.tmp = 2;//xspeed
  68.                         I2C_SendData(0xA2, 0x0040, HAV_H, i2c.arry, 1);//u8                       
  69.                        
  70.                         i2c.tmp = 2;//yspeed
  71.                         I2C_SendData(0xA2, 0x0041, HAV_H, i2c.arry, 1);//u8       

  72.                         i2c.tmp = 5;//zspeed
  73.                         I2C_SendData(0xA2, 0x0042, HAV_H, i2c.arry, 1);//u8       
  74.                        
  75.                         i2c.tmp = 2;//pspeed
  76.                         I2C_SendData(0xA2, 0x0043, HAV_H, i2c.arry, 1);//u8       
  77.                        
  78.                        
  79.                 }
  80.                 WP_H;       
  81. }
  82. //
  83. //
  84. void read_eeprom(void)
  85. {
  86.                         uint8_t i;
  87.                         WP_L;   //保存校准值到eeprom
  88.                         i2c.tmp = 0; //P00
  89.                         I2C_ReceiveData(0xA2, 0x0004, HAV_H, i2c.arry, 4);//int
  90. //                        ipara_p00=i2c.tmp;
  91.                        
  92.                         i2c_2.tmp = 0;
  93.                         I2C_ReceiveData(0xA2, 0x0008, HAV_H, i2c_2.arry, 4);//float
  94.                         motor_x1=i2c_2.tmp;

  95.                         i2c_2.tmp = 0;
  96.                         I2C_ReceiveData(0xA2, 0x000C, HAV_H, i2c_2.arry, 4);//float
  97.                         motor_z1=i2c_2.tmp;
  98.                        
  99.                         i2c_2.tmp = 0;
  100.                         I2C_ReceiveData(0xA2, 0x0010, HAV_H, i2c_2.arry, 4);//float
  101.                         motor_p1=i2c_2.tmp;
  102.                                        
  103.                         i2c_2.tmp = 0;
  104.                         I2C_ReceiveData(0xA2, 0x0014, HAV_H, i2c_2.arry, 4);//float
  105.                         motor_n=i2c_2.tmp;
  106.                        
  107.                         i2c_2.tmp = 0;
  108.                         I2C_ReceiveData(0xA2, 0x0018, HAV_H, i2c_2.arry, 4);//float
  109.                         motor_x2=i2c_2.tmp;
  110.                        
  111.                         i2c_2.tmp = 0;
  112.                         I2C_ReceiveData(0xA2, 0x001C, HAV_H, i2c_2.arry, 4);//float
  113.                         motor_y2=i2c_2.tmp;

  114.                         i2c_2.tmp = 0;
  115.                         I2C_ReceiveData(0xA2, 0x0020, HAV_H, i2c_2.arry, 4);//float
  116.                         motor_z2=i2c_2.tmp;
  117.                        
  118.                         i2c_2.tmp = 0;
  119.                         I2C_ReceiveData(0xA2, 0x0024, HAV_H, i2c_2.arry, 4);//float
  120.                         motor_p2=i2c_2.tmp;                       
  121.                        
  122.                         i2c_2.tmp = 0;
  123.                         I2C_ReceiveData(0xA2, 0x0028, HAV_H, i2c_2.arry, 4);//float
  124.                         motor_p3=i2c_2.tmp;                       
  125.                        
  126.                         i2c_2.tmp = 0;
  127.                         I2C_ReceiveData(0xA2, 0x002C, HAV_H, i2c_2.arry, 4);//float
  128.                         motor_p4=i2c_2.tmp;
  129.                        
  130.                         i2c_2.tmp = 0;
  131.                         I2C_ReceiveData(0xA2, 0x0030, HAV_H, i2c_2.arry, 4);//float
  132.                         motor_p5=i2c_2.tmp;                       
  133.                        
  134.                         i2c_2.tmp = 0;
  135.                         I2C_ReceiveData(0xA2, 0x0034, HAV_H, i2c_2.arry, 4);//float
  136.                         motor_x3=i2c_2.tmp;
  137.                        
  138.                         i2c_2.tmp = 0;
  139.                         I2C_ReceiveData(0xA2, 0x0038, HAV_H, i2c_2.arry, 4);//float
  140.                         set_t1=i2c_2.tmp;               
  141.                        
  142.                         i2c.tmp = 0;
  143.                         I2C_ReceiveData(0xA2, 0x003C, HAV_H, i2c.arry, 1);//u8
  144.                         t1_enable_flag=i2c.tmp;
  145.                        
  146.                         i2c.tmp = 0;
  147.                         I2C_ReceiveData(0xA2, 0x003D, HAV_H, i2c.arry, 1);//u8
  148.                         t2_enable_flag=i2c.tmp;       

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

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

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

  158.                         i2c.tmp = 0;
  159.                         I2C_ReceiveData(0xA2, 0x0043, HAV_H, i2c.arry, 1);//u8
  160.                         pspeed=i2c.tmp;
  161.                        
  162.                         WP_H;

  163. }
复制代码


出0入4汤圆

发表于 2019-7-19 20:49:24 | 显示全部楼层
图看不清,请给发个原理图吧154408372@qq.com

出0入0汤圆

发表于 2019-7-19 21:12:23 | 显示全部楼层
请问有专门发出控制脉冲的芯片吗?也就是不用单片机自己运算s曲线了。单片机给这个芯片发出位置指令,芯片发出带加减速的脉冲。

出0入0汤圆

发表于 2019-7-20 15:51:45 | 显示全部楼层
很感兴趣,方便的话请楼主发份PDF原理图,谢谢,xfcxm2004@163.com

出0入0汤圆

发表于 2019-7-20 20:13:15 | 显示全部楼层
AMIS30623,汽车上非常成熟的方案

出0入0汤圆

发表于 2019-7-20 21:18:52 | 显示全部楼层
感兴趣,然后搜索了下,发现一个不错的 blog Jim's Embeddedtronics
作者测试了不同的集成步进电机驱动ic波形,Trinamic 的产品波形最好(256微步)












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入16汤圆

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

专业,大牛

出0入0汤圆

发表于 2019-7-21 11:13:51 | 显示全部楼层
板子上淘宝吧,方便有需要的人

出0入0汤圆

发表于 2019-7-21 11:30:17 | 显示全部楼层
不错不错。 真是开拓了思路。

出0入0汤圆

发表于 2019-7-23 16:28:03 | 显示全部楼层
你好,方便给一下pdf的原理图吗?805339842@qq.com

出0入16汤圆

 楼主| 发表于 2019-7-23 17:10:50 | 显示全部楼层
tianbianren 发表于 2019-7-23 16:28
你好,方便给一下pdf的原理图吗?

原理图已发

出0入16汤圆

 楼主| 发表于 2019-7-23 17:11:25 | 显示全部楼层
minomi12345678 发表于 2019-7-19 20:49
图看不清,请给发个原理图吧

原理图已发

出0入16汤圆

 楼主| 发表于 2019-7-23 17:11:49 | 显示全部楼层
athena_min 发表于 2019-7-20 15:51
很感兴趣,方便的话请楼主发份PDF原理图,谢谢,

原理图已发

出0入0汤圆

发表于 2019-7-23 20:40:08 | 显示全部楼层
准备用下试试,楼主方便的话请发份PDF原理图。370584768@qq.com

出0入0汤圆

发表于 2019-7-23 21:42:45 来自手机 | 显示全部楼层
很有兴趣,方便给张原理图。感谢!357641124@qq.com

出0入0汤圆

发表于 2019-7-23 22:05:18 | 显示全部楼层
MARK一下!

出0入0汤圆

发表于 2019-7-23 22:16:55 来自手机 | 显示全部楼层
学习一下,谢楼主

出0入0汤圆

发表于 2019-7-23 23:01:01 | 显示全部楼层
看了下价钱,比较贵哦

出0入8汤圆

发表于 2019-7-24 08:23:31 | 显示全部楼层
采样电阻的线太细了吧

出0入16汤圆

 楼主| 发表于 2019-7-24 09:10:45 | 显示全部楼层
蓝蓝的恋 发表于 2019-7-24 08:23
采样电阻的线太细了吧

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

出0入0汤圆

发表于 2019-7-24 11:48:04 | 显示全部楼层
mark,持续关注.

出0入0汤圆

发表于 2019-7-24 20:16:59 来自手机 | 显示全部楼层
mark 看起来很不错

出0入12汤圆

发表于 2019-7-24 21:43:09 | 显示全部楼层
PDF原理图不能上传到这里?

出0入0汤圆

发表于 2019-7-24 22:02:19 | 显示全部楼层
看起来确实不错

出0入16汤圆

 楼主| 发表于 2019-7-25 08:51:13 | 显示全部楼层
原理图已上传

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-7-25 13:43:51 | 显示全部楼层
感谢分享,学习了

出0入0汤圆

发表于 2019-7-25 14:24:15 | 显示全部楼层
TMC 的,一个  贵 字就可以不用了

出0入0汤圆

发表于 2019-7-25 14:52:18 | 显示全部楼层
楼主,私信怎么不回复啊

出0入0汤圆

发表于 2019-7-25 14:58:15 | 显示全部楼层
东西不错,价格感人

出0入0汤圆

发表于 2019-7-25 15:12:57 | 显示全部楼层
曾经在16年的时候,打算用这个做泵,后来项目暂停了。。

出0入16汤圆

 楼主| 发表于 2019-7-25 16:09:07 | 显示全部楼层
xuxueliang 发表于 2019-7-25 14:52
楼主,私信怎么不回复啊

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

出0入16汤圆

 楼主| 发表于 2019-7-25 16:12:01 | 显示全部楼层
wkman 发表于 2019-7-25 14:24
TMC 的,一个  贵 字就可以不用了

是有点贵  不过值

出0入85汤圆

发表于 2019-7-25 20:14:12 | 显示全部楼层
LZ出个开发板?

出0入16汤圆

 楼主| 发表于 2019-7-26 13:09:15 | 显示全部楼层

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

出0入0汤圆

发表于 2019-8-30 18:31:26 | 显示全部楼层
电机驱动 mark

出0入0汤圆

发表于 2019-8-30 19:55:20 | 显示全部楼层
zxq6 发表于 2019-7-18 12:08
这芯片能搞S曲线加减速不?

  大佬 您想要的这里有

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-9-19 09:47:11 | 显示全部楼层
谢谢  收藏了

出0入0汤圆

发表于 2019-10-26 12:09:04 | 显示全部楼层
楼主,你用的电机带编码器输出吗?
如果电机本身没有编码器输出,那么芯片的位置获取功能就无法实现了吧?

出0入0汤圆

发表于 2020-2-26 15:44:29 | 显示全部楼层
了解一下!

出0入0汤圆

发表于 2020-3-3 00:35:45 | 显示全部楼层
芯片好,就是贵~~~

出0入0汤圆

发表于 2020-3-3 00:51:59 | 显示全部楼层
好芯片啊,记下了

出0入0汤圆

发表于 2020-3-3 08:36:49 | 显示全部楼层
谢谢,值得一看

出0入0汤圆

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

出0入0汤圆

发表于 2020-7-14 11:19:16 | 显示全部楼层
好东西 学习一下

出1325入193汤圆

发表于 2020-7-14 12:55:00 | 显示全部楼层
带S曲线步进电机芯片,果然牛掰
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-16 21:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表