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

STM32 硬件SPI驱动磁编码器TLE5012B

[复制链接]
颩色四葉愺 发布时间:2019-6-28 12:04
找了一下网上的驱动程序,就一份程序被抄来抄了,有啥意思?。作者还不愿意把源代码公布,把电路和程序弄得又复杂,还要加上拉电阻,软件读取数据还要配置MOSI为开漏输入,心累。所以自己改了,现分享出来!
$ A1 D/ C+ L' J" v' j/ o
# ^9 n( c1 e7 M+ b6 E% a
' G5 E  A( \; ?- O$ |
硬件平台:Nucle64-103,使用SPI正常读取即可# p# z* R: e) Y  a% W/ D- B

0 F8 N3 E& k$ b2 d, @7 _硬件连接:
. G+ a. \3 j! o) l2 Y# K. m 硬件接线图.png - e: i  \$ m4 S
软件平台:STM32CubeMX+keil5.0+hal固件库8 O% A# Q# x6 T. t9 y. a* j

* c! U: I3 I/ `" c& @9 J; p
  1. #include "app_tle5012b.h"# I- K; u# a) S. G' A$ D$ V4 ?3 B
  2.                                                                         
    $ _# j9 u) H& C6 E. N4 C8 @# _
  3. $ O0 ~1 z( J2 T) l; r( |

  4. : a8 ^+ I( p, U
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte); W+ N4 @0 ^* V  I* T
  6. {
    2 _% L5 |4 Z$ Z: A; i  c1 j% ^

  7. . ^" Y4 l" Z' [, Q: G( K$ n
  8.         uint16_t read_value = 0;
    6 S0 i0 ?. f! I" H- F8 u& e- ]
  9.         2 i) N9 n3 R! b2 ?5 z! N
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );/ w8 {9 a- J0 `6 z1 ^) {
  11.         
    ; o3 v; J6 l" f: w8 \
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );- Z/ s; `. e! _% E7 x5 h% `
  13.         return read_value;2 g. ^( l. ?  L; S* i6 x
  14. }
    0 X8 R6 P% G; Y! `$ \
  15. ! D6 R% _. E7 G: t
  16. : ]; q! X8 x+ {* E
  17. double ReadAngle(void)
    4 \2 M6 n/ ~: }% G+ a" j& P$ E
  18. {1 @7 _& |; _: G+ ~: q
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );! k$ i8 p+ h" [; f0 F0 F
  20. }* U' \$ E* ~8 J$ e8 A6 V3 {
  21. ; {9 z- k) v+ ?  g
  22. : L# `# i1 ~& q  `
  23. uint16_t ReadSpeed(void)
    % x- c1 M, W; Y  o
  24. {0 A) _% R3 c2 J- s+ m/ F
  25.         return ReadValue(READ_SPEED_VALUE);
      i8 Q5 D3 T" J& O5 P7 z
  26. }$ Q" s, k) ]0 M7 e9 e1 u4 ?

  27. 4 Y, Q2 k1 Q0 y* \* z
  28. + Z& P. n. j; d; p, t! L/ Q+ w
  29. uint16_t ReadValue(uint16_t u16RegValue)
    6 e, r; n' p" w1 n2 g$ ~$ _
  30. {
    4 k( |, D3 J7 G9 f4 r; b
  31.         uint16_t u16Data;
    1 E4 ^* X7 A" m- Q# A+ h. d6 h4 [

  32. 3 p: K2 t+ F; O: C6 v
  33.         SPI_CS_ENABLE;
    9 N! ^% A3 k0 Q3 I
  34.         9 M6 L+ R0 o. P2 K
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );; o8 f8 s; R( |+ q
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );
    , J3 U8 A( B0 [% E5 L
  37.         
    # k5 ^2 m0 N- x2 Z2 v
  38.         SPI_CS_DISABLE;" u( T% E0 U! s* m/ |
  39. 1 f0 u4 d; j9 s4 j$ x# o6 r
  40.         ! p( s) y; w* J( Y8 F8 P
  41.         return((u16Data & 0x7FFF )<<1);
    ; z6 j5 V2 q7 S5 N
  42. }+ F) }. U# S0 M. f

  43. # r9 B, z8 N) C' M  x$ S

  44. & g9 O: x8 j  G8 p1 _; @
  45. ! ^7 f) g' r0 {8 z. Z6 j8 S* Q
