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

STM32 硬件SPI驱动磁编码器TLE5012B

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

# u+ {  {9 k" S硬件平台:Nucle64-103,使用SPI正常读取即可8 Y! W. v2 ^7 L+ y8 `

7 T( B$ _4 [! r: G9 T" U1 S硬件连接:. N- ]3 ^. d$ c+ M; [' i/ I+ o
硬件接线图.png
. j. y. @, |9 {% Z软件平台:STM32CubeMX+keil5.0+hal固件库
0 B* y( j7 M  v0 j' L. o+ J& ^" g
  1. #include "app_tle5012b.h"1 P. @4 j0 V6 r/ m2 w3 r: D0 T+ p: T
  2.                                                                         
    2 z7 C2 R7 r$ S2 i+ V

  3. , A4 p( @8 t1 Q" ?
  4. 2 x3 `& y5 M* [/ R
  5. uint16_t SPIx_ReadWriteByte(uint16_t byte)
    & q2 w8 n* L% L; M) g8 {
  6. {
    & K% H7 v( c$ x5 c% z0 b2 F

  7. & `7 ~7 M3 n* L( v
  8.         uint16_t read_value = 0;( X! h4 J' c7 f
  9.         3 z! Q) _* U2 t' ^$ t6 y/ \; Y
  10.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&byte), sizeof(byte)/sizeof(uint16_t), 0xff );
    / s: N# k' D9 P# _( q
  11.         
    - v- f: D! N; A) H+ J! P( l* [2 M
  12.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&read_value), sizeof(read_value)/sizeof(uint16_t), 0xff );
    - t# b1 w6 ]* T! _
  13.         return read_value;5 k6 U$ [2 g$ O- M
  14. }6 ?% o) C* k1 i: w" d

  15. + ]  t7 k6 m5 g4 Z
  16. 2 ^  H- k! h7 B; B2 P& A' j" i
  17. double ReadAngle(void)' x. q; R# p6 U9 `2 l
  18. {8 S5 C! K8 n6 r2 F
  19.         return ( ReadValue(READ_ANGLE_VALUE) * 360.0 / 0x10000 );. h" K9 l/ k' ]) _$ n) W
  20. }" R, p! E0 S1 j8 s5 J

  21. ) Y2 j8 r" `+ S9 V. [% `  r8 a
  22. 4 J9 Z' B/ k9 n; K  w% ^& l* }
  23. uint16_t ReadSpeed(void)  W' _- l" |& g+ e. w# ?( K* p
  24. {% ?& p* u, Z7 v, y/ M) J
  25.         return ReadValue(READ_SPEED_VALUE);; c. l) C1 V+ s) k
  26. }
    ) ]7 x, B; F9 z
  27. 8 A/ C* I, C8 U: g- H8 _0 e+ g+ c
  28. % `5 V8 o# a/ R/ {( {# M
  29. uint16_t ReadValue(uint16_t u16RegValue)5 k2 {1 x& d  c% F
  30. {
    / K% y3 T8 f7 h! w* a6 t$ |
  31.         uint16_t u16Data;
    : I' Q, c, F, e* p

  32. 7 V. d# @; t7 ?
  33.         SPI_CS_ENABLE;
    " K9 C0 ]( H' Y: g% l3 u- _
  34.         
    . p7 [. T' ?4 G9 G! v; D8 [: n2 t
  35.         HAL_SPI_Transmit( &hspi1, (uint8_t *)(&u16RegValue), sizeof(u16RegValue)/sizeof(uint16_t), 0xff );/ b5 ]9 t! K! r/ x1 o) p
  36.         HAL_SPI_Receive( &hspi1,(uint8_t *)(&u16Data), sizeof(u16Data)/sizeof(uint16_t), 0xff );& L0 `' V1 t0 T& S
  37.         
    & r& Q) V$ n+ y  g3 k
  38.         SPI_CS_DISABLE;. a% r5 {3 A1 \& x4 w
  39. 0 g+ M9 |6 x* [" {8 y
  40.         
    ) `' `8 p4 m; @  h, _
  41.         return((u16Data & 0x7FFF )<<1);2 @; F5 ^& T8 ~1 K1 R# m, G3 \
  42. }1 F4 g4 @! e. g) K; L$ q* U( w% j

  43. 8 r( L. X$ ~( a
  44. 7 {  v# p1 |! z/ B( \* [9 O8 i5 E

  45. $ V$ [9 v' E9 h, w% {* `9 C  q
复制代码
  1. #ifndef _APP_TLE5012B_H_# d: y7 N' a4 I, O! V9 e
  2. #define _APP_TLE5012B_H_
    ( O" v- D$ q+ Y5 `2 u: ], M

  3. * u0 a$ G$ b5 }3 @# Q) ]! j+ J
  4. #include "cpu_common.h"
    ! h7 z! p; F" Z  M
  5. , L7 E) }; E. {% T/ ?  S3 y- L% v
  6. & |& B' N- L: N6 H) j, l5 a  ^% f

  7. / }3 D  e: [9 _! O( b3 L$ h4 J
  8. #define GPIO_CS_Pin_Name  GPIO_PIN_4, D1 S' L1 r. X" s% K+ v
  9. #define GPIO_CS_Pin_Type  GPIOC
    ' ?5 `+ d3 ^' c4 U% q

  10. - c9 \1 M' d9 r! O; M& K( ]
  11. 2 z' _2 S4 K( N1 p5 k8 P
  12. #define SPI_CS_ENABLE  HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_RESET )4 |& F& Q! Z) C1 v: @2 Q
  13. #define SPI_CS_DISABLE HAL_GPIO_WritePin( GPIO_CS_Pin_Type, GPIO_CS_Pin_Name, GPIO_PIN_SET )  n1 _- z& P' H/ Y8 L: p

  14. . I! x5 r- }9 J
  15. . f3 A/ B& {; _' w
  16. /* SPI command for TLE5012 */( P% l2 T6 g/ C$ s% D) t4 S
  17. #define READ_STATUS                                        0x8001                        //8000
    ; J  o/ ~2 O2 b6 ?" I
  18. #define READ_ANGLE_VALUE                0x8021                        //8020% B: ]4 @. V* c  k; @
  19. #define READ_SPEED_VALUE                0x8031                        //8030
    8 ]* M2 w/ V' b' S& [: F" @8 u

  20. # A/ M/ U& f* a8 l0 C% ^
  21. #define WRITE_MOD1_VALUE                0x5060                                                        //0_1010_0_000110_00011 J8 q  H6 {. n0 x' Z
  22. #define MOD1_VALUE        0x0001
    & P4 U/ Q) C+ c' P; R6 x

  23. * {' s  F. f, c  q$ c  K# L
  24. #define WRITE_MOD2_VALUE                0x5080                                                        //0_1010_0_001000_0001
    + i: E' I! T, L) y" b- q$ @, ^
  25. #define MOD2_VALUE        0x0801
    4 h) j( _$ t/ Y& k

  26. 1 [0 C! D4 {1 S8 f' @) s3 a$ U/ Y
  27. #define WRITE_MOD3_VALUE                0x5091                                                        //0_1010_0_001001_0001
    # w$ Q3 ]1 `: |3 }
  28. #define MOD3_VALUE        0x0000
    ( y- k1 ]) M- q9 S. y9 I* {4 v' Q

  29. $ t) l" b. F1 z- G
  30. #define WRITE_MOD4_VALUE                0x50E0                                                        //0_1010_0_001110_0001
    4 [5 O% D/ f' d6 B
  31. #define MOD4_VALUE        0x0098                                //9bit 512
    4 K# H$ P+ n5 l0 v: A  x- p

  32.   r9 N: h) e$ v3 |4 i5 k  Z1 A) q/ ~
  33. #define WRITE_IFAB_VALUE                0x50B1
    ! W2 w3 c3 D! ^% V# u3 n$ K8 p
  34. #define IFAB_VALUE 0x000D
    * o' G/ T/ B4 n7 ?) ^- }
  35. /* Functionality mode */6 s& D; j! n% @7 Q
  36. #define REFERESH_ANGLE                0
    $ M+ z8 H& B1 }8 L, D! U
  37. 4 v* H# n. \6 W, f- O+ u
  38. void SPI_SendData16(uint16_t SendData);
    2 f, F; S$ p1 o( r2 b- ]
  39. uint16_t SPI_ReadData16(void);8 V3 y/ B" Y9 v2 X0 O9 _8 P: @+ W
  40. double ReadAngle(void);( p& ~( n2 E4 w* E
  41. uint16_t ReadSpeed(void);
    5 v/ e4 i( H8 N' C. M7 \- K* N+ P9 m
  42. uint16_t ReadValue(uint16_t u16Value);
    4 z) g: \( w% E
  43. uint16_t SPIx_ReadWriteByte(uint16_t byte);+ T) r5 b9 T0 @( d4 F+ L' ?$ j
  44. uint16_t TlE5012W_Reg(uint16_t Reg_CMD, uint16_t Reg_Data);! X( X# t& z0 V6 v* @6 ?
  45. 1 B& p1 D& h* h/ a& h

  46. 8 W& S, q/ s1 X- L
  47. #endif
复制代码
* }' t! H+ n  \- W8 Z" |
读取角度打印在串口助手上
$ v6 o/ c' D5 d/ V! D 微信截图_20190628120124.png
+ V  z+ v; v/ W  y! |; r' _' V$ \
8 k# f1 _6 V2 Q. @1 e  C源工程: tle5012b.rar (3.55 MB, 下载次数: 290)
收藏 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
学习学习% H' L. H8 Q( R0 }8 r
jackqing 回答时间:2020-10-11 08:57:33
多谢分享,借鉴学习
12下一页

所属标签

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