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

STM32 硬件SPI驱动磁编码器TLE5012B

[复制链接]
颩色四葉愺 发布时间:2019-6-28 12:04
找了一下网上的驱动程序,就一份程序被抄来抄了,有啥意思?。作者还不愿意把源代码公布,把电路和程序弄得又复杂,还要加上拉电阻,软件读取数据还要配置MOSI为开漏输入,心累。所以自己改了,现分享出来!
. i# c: j" F9 q1 j4 r& C6 C1 i) t$ K3 d
: p2 \  T4 g5 p1 i+ z: F" |3 _
硬件平台:Nucle64-103,使用SPI正常读取即可# f& |7 L% X( W0 {' w+ t; u
- d: |" D. n7 y8 L8 _; l4 n
硬件连接:/ p2 z' d' x. v3 O/ W* @
硬件接线图.png
, O! c- e4 v/ U# ?! g( k3 G; T软件平台:STM32CubeMX+keil5.0+hal固件库- u6 _! m) A- T! I/ A9 _  T+ `# a

, I+ k4 }5 W3 ]+ W  D& y: _
  1. #include "app_tle5012b.h"
    7 P& j% w" U  u3 [$ ]
  2.                                                                         & C- J* |+ J) b" v6 s
  3. 4 L. U/ H! N. b! d6 m; [

  4. 9 {5 A; h8 [0 N7 ~; r' F, V
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte)! Z0 U  @, ~) D" W9 k
  6. {
    * ?) d/ e8 N: z$ u3 j
  7. 1 p% \7 @; }. \7 _0 m+ m; Q( n% c( F
  8.         uint16_t read_value = 0;4 h1 L9 Y7 T$ [7 k: ]
  9.         + f8 }) V2 g8 \0 G/ g! D
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );
    * \" U1 W6 Q) m1 T* m" h+ [: k) a
  11.         
    2 S& z9 Y! h( ~! d' @8 C
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );
    3 P/ y( r3 m. B" Z
  13.         return read_value;' z/ Y% r# p0 m3 z3 t+ T- t, w$ b
  14. }
    7 c4 o6 O5 m$ ^

  15. 0 i3 F6 d% ]! a* d# v$ A. ^
  16. % G* N( Y$ B3 R; k5 i8 g6 D
  17. double ReadAngle(void)2 p; k7 [( [/ i. A
  18. {
    , H$ k; S/ [9 \; J
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );
      j1 C$ i" y8 _0 F' j
  20. }' f. _$ S; O) G* P2 U, j4 G9 f* j) |- j

  21. 2 v5 F9 O* l  Y/ p# G6 s
  22. ! o7 W) L3 N+ _5 T2 D
  23. uint16_t ReadSpeed(void), ?, p0 e8 W5 M2 U+ [
  24. {
    - f& w& a8 W- v5 h* Q. W7 f1 g  R
  25.         return ReadValue(READ_SPEED_VALUE);
    + F" `% f; g6 D( m
  26. }$ K+ A+ i/ r- l0 w3 L

  27. ( k- @( Y% \  @3 _

  28. ( P. a0 M" U. `
  29. uint16_t ReadValue(uint16_t u16RegValue)3 j* t. V! Z, i9 {. G  {- K
  30. {
    + y+ C" V' I9 Q, B  m
  31.         uint16_t u16Data;+ J% l( Y$ I0 A2 w' X& m  E4 c% G# L

  32. ; V5 n  T+ a3 P  O  w/ m$ V2 S
  33.         SPI_CS_ENABLE;
    * ], g" a9 W; X8 K' l
  34.         ) O6 L* T2 h6 D8 }
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );
    6 i% ^+ }9 N+ ]7 ]
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );; ~* ~2 k) m2 p$ q. ^
  37.         
    $ A: m$ l  S! Q2 n" U8 ^, ?1 ~
  38.         SPI_CS_DISABLE;
    & I' K* n# N' x* ?/ v

  39. & y2 l- ?% \) N2 d, e5 D6 h' }! {
  40.         
    : ~2 g: v" c/ f, D3 C5 I
  41.         return((u16Data & 0x7FFF )<<1);/ Y5 d* d3 C) q  H- a( O
  42. }
    5 X$ [5 s) t6 {# `$ |, f) L- R

  43. % ~" H) Q$ I) ?5 p$ k

  44.   R0 D& v7 Q4 U2 X$ l
  45. 4 k1 h1 p1 q- S# l* _' k
复制代码
  1. #ifndef _APP_TLE5012B_H_
    , m8 |8 w1 `1 ]6 y% l
  2. #define _APP_TLE5012B_H_; R0 K# [- C4 [7 @) f, W3 s$ s

  3. , j; b6 h. K. a- {% p! d
  4. #include "cpu_common.h"
    ) {1 O* l# ?5 }) u" q7 T

  5. 2 ^. P9 W+ z0 D& a

  6. 6 l. E# X# I! [. v9 f7 f* w
  7. . f/ L( |0 U: N' f$ o) g$ Y
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_43 c2 u2 r, u$ {, j
  9. #define GPIO_CS_Pin_Type  GPIOC2 k# D, @4 m6 U, M1 J9 A+ C$ G3 W

  10. ' G/ q$ y! u- C: S3 x
  11. 7 F+ o2 _2 z* G. b; x* B
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET )6 ~4 x, l1 f+ P, p0 f
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )1 S2 e$ b9 ^1 F, v% J$ ?; w3 {$ I

  14. + D3 F; l, \( s
  15. $ A; @* H3 l+ o0 l4 ^0 N- K
  16. /* SPI command for TLE5012 */
    ) s8 w, M. n! M( R3 [  u) q- N
  17. #define READ_STATUS                                        0x8001                        //8000
    ! `8 V' }$ N: z# U
  18. #define READ_ANGLE_VALUE                0x8021                        //8020
    ' b: R0 N0 l' H* a$ e4 `, ]
  19. #define READ_SPEED_VALUE                0x8031                        //8030
    . h& D% B- _' |# o' B

  20. + `/ @8 E& o6 W" S! _# D4 H
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_0001
      z9 \) K# D. Z% F
  22. #define MOD1_VALUE        0x0001
    + A9 _9 P  Y" S: @4 n8 _
  23. . v5 {8 p; ~+ k7 z0 [) ~0 R- {
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_0001! c7 [! l( \) ~
  25. #define MOD2_VALUE        0x0801
    7 S$ d( E1 r* W* Z) H+ [( p

  26. : L- G8 z- v7 w" e% r3 w6 S8 T# ]) V
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_00015 x; m6 r. N3 Z$ x! [& U, }
  28. #define MOD3_VALUE        0x0000
    3 v& L4 S' ?: b/ O6 T

  29. ' P. \% A# j+ F- n
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_0001
    6 z$ N7 W9 s+ d2 P; f% H" e
  31. #define MOD4_VALUE        0x0098                                //9bit 512
    # f/ J' ?7 D' R& E# ^! C- ~

  32. ! E. {) _6 _0 C6 ]- C. v
  33. #define WRITE_IFAB_VALUE                0x50B1  O; k& A* B0 @6 e
  34. #define IFAB_VALUE 0x000D
    * E$ C: K6 i- y1 M% m& C
  35. /* Functionality mode */% E8 n( D5 D( `, \' G
  36. #define REFERESH_ANGLE                0. l9 n# ?9 r/ v! h0 z

  37. 9 w. m* W, g! k/ f
  38. void SPI_SendData16(uint16_t SendData);) K% K' f. E7 ~
  39. uint16_t SPI_ReadData16(void);
    $ j1 G; y$ \& Y, `! U, {2 Y  H  l1 A
  40. double ReadAngle(void);3 F4 }- f5 f# b$ m8 _+ y
  41. uint16_t ReadSpeed(void);
      B  o% x' L7 C" _$ |* i1 k6 E) G
  42. uint16_t ReadValue(uint16_t u16Value);
    1 H) E$ |6 D# J3 p) i1 r* R9 E
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);
    - W+ L* v. z0 o3 g4 z, n
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);
    & i  p/ T8 B8 V. H6 k

  45. . T7 A# j# B# ]- W. D; x

  46. . D  C8 ~4 l' I6 `
  47. #endif
复制代码
& s: c* }) @  j
读取角度打印在串口助手上
4 u. l" L4 m( B! F: }8 ?, u% h 微信截图_20190628120124.png ' D- W& f5 T& V" F

' r& h# A, I) Q* V) Y, v6 g源工程: 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
学习学习; F8 F9 [4 v: h
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

相似分享

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