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

STM32 硬件SPI驱动磁编码器TLE5012B

[复制链接]
颩色四葉愺 发布时间:2019-6-28 12:04
找了一下网上的驱动程序,就一份程序被抄来抄了,有啥意思?。作者还不愿意把源代码公布,把电路和程序弄得又复杂,还要加上拉电阻,软件读取数据还要配置MOSI为开漏输入,心累。所以自己改了,现分享出来!
! \' j: ]: ^  ^" l4 c
5 s+ O& B& K, K
3 w' n& w6 N8 X4 h" I
硬件平台:Nucle64-103,使用SPI正常读取即可
& o) A/ z& ^6 p) k- ^8 Y
0 G1 e! \! Y6 U$ i1 {# b+ P5 d
硬件连接:
% F1 Z5 w) V) g& K! A: W- H, ` 硬件接线图.png
3 f8 i* |! W  E$ u8 D) h8 p软件平台:STM32CubeMX+keil5.0+hal固件库4 X( g7 T3 i1 {2 T
8 d3 ^) k% j3 [" W% d+ Z
  1. #include "app_tle5012b.h"! ~) p  D* Z) w4 L8 ]0 N
  2.                                                                         
    3 T2 E5 M' t0 n9 {1 u- _$ b6 ~
  3. + i. w5 j1 S3 S+ L2 o# G

  4. 3 X8 R' o" @$ O. L. b
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte)$ A* W* J  k2 q7 I6 P* K
  6. {$ W5 p7 p3 ~. d0 ~3 H8 s" H* o

  7. $ M! [+ Z0 O8 }: ~- V
  8.         uint16_t read_value = 0;
    7 K. _9 ^& y# H# j: j
  9.         
    5 l. m$ u( O+ g. [4 Z. u9 A3 T1 p, c
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );
    $ F! A3 Z; h+ M" t/ i, G- v
  11.         
    1 O) G& n" R1 A. R0 X& Z
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );0 H( D4 E  F* I1 A/ _3 C, a1 U
  13.         return read_value;
    9 i/ D# @( o5 p0 a6 i! h
  14. }( R  v* k- u* u0 e! ]1 W8 U7 |& o

  15. 0 L- X$ Z5 o9 p9 `: l
  16. 9 C  s: k0 L) w/ ~( o: p& X% |
  17. double ReadAngle(void)
    . D2 b! W( e7 Y& j) [
  18. {
    ) e$ U) E0 Z1 v) s6 I
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );
    1 P7 Y! j* e: F: o8 B" [/ a
  20. }
      M2 l% ?# G2 Z

  21. 1 B# }0 M/ Z8 w5 I( H" o

  22. 1 _. e% O$ T# k; s) K3 h# Q
  23. uint16_t ReadSpeed(void)
    ) p# R$ J! f5 q; C- i/ T- J
  24. {: ~! i* I4 d% m+ f; m8 e
  25.         return ReadValue(READ_SPEED_VALUE);) Y. m5 B# Y& A7 ^  Z
  26. }* h8 L5 V* r+ V6 H

  27.   D: x# b- @# J( T/ B5 `- Y

  28. , b- Q3 X- K) T8 C' P' w! T
  29. uint16_t ReadValue(uint16_t u16RegValue)
    : N' w; z& X) k& S1 D; s
  30. {/ N4 [, j6 i3 z+ Q. D" C
  31.         uint16_t u16Data;& M& g5 E" L' A. E$ q

  32.   D& I& I8 M) K! u
  33.         SPI_CS_ENABLE;) d8 p' e. Y4 m& J( w. ^. J
  34.         1 d8 H5 r# N+ i4 d+ S
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );! P* n* A7 E9 z% n
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );$ J' u  E# [) s% y9 M; I
  37.         
    * T9 P* @4 s8 X9 {
  38.         SPI_CS_DISABLE;4 v/ |" R5 m1 @7 L1 H/ B, E. J

  39. 6 U+ n+ s: b: w# G4 o! g
  40.         4 l* ~+ S$ |/ l6 W; [
  41.         return((u16Data & 0x7FFF )<<1);. I3 |  t8 x. ?/ q0 D, y
  42. }
    ; n1 z( j5 A8 l3 B

  43. ; J% K; |, j  x+ x0 |3 p

  44. 7 e% h+ z5 A$ j, M% ^; a
  45. 2 y' s) \! w. z) C5 S# G5 T
复制代码
  1. #ifndef _APP_TLE5012B_H_
    8 v) w( {) p0 f7 u' S
  2. #define _APP_TLE5012B_H_  E  b& \9 u% T

  3. % s. X$ S1 [7 P* c9 x
  4. #include "cpu_common.h"0 H, `  A5 {: s7 _8 P- V

  5. 8 ^# h7 F- I( D
  6. ( _/ }- P1 A% q! p. u( K" D

  7. % t3 B( t8 o% M; f
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_4
    . w0 V1 }# k% _) }4 U
  9. #define GPIO_CS_Pin_Type  GPIOC) Z  j# I1 ^& y$ e- U8 z

  10. % i6 H6 k9 E1 A  o

  11. 1 I" w8 y8 t( u( W  o
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET )
    ) A9 ?* W7 l8 q
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )
    5 t5 G+ O1 p" p! T, `4 K

  14. , z# e1 ~9 J1 e0 ]

  15. 4 z: _+ L: }0 S5 ?, ?! @
  16. /* SPI command for TLE5012 */, `, ]2 R& j+ ?, f- d
  17. #define READ_STATUS                                        0x8001                        //8000
    5 p$ {9 {, z7 d
  18. #define READ_ANGLE_VALUE                0x8021                        //8020* c4 D& g0 [. _: a+ D6 X6 ]! g8 A# n5 U
  19. #define READ_SPEED_VALUE                0x8031                        //80306 b- _+ J; z& i$ S, e" W2 C+ d+ W

  20. " |! z( z4 B# n9 C. C' \
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_0001! R% Z! i/ x( z! O8 I
  22. #define MOD1_VALUE        0x0001* V6 y) j6 J, u7 K

  23. - [3 _8 G) P% D) x( v
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_0001" O7 d* F' Q; G) g- k
  25. #define MOD2_VALUE        0x08019 b. E" G, @% Z, i6 {
  26. ) b& A( _# J% X% o1 ~) L
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_0001
    ! D0 T- B5 d7 I, u* }- d
  28. #define MOD3_VALUE        0x0000  R5 A. {; e# |  S! G8 L5 {2 `

  29. & E$ [( t0 P) b2 e. b
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_00014 Z" A3 u9 G2 J, k7 ~* O3 _
  31. #define MOD4_VALUE        0x0098                                //9bit 512
    9 b$ N& o8 c; _8 t" r% l1 t

  32. 3 O- r1 B- C. B" m
  33. #define WRITE_IFAB_VALUE                0x50B1
    5 q5 a" T4 q( Q2 p5 ]$ O
  34. #define IFAB_VALUE 0x000D
    9 H3 q3 ]. }3 Y4 D6 L6 O( X
  35. /* Functionality mode */
    - N9 |3 u% {* h# P
  36. #define REFERESH_ANGLE                0
    # b2 S  y  A- Y( q: M: z' a4 w
  37. - Q! O0 N& l- L& v
  38. void SPI_SendData16(uint16_t SendData);
    4 h  a$ W4 ]: ]( S
  39. uint16_t SPI_ReadData16(void);
    + Q* _$ s: R3 Z2 K+ E
  40. double ReadAngle(void);4 y6 i& g7 u0 O
  41. uint16_t ReadSpeed(void);
    3 J9 I8 p0 K9 E# b- ~0 g0 a
  42. uint16_t ReadValue(uint16_t u16Value);
    ! N8 ?" k: H" w7 S) n5 t1 u
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);
    / N0 ]& L# U1 H* ?
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);
    $ w. N0 G% B4 f; k
  45. $ T, a" \% e' x) l" K
  46. + g, e) z0 j% e1 b- y* v
  47. #endif
复制代码

* V% s1 q3 M$ \+ c$ ~# \1 ?7 s# O读取角度打印在串口助手上
/ v! U6 P$ \9 }1 Z 微信截图_20190628120124.png
3 z; c' F  W1 ]5 `. u9 F1 {# X
$ G" X4 u( ?- }( n源工程: tle5012b.rar (3.55 MB, 下载次数: 484)
赞 收藏 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
学习学习& A6 c- ?/ i, J) O
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

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