你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 硬件SPI驱动磁编码器TLE5012B

[复制链接]
颩色四葉愺 发布时间:2019-6-28 12:04
找了一下网上的驱动程序,就一份程序被抄来抄了,有啥意思?。作者还不愿意把源代码公布,把电路和程序弄得又复杂,还要加上拉电阻,软件读取数据还要配置MOSI为开漏输入,心累。所以自己改了,现分享出来!  {! Q2 v" ]$ K1 x5 e0 k

/ }) C; f' y! D. [' m6 y

8 r6 Q2 \. i$ @" g! E  [- G! ~硬件平台:Nucle64-103,使用SPI正常读取即可4 J7 K, y2 C3 \
* j: y9 k4 Y9 Z' W$ k
硬件连接:- e( |. ^# m- s1 m2 e) _- d- k) }
硬件接线图.png ( h: S; k9 o, ^2 ]  l% z& v
软件平台:STM32CubeMX+keil5.0+hal固件库
! K& o5 L: P* Z3 e+ t" I7 t5 I1 m' Z! u2 s$ j' O* Z) O
  1. #include "app_tle5012b.h"! D, g9 m" h$ W, W8 A; i
  2.                                                                         
    2 ^) V$ P% J! d1 ]

  3. $ |# @$ w/ d/ T0 b; {; E
  4. 9 i1 x( U- i* S. L/ j. B2 y
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte); B" g6 l. B1 B8 {2 ?9 X7 s  g
  6. {$ ^! x- ]3 B  x1 b# T/ v: f

  7. * q( L. M8 k2 A$ x3 g
  8.         uint16_t read_value = 0;
    / B! y+ B* I* u# {6 J
  9.         : @5 x# z! B9 v; [% H$ J$ f
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );
    6 v$ J. A0 y) ~" K( b& q
  11.         ! N: Z! {# D9 \9 X
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );) `2 X6 G) C0 F) T
  13.         return read_value;# M& K. Y7 D* u
  14. }$ `2 i( f; \' T. q, F6 V. b1 c

  15. $ i: W4 |3 V% T4 J, m$ c/ E1 C* R" o

  16. & ?) E' t" s0 i' l
  17. double ReadAngle(void)
    / D; C6 U. ?* H3 ?) k5 U5 X; W
  18. {& ^: z$ B. C+ W3 m/ @+ D' J( t) r
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );
    2 O( Z3 |% q" B3 {) a
  20. }
    8 j, q6 ^5 M$ ?0 w5 h

  21. + @! C( A3 U' F) X5 w$ G& U/ x! D
  22. 2 h' u+ r" ?: a, a9 J
  23. uint16_t ReadSpeed(void); y& b) u8 R4 j3 M8 K3 Z
  24. {2 _) i6 x# E5 h: z* @# k6 V
  25.         return ReadValue(READ_SPEED_VALUE);/ X# Q4 q, n/ z6 W8 o' S
  26. }
    - c  t8 q' z( q  d8 v$ R
  27. 8 S. h# o  u( y4 {1 H6 O7 M
  28. - X/ C% P! ~% P# V+ F
  29. uint16_t ReadValue(uint16_t u16RegValue); u1 R0 @7 z; K, A, K# w
  30. {7 a* B* R# P9 o  n  E4 }; s/ e
  31.         uint16_t u16Data;
    9 H- \2 z2 V9 r- Y8 E, q. k

  32. ( b" P1 b/ }8 v' Q
  33.         SPI_CS_ENABLE;
    3 B# y6 ]( X# @4 F
  34.         $ r; t- X- J& N
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );1 k3 D: ?0 m4 m; R. y
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );; P* b! ?; P5 U1 @
  37.         9 C# N3 v8 K' i+ R
  38.         SPI_CS_DISABLE;
    6 p; s9 @* X& g: K9 @) H& w
  39. & V. H' c. {; Y1 k, j
  40.         & J" ^+ v. s; z
  41.         return((u16Data & 0x7FFF )<<1);6 }3 R' d1 c, Y
  42. }
    ( s4 x8 |, R- C; H$ ?6 n! S
  43. 7 t+ R' D# {1 y" [- @+ t

  44. ( D% ~2 A, m9 X9 p1 K
  45. $ p0 M9 J9 C  K2 X- F
复制代码
  1. #ifndef _APP_TLE5012B_H_
    3 E8 Q7 @" I) {6 L( i
  2. #define _APP_TLE5012B_H_
    % A" s9 }+ S2 M8 Z; y. E
  3. 0 C7 p- Y, b+ I6 d1 H. N( ^, I
  4. #include "cpu_common.h"1 M- y6 q; h+ K  ~3 K0 |# N! b

  5. : {9 N( r. o( `; U9 C4 }8 }
  6. * M& h$ j+ I1 a  Y; x! W4 D; B9 S- a

  7. ' U0 U  u, V. _- a
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_4" Q* |( l# j! W1 x; i
  9. #define GPIO_CS_Pin_Type  GPIOC' L& O- [4 z! X7 B4 F8 Y4 E/ o
  10. , _- S* h, K* _* j; D7 L5 F

  11. 5 ^% U! h! I. b! t/ E
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET )$ ~* h! a, B+ X4 i
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )
    3 U7 u( f  Q& }" S: e; J
  14. ; F/ v1 a& N8 \: f6 t  ~
  15. 7 O. C9 {) |; ?* z
  16. /* SPI command for TLE5012 */  R3 \3 I! L8 ]4 C
  17. #define READ_STATUS                                        0x8001                        //80005 a9 S, O; |2 [' @4 a8 k. p' c: Y
  18. #define READ_ANGLE_VALUE                0x8021                        //8020
    2 Y( u* G" U; m8 K0 Z7 l  A
  19. #define READ_SPEED_VALUE                0x8031                        //80305 m9 ]2 u* r& ]2 O* H- x

  20. - j; X4 y  |, _
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_0001
    ' f/ n) I' d+ ^8 z, G% U
  22. #define MOD1_VALUE        0x0001( R0 s; X0 i3 c. e7 M; G: l

  23. 7 y1 q# |5 X% n; [" P* w
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_00014 p1 b7 P3 \# G
  25. #define MOD2_VALUE        0x08014 k. m+ J4 O( m2 P/ o4 {
  26. 6 r& }; d+ a+ G4 P% i& I' s
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_0001# ^& V- e' `, S4 S7 O' R; a  H6 K
  28. #define MOD3_VALUE        0x00006 a' a9 X& C) |% _& P& H
  29. & h1 @4 c5 b$ @/ ^0 ?# E
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_0001
    - x# f1 G0 v" ^
  31. #define MOD4_VALUE        0x0098                                //9bit 512$ F3 l; w# d7 Q4 W0 B  g

  32. / o( H7 \4 C8 K# c% L9 E
  33. #define WRITE_IFAB_VALUE                0x50B12 r9 N4 A) Y. R. V* P: i) {' l
  34. #define IFAB_VALUE 0x000D! @  R# q8 I! X$ b
  35. /* Functionality mode */' O9 r, F3 f6 u( R; `, |: y) `" Q
  36. #define REFERESH_ANGLE                0
    9 h! h, S: O2 [% O

  37.   d3 _1 K% }! U0 f% V
  38. void SPI_SendData16(uint16_t SendData);4 c: t0 T" b: K3 f
  39. uint16_t SPI_ReadData16(void);
    , ~0 B* T# e( [6 x1 G0 I
  40. double ReadAngle(void);! p6 y0 n7 }6 B. M6 a; W
  41. uint16_t ReadSpeed(void);
    $ S" |* Q8 N; u$ u$ P
  42. uint16_t ReadValue(uint16_t u16Value);
    , v% v$ v% w& l( V! l. `
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);. k. _! U( d% y  e6 X& D7 T
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);+ P) r6 G, t. {( b
  45. 3 O. k1 |% @2 S6 ~

  46.   d& A# U9 ]/ v4 r# x' K* e6 o
  47. #endif
复制代码
4 \# t8 R3 q# g
读取角度打印在串口助手上, _  q- V7 k3 [9 S7 d) ^
微信截图_20190628120124.png
( E& Z* {0 f9 a) [# o" h- o( `; b) \
源工程: tle5012b.rar (3.55 MB, 下载次数: 476)
收藏 3 评论18 发布时间:2019-6-28 12:04

举报

18个回答
天蓝蓝 回答时间:2020-3-25 21:49:15
这个程序有问题的
Shore. 回答时间:2019-8-7 10:18:43
我有一个问题请教一下大家,通过SSC方式读取的角度值是绝对值吗,之前看到这篇文章《基于iGMR 原理角度传感器 TLE5012B应用指南》说的进入正常模式后读取的值是相对值,这个正常模式是不是只指IIF模式,只要是在SSC通讯方式下读取的角度信息都是绝对值?
Shore. 回答时间:2019-8-6 16:37:56
楼主你好,我现在遇到的问题是读取角度值的时候&7FFF的值不对,反而&3FFF获取的角度值才是对的,我现在是看的人家的工程,不知道为什么会出现这种情况,这就相当于15位的编码器变成14位的  我也很疑惑,望指教
jeffhe1 回答时间:2019-6-28 13:07:10
謝謝分享
Kevin_G 回答时间:2019-6-28 14:32:37
謝謝分享
STMCU-管管 回答时间:2019-7-2 13:46:03
谢谢分享
sincomaster 回答时间:2019-7-2 23:59:31
谢谢分享
noexistusr 回答时间:2019-7-5 13:51:21
原来 不加电阻也行啊, 学习了,感谢楼主分享,赞
tanic 回答时间:2019-7-8 09:51:59
记得STM32的SPI好像支持单线模式
generalcircuits 回答时间:2019-7-8 16:57:02
感谢分享!
mcza30 回答时间:2019-7-8 17:40:27
谢谢分享
pkoko 回答时间:2019-7-8 23:04:16
支持楼主,谢谢分享
蓝牙 回答时间:2020-7-31 11:20:17
学习学习6 A9 P1 w! ]5 t4 A# U
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版