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

STM32 硬件SPI驱动磁编码器TLE5012B

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

9 N; V) e/ A& W. B8 `# z

/ R2 e/ }! Z0 m) ^$ ^/ }8 r硬件平台:Nucle64-103,使用SPI正常读取即可7 S% x1 Q. h5 r( f% G/ X1 i

3 I. D/ i! p' X1 {硬件连接:, Z6 ?! y1 y: D& g
硬件接线图.png
, P# X: Y+ |0 J$ \) ]软件平台:STM32CubeMX+keil5.0+hal固件库. k* u, _+ D2 i2 y6 Z0 h$ z
& U- s9 \3 Y, I+ P/ T& O3 p+ W
  1. #include "app_tle5012b.h"' P9 l0 {' g! u( v/ s8 L) y+ G
  2.                                                                         ; b, g" B6 o7 v, \) G; r

  3. 6 I. l& m. B; v

  4. $ I  _4 ~& g, r& H2 i; q
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte), ~1 [/ @' I/ S- q# R2 J
  6. {2 z; F  h# D7 h. n. J/ K9 j2 [

  7. % Y3 }8 I) F  P4 w! V- S, m
  8.         uint16_t read_value = 0;
      s% T, W( B; R) `  F0 a
  9.         
    + s  m0 P) U2 d: e( d+ ]  q
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );
    # w) C& h9 k0 {; o- U) V! {
  11.         
    + ~7 ]- J3 y6 @5 T
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );
    2 O1 B3 ?1 n: c% j. k# |
  13.         return read_value;' g/ M# V  J' U- y
  14. }2 H# V7 i" l$ A7 u  @" B
  15. 5 J0 {  ]9 t" U  v' w$ |. b* m2 m1 g  ~

  16. 3 Q3 O' l( n1 E+ @1 u, Y
  17. double ReadAngle(void)
    2 ]: V; b1 ~& [6 i: r7 W
  18. {
    $ a* b% l2 _1 H
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );7 H2 Y" B8 z# x3 m* ~* ]! c, q
  20. }) t$ S; l% x9 k+ w

  21. * K- J9 k$ y$ Z. ^+ X. D+ W

  22. 5 v8 {- s6 M, l3 b
  23. uint16_t ReadSpeed(void)
    * b, x- l* b( a
  24. {
    ! R/ B8 {0 E' A) |* s
  25.         return ReadValue(READ_SPEED_VALUE);
    / @7 @  o! V# C( J
  26. }
    3 w8 M8 `6 I$ C" o& G% r
  27. ' `, }0 n$ f: I0 x- q8 I
  28. / V$ O3 Z/ \2 E
  29. uint16_t ReadValue(uint16_t u16RegValue)9 z2 N+ k- s( |7 Y3 H  A
  30. {9 V2 U: P$ F5 i5 S+ _  m
  31.         uint16_t u16Data;
    ( a3 ^, T$ _) m6 t

  32. " h! t4 D; F# v' N
  33.         SPI_CS_ENABLE;9 W+ c6 Q, R  T: u) c
  34.         * @9 `8 m, D4 E3 ~+ `& ]
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );4 ]6 ?2 k: i1 F: Y0 {" f
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );2 }* Y' B: e' _+ R8 N
  37.         
    / L. E# p8 x8 C% Y( R1 d, O; W
  38.         SPI_CS_DISABLE;2 T# L. y5 R0 ~- w! T" G& H6 w, a

  39. + s/ t5 T" R* \; E( W3 u
  40.         , W/ b1 _! l2 ~0 L
  41.         return((u16Data & 0x7FFF )<<1);
    2 @: g7 p6 {! i4 T' E7 n: y4 `& O
  42. }- H+ s3 a/ [) g5 ~% B3 o( G; z/ q3 X

  43. 7 E# ?$ }4 V8 m. C
  44. 5 p$ X1 y4 I! q  h8 E0 B, @, E5 l" s

  45. , e( ?  x  z8 ^) Y& X: a1 i2 L/ }1 B6 T
复制代码
  1. #ifndef _APP_TLE5012B_H_
    9 r% j2 q: s( P5 C' ^1 ?6 o
  2. #define _APP_TLE5012B_H_
    5 c& ~+ h9 q5 ^# h( q: {! e& D

  3.   E7 O7 P& ~, N) R
  4. #include "cpu_common.h"4 q4 h$ G2 \" y; q. h
  5. 7 L" i4 }3 s/ s2 n/ ]% ^
  6. & F. S, F4 @; ]2 ?4 Q

  7. 1 y% E( C- P5 B
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_4" D1 G) o' j( Z4 ]& _, [7 ]# _
  9. #define GPIO_CS_Pin_Type  GPIOC
    * M( r1 I# j$ w( p% `
  10. : i- P9 }4 M2 u- H$ U- A; e
  11. : R) p) A* r) f- j( x
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET )' U- Y7 R! f- ]; V- j
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )
    - t6 B: Y( ^/ H. Q
  14. ! a8 _$ M$ B  u7 f  Z+ p  e0 G; p
  15. 0 C. t! }* O6 J+ R/ u
  16. /* SPI command for TLE5012 */
    ; r# m- |: h& z# C) G) w3 f) _
  17. #define READ_STATUS                                        0x8001                        //8000
    $ C; s6 j% Q; W& {) V& _$ }
  18. #define READ_ANGLE_VALUE                0x8021                        //8020
    8 l; ?" O/ w# q
  19. #define READ_SPEED_VALUE                0x8031                        //80304 [6 |& C% {. r, K# j1 g
  20. 3 _- \( p2 H$ w2 }& p# c
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_00013 w. C& I( _" @4 Z: ]1 z0 n
  22. #define MOD1_VALUE        0x0001
    : ?% v) O/ g8 N& m

  23. $ R8 b9 b2 ^$ B: [# ^3 O
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_0001
    * Q0 a: T; |% z# v
  25. #define MOD2_VALUE        0x0801
    0 c1 O9 [, K% }4 v
  26. " r  T/ o; `+ _3 |0 {! B% }, a
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_0001* ]7 E' h1 q/ C; X9 F
  28. #define MOD3_VALUE        0x0000
    0 i  N# \% U$ S- u
  29. * i5 ~  r* G& [. N& C* S; U7 k5 a
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_0001
    0 G; \: C; a8 W* }: a
  31. #define MOD4_VALUE        0x0098                                //9bit 512
      P& _8 H1 C* O7 h! i# z

  32. + E' |' s3 ^" `% N  T
  33. #define WRITE_IFAB_VALUE                0x50B1
    ! ?# a, A0 |7 t" ^! [! f
  34. #define IFAB_VALUE 0x000D
    , Q; P, M4 g* d5 ]
  35. /* Functionality mode */
    6 _! B- g9 Y( i5 t
  36. #define REFERESH_ANGLE                0
    / k& O5 ]& _2 K( n

  37. # K9 `  l; N9 e* U
  38. void SPI_SendData16(uint16_t SendData);
    " L; Q4 ?" `* U" U& U
  39. uint16_t SPI_ReadData16(void);: a. o+ \% t4 m- K* ~
  40. double ReadAngle(void);- G$ C3 j! m% W8 ]  [2 p9 _
  41. uint16_t ReadSpeed(void);1 x: j# m5 m0 @8 p' g: `
  42. uint16_t ReadValue(uint16_t u16Value);1 d& p4 H. Y. Y: w# m
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);
    $ Y1 d9 e9 f6 r  b0 c7 e
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);* Y5 B; p& Z8 Y

  45. 8 O$ B7 F$ Z# y* s
  46. 3 }) j" Y: s6 l4 j  X
  47. #endif
复制代码
9 F0 {5 U4 L  h9 [; E+ o) C
读取角度打印在串口助手上$ M" D/ c. y; u8 b3 a/ Z/ i
微信截图_20190628120124.png 6 O, x; u6 O. d) R
( {) }$ u( n3 O- ^! s7 N1 s
源工程: tle5012b.rar (3.55 MB, 下载次数: 485)
赞 收藏 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
学习学习
2 v  n3 _4 Q, a
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

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