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

STM32 硬件SPI驱动磁编码器TLE5012B

[复制链接]
颩色四葉愺 发布时间:2019-6-28 12:04
找了一下网上的驱动程序,就一份程序被抄来抄了,有啥意思?。作者还不愿意把源代码公布,把电路和程序弄得又复杂,还要加上拉电阻,软件读取数据还要配置MOSI为开漏输入,心累。所以自己改了,现分享出来!
. k' i2 A. }& ]( [( B: i0 L+ X9 ~* a9 p0 w) e
  I4 ^  _) \# m8 A
硬件平台:Nucle64-103,使用SPI正常读取即可
8 [( I' q8 \  v7 S6 @
- ~+ `4 b1 _( ^* N& H  x& x
硬件连接:8 `; p" Y. V6 I; K
硬件接线图.png
+ b! X" t" a; @1 C/ L5 M软件平台:STM32CubeMX+keil5.0+hal固件库
. a! h4 c. _" W
' M# r/ W: }9 E; D9 z
  1. #include "app_tle5012b.h"4 h& ^; w3 u, d3 f& A
  2.                                                                         : W7 R: Z% D, E
  3. 3 E, O: r# Z! _- l

  4. 7 c1 }8 m* h2 j6 @0 I- W2 \
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte)+ Z) ^3 T( k6 ^6 y$ ]
  6. {4 E8 o; _$ p; E# M* I5 [
  7. 7 `; f+ e  s& ^# O
  8.         uint16_t read_value = 0;
    5 {+ I" u. s! |! c. j& o3 J2 w
  9.         
    3 Z1 g" d$ B' }6 Q2 L
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );+ C- F, Z* S( G* }) I6 U2 O
  11.         
    $ E3 o3 W9 `; x8 s8 o; M
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );
    $ i- n$ a" v! ]$ X3 i
  13.         return read_value;" @$ [" t' u3 h9 F7 I% w: s* e7 S0 S" ]
  14. }, n8 ?+ l$ n: Q! o  G; S0 z+ {
  15. : z7 U) y4 |: O4 N
  16. , ?) v% l/ Z, {) ~, G8 C2 [1 `& e' j$ ]
  17. double ReadAngle(void)5 S6 t; ]/ m  V) u" ~! e
  18. {4 I/ o* s! h9 X1 F( E
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );
    ( ^2 |# }: P  g. K- E$ d3 Q
  20. }
    8 W+ ~- j0 W0 J$ U* u  M

  21. 7 s2 `; m4 ?1 m* R9 w# [5 W
  22. 2 o5 h  l% h: t2 Q* P6 t  W
  23. uint16_t ReadSpeed(void)
    5 e( e8 P2 H$ k2 P( t
  24. {1 @8 \  G( @$ O5 r) A8 _* v9 V
  25.         return ReadValue(READ_SPEED_VALUE);; E; ^# {9 B% _3 T" z. [8 m" J
  26. }5 F3 }  R1 s; ~% P: z
  27. " ^3 ?! T" u7 |- Z! D0 Z

  28. ( C% z# |( w% ~7 i( N, X. I
  29. uint16_t ReadValue(uint16_t u16RegValue)# ]) G! G# U# k6 v, b
  30. {
    ; W9 A% h) g" L4 O8 Q
  31.         uint16_t u16Data;4 `3 z9 W, F% l& T  Z

  32. ( S5 Y7 g; s& g
  33.         SPI_CS_ENABLE;, ~% V6 W0 i3 K  I5 e5 p
  34.         + p/ V4 r  U9 g
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );
    9 L( B. `" M" r. q- Y& [1 j
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );) I5 y  e8 I7 L& i& f0 t2 R1 i" E% H
  37.         ' p: K/ i. E! D( [9 y
  38.         SPI_CS_DISABLE;- O3 X0 ?6 A$ ?; K( D7 X) F

  39. + \: K% o& C7 u  Y
  40.         
    , {- z: P! c) O+ R0 M
  41.         return((u16Data & 0x7FFF )<<1);& j0 Q$ V7 d1 l0 `$ l
  42. }. d5 l% K! W0 C) [- @; v
  43. 5 u" T: a9 j; p+ q. L& j; ?5 j7 N! X
  44. 3 t7 }: i, z' {, ^  e
  45. 2 `3 u9 {' \9 B( ^8 f" v4 s
复制代码
  1. #ifndef _APP_TLE5012B_H_& A; M+ Q; q, O5 F8 I& w6 m
  2. #define _APP_TLE5012B_H_: C8 }9 ~" a5 N, I0 C

  3. . h' L; [& h- ~# u5 V5 q$ r
  4. #include "cpu_common.h"
    ! _+ h3 A- w1 U( l3 y+ P

  5. 7 q! b7 a+ h# k
  6. 5 ^# q+ C, i. I

  7. # Q+ C$ R2 [* Y" O) Q
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_40 I- e3 x0 E3 S
  9. #define GPIO_CS_Pin_Type  GPIOC3 k0 P( Y: w$ g& ]! Q

  10. 3 X* H7 v8 X6 Q( ^) B# t6 o: l% ?* g4 C
  11. ) k  L0 L) X2 b! w
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET ). R5 `% r: n: f! Q$ h7 g
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )$ Q$ B6 J4 e1 U. s3 c/ ?# Q
  14. 6 w, A* X  S1 u, V" N3 S

  15.   r* X1 E8 o. l; r; e' r4 e
  16. /* SPI command for TLE5012 */
    3 X$ _8 }8 Q" C# P8 M
  17. #define READ_STATUS                                        0x8001                        //8000
    2 z% [2 F; q0 A1 }  [
  18. #define READ_ANGLE_VALUE                0x8021                        //80209 Q; A8 q. q2 |0 w: g- _  ~3 M
  19. #define READ_SPEED_VALUE                0x8031                        //8030) e9 B- [3 r/ S. g2 D" z

  20. ! P6 I% M; r* g9 ^+ a
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_0001: K0 r; z5 k/ Z* C& E+ M3 V9 S
  22. #define MOD1_VALUE        0x0001
    ) W7 K! ?; K' E, m1 y/ V/ |
  23. 5 y# Z* z- c+ K5 _
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_0001* L2 ]  D5 z" a( K7 Q/ W( k+ u! b
  25. #define MOD2_VALUE        0x08014 f( ~( y' ^5 z; R5 Z) q' g
  26. 4 t' A1 m& N/ |6 B
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_0001
    " t0 V" H% Q5 j( m* |1 P
  28. #define MOD3_VALUE        0x0000
    + N% K; w7 ^3 q! o) I8 T3 S

  29. ' q5 Y2 c% X" e9 g: @$ |3 ]4 f
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_0001( u$ x2 \6 }7 p- ~: @7 v
  31. #define MOD4_VALUE        0x0098                                //9bit 512
    & O  P+ ?' P& C+ r" G: T

  32. ! H  U/ j. q9 q! L8 S+ K
  33. #define WRITE_IFAB_VALUE                0x50B1, V9 K$ t4 Q% u3 I3 |
  34. #define IFAB_VALUE 0x000D5 g. s! }3 V: g+ Z
  35. /* Functionality mode */
    3 n, x/ }7 d$ s( c5 A
  36. #define REFERESH_ANGLE                0
    ! `) \& T, e5 B5 x9 {- g
  37. * x) j9 P! o: q& I
  38. void SPI_SendData16(uint16_t SendData);
    - s5 v! i& Y( o2 c0 g  [, B" L
  39. uint16_t SPI_ReadData16(void);
    0 l: ]$ q% R. H/ ~
  40. double ReadAngle(void);
    5 E$ y# ?" C1 [$ K9 S7 _" b
  41. uint16_t ReadSpeed(void);
    - D8 y+ ^2 S' A" P) J4 W1 E7 N
  42. uint16_t ReadValue(uint16_t u16Value);
    $ q) L! l# T3 |- f$ D% V. v
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);  L0 y& I2 v3 ~, P, n4 w
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);
    * Y' M. m1 {6 }9 ]

  45. - D  n3 r3 c+ K2 O4 p( i

  46. 3 u/ q: D( y/ P
  47. #endif
复制代码

5 N9 I1 s" h2 a8 j  k5 M* u) T1 O读取角度打印在串口助手上
, p  }3 W3 H) ]( p- v 微信截图_20190628120124.png . Y7 M! R  r) J( w  F# p/ Q5 _# W
( Z" u. @# [1 r
源工程: tle5012b.rar (3.55 MB, 下载次数: 297)
收藏 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
学习学习
! }) z6 w! H3 ^( A8 T3 t2 Z# n
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版