复制代码
  1. #ifndef _APP_TLE5012B_H_# ?' U' P8 v# w" {. R. F
  2. #define _APP_TLE5012B_H_- e. U7 h6 J; h9 U. x4 g( `6 j

  3. 4 d1 U" A0 P7 |+ d* L
  4. #include "cpu_common.h"
    3 h' U) r( _+ P2 e8 j
  5. ( P$ [9 Z# W& ^+ Q7 Y2 Q0 Z

  6. * e4 n, t1 Z5 r! V) @& S; U% @
  7. ; d+ h4 }' i( G2 F$ ]
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_4
    * v: _5 l7 y- h8 a, I( _3 e/ L
  9. #define GPIO_CS_Pin_Type  GPIOC
    9 j# U' m6 D, q- b: }
  10. % J2 a. {& t$ a- P6 T

  11. ) g$ Z( b; L& b- k* M
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET )+ v1 Q) r( y/ N" n
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )+ e: _7 x$ G4 x' v/ \# o
  14. 4 Z- E0 A) J- G0 l0 l$ z- n

  15. 3 W5 _) r+ N4 M
  16. /* SPI command for TLE5012 */
    3 ]9 y4 Y  `) `1 E: X# g1 z9 i, U
  17. #define READ_STATUS                                        0x8001                        //8000
    9 c; l: ]2 I: z1 r% P+ x0 u3 d) F
  18. #define READ_ANGLE_VALUE                0x8021                        //8020
    + T2 ]% B! e! b+ B# p/ C
  19. #define READ_SPEED_VALUE                0x8031                        //80305 Q! e3 @* R& O1 r

  20. & k6 j; V* T! O6 Z. A2 x5 g$ t
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_0001* y% s7 r: a! y* g3 e* W) T- V
  22. #define MOD1_VALUE        0x0001
    8 O- K7 d$ }& l2 W! [' q( Q& _$ R
  23. * ^9 l8 ~- n, u, ^- g' a
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_0001" s8 ]5 o- y9 c
  25. #define MOD2_VALUE        0x08010 ]& }( H& s7 z0 y/ L; M9 z( o

  26. - R- i' S1 h, q9 g) v5 G& Q
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_0001  H  E- _; _  ^. ^9 H. V
  28. #define MOD3_VALUE        0x0000
    - J$ ~7 H" f4 s  T
  29. 7 P) y: J+ B$ h
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_00011 S: k# ]1 k7 Y* I9 R3 H, ?
  31. #define MOD4_VALUE        0x0098                                //9bit 5127 m: j' t/ {; B
  32. ; M' Z: R, Y) A7 p: g/ P: B
  33. #define WRITE_IFAB_VALUE                0x50B13 V; u! @+ `) t
  34. #define IFAB_VALUE 0x000D
    - }% ?1 d' O9 ]/ X
  35. /* Functionality mode */- L9 S; `1 i; |, D
  36. #define REFERESH_ANGLE                0. Z% X! h2 z. W+ W& i0 J( W

  37. * R: Q" s4 }, v7 |
  38. void SPI_SendData16(uint16_t SendData);& Z- _/ Q1 n- @* _' k+ B, C- P
  39. uint16_t SPI_ReadData16(void);+ K! T( p- A2 q, T
  40. double ReadAngle(void);* @' {% v7 d. D9 J
  41. uint16_t ReadSpeed(void);
    5 X/ D' e$ e& _" u' P8 e& l
  42. uint16_t ReadValue(uint16_t u16Value);9 |& Z" x5 t' M9 E" c
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);5 L: h- F6 J+ |, L" e) M
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);! ~/ Y! n7 r! g. c

  45. 7 F) d) p* u& Z/ G
  46. ' [+ B% h" X( I. T
  47. #endif
复制代码
/ I. n. ~) T. r7 A
读取角度打印在串口助手上
# M0 e; s2 Z" |# H% p2 ^7 m 微信截图_20190628120124.png
" U5 ^5 A. H8 N0 G& l$ ]: N8 }
: L9 z' n, o4 c: \源工程: tle5012b.rar (3.55 MB, 下载次数: 264)
收藏 3 评论18 发布时间:2019-6-28 12:04

举报

18个回答
Shore. 回答时间:2019-8-7 10:18:43
我有一个问题请教一下大家,通过SSC方式读取的角度值是绝对值吗,之前看到这篇文章《基于iGMR 原理角度传感器 TLE5012B应用指南》说的进入正常模式后读取的值是相对值,这个正常模式是不是只指IIF模式,只要是在SSC通讯方式下读取的角度信息都是绝对值?
Shore. 回答时间:2019-8-6 16:37:56
楼主你好,我现在遇到的问题是读取角度值的时候&7FFF的值不对,反而&3FFF获取的角度值才是对的,我现在是看的人家的工程,不知道为什么会出现这种情况,这就相当于15位的编码器变成14位的  我也很疑惑,望指教
noexistusr 回答时间:2019-7-5 13:51:21
原来 不加电阻也行啊, 学习了,感谢楼主分享,赞
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
谢谢分享
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-3-25 21:49:15
这个程序有问题的
蓝牙 回答时间:2020-7-31 11:20:17
学习学习
# P* a2 Z* P6 i$ Y% B
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版