TLE5012b+STM32F103C8T6(bluepill)读取角度数据

1. 背景

在调试simpleFOC程序时,需要用到磁编码器,TLE5012B磁编码器价格较低,满足项目要求。TLE5012B有两种通信方式:SPI和ABI接口模式。总结一下使用TLE5012B过程中的一些问题

2. 硬件连接

MCU采用:STM32F103C8T6(bluepill)最小系统板。
传感器是网上购买的TLE5012B模块+径向磁铁。
BLDC电机:X2212-13 KV:980
USB转串口:CH340模块

2.1 SPI接线方式

由于TLE5012B采用的是SSC三线通信方式,可以兼容SPI的四线通信方式,所以使用时需要做一点调整,即MISO、MOSI同时接到DATA(4)引脚。需要在程序中控制MOSI读写使能来控制读写,而不是SPI的全双工模式。
在这里插入图片描述
在这里插入图片描述
具体连线方式:
PIN1(VDD)—> 3.3V
PIN2(GND)—> GND
PIN3(IFA)—> ×
PIN4(IFB)—> ×
PIN5(IFC)—> ×
PIN6(R2-CSQ)—> PA4
PIN7(R1-SCK)—> PA5
PIN8(R3-DATA)—> PA6
芯片pin4或者电阻R3另外一段引出线 —> PA7

另外一种可行接线方式
PIN1(VDD)—> 3.3V
PIN2(GND)—> GND
PIN3(IFA)—> ×
PIN4(IFB)—> ×
PIN5(IFC)—> ×
PIN6(R2-CSQ)—> PA4
PIN7(R1-SCK)—> PA5
芯片pin4或者电阻R3另外一段引出线 —> PA6/PA7短接
(测试过PIN8(R3-DATA)—> PA6/PA7短接,数据不对)

2.1.2 嵌入式程序

直接用SimpleFOC移植STM32(三)—— 角度读取里面提供的程序:STM32ReadTLE5012B_spi1。也可以直接到这个博主提供的网盘下载:
链接:https://pan.baidu.com/s/1ueR9a9_uL-Zce_CKTwhawQ
提取码:9qls

2.1.3 测试结果

用串口调试助手查看数据,转动电机,可以看到数据在不断变化,转一周数据变化360°,绝对位置方式,0°过了直接是360°
在这里插入图片描述
示波器测量PA4,5,6,7,可以看到间隔一段时间采集一次数据,由于示波器最小只能调到2ns,无法直接捕捉到SPI波形。
在这里插入图片描述

2.2 ABI接线方式

STM32F103系列MCU的定时器提供了独立的Encoder模式,除了两个基础定时器(TIM6/7)没有这个功能,其它的高级定时器(TIM1/8),基础定时器(TIM2/3/4/5)都有这个功能,这里用TIM4的Encoder功能,引脚使用:PB6(TIM4_1),PB7(TIM4_2)
在这里插入图片描述
可以在STM32的数据手册中看到定时器框图中:1-时钟源;2-控制器;3-时基单元;4-输入捕获。其中2-控制器部分包括触发控制器、从模式控制器以及我们这里用到的编码器接口。编码器接口是把输入通道TIMx-CH1/TIMx-CH2输入的信号,经过“输入滤波器和边沿检测器”后(TI1FP1/TI2FP2),把脉冲信号传递给控制器的“编码器接口”。具体可以参考:STM32之通用定时器编码器模式
在这里插入图片描述
具体连线方式:
PIN1(VDD)—> 3.3V
PIN2(GND)—> GND
PIN3(IFA)—> PB6/TIM4_1
PIN4(IFB)—> PB7/TIM4_2
PIN5(IFC)—> PB5/中断模式
PIN6(R2-CSQ)—> ×
PIN7(R1-SCK)—> ×
PIN8(R3-DATA)—> ×
在这里插入图片描述

2.2.2 ABI嵌入式程序

直接用SimpleFOC移植STM32(三)—— 角度读取里面提供的程序:STM32ReadTLE5012B_ABZ。也可以直接到这个博主提供的网盘下载:
链接:https://pan.baidu.com/s/1ueR9a9_uL-Zce_CKTwhawQ
提取码:9qls

2.2.3 ABI测试结果

电机旋转一圈,I发出一个脉冲,MCU捕获I信号后进入中断,把当前的脉冲计数发送出来。这只是最简程序。读取了脉冲计数值,就可以知道转过的角度值了。再配合其它TIM计时,计算固定时间内的角度值,或者固定角度内的时间,就可以计算速度了。
在这里插入图片描述

嵌入式程序

  1. SimpleFOC移植STM32(三)—— 角度读取中的程序是最简代码程序,对于理解硬件和程序,测试硬件问题很有帮助
  2. STM32F103RCTx-TLE5012B-Magnetic-Angle-Sensor
    ,这个github仓库是把官方提供的Arduino库移植到了STM32下,写的比较规范,函数也很多,可以直接调用。
  3. ODrive踩坑(二)3508电机和TLE5012B磁编码器参数配置、校准、位置闭环模式转动电机(TLE5012B-E1000)
  4. ODrive实例 #1 电机配置实例(4250-520KV + TLE5012B-E1000)
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个可能的STM32读取TLE5012速度的代码示例: ```c #include "stm32f4xx.h" #define TLE5012_SCK_PIN GPIO_Pin_5 #define TLE5012_SCK_PORT GPIOA #define TLE5012_MISO_PIN GPIO_Pin_6 #define TLE5012_MISO_PORT GPIOA #define TLE5012_CS_PIN GPIO_Pin_7 #define TLE5012_CS_PORT GPIOA // TLE5012 command codes #define TLE5012_READ_ANGLE 0x3FFF #define TLE5012_READ_SPEED 0x3FFE // TLE5012 data buffer uint16_t TLE5012_data[2]; void TLE5012_init() { GPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef SPI_InitStruct; // Enable GPIOA and SPI1 clocks RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // Configure SCK and MISO pins as alternate function GPIO_InitStruct.GPIO_Pin = TLE5012_SCK_PIN | TLE5012_MISO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(TLE5012_SCK_PORT, &GPIO_InitStruct); // Configure CS pin as output GPIO_InitStruct.GPIO_Pin = TLE5012_CS_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(TLE5012_CS_PORT, &GPIO_InitStruct); // Configure SPI1 SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_DataSize = SPI_DataSize_16b; SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStruct.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStruct); // Enable SPI1 SPI_Cmd(SPI1, ENABLE); } void TLE5012_read_data() { // Select TLE5012 chip GPIO_ResetBits(TLE5012_CS_PORT, TLE5012_CS_PIN); // Send read angle command SPI_I2S_SendData(SPI1, TLE5012_READ_ANGLE); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); TLE5012_data[0] = SPI_I2S_ReceiveData(SPI1); // Send read speed command SPI_I2S_SendData(SPI1, TLE5012_READ_SPEED); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); TLE5012_data[1] = SPI_I2S_ReceiveData(SPI1); // Deselect TLE5012 chip GPIO_SetBits(TLE5012_CS_PORT, TLE5012_CS_PIN); } int main(void) { // Initialize TLE5012 TLE5012_init(); while (1) { // Read TLE5012 data TLE5012_read_data(); // Extract speed value int16_t speed = (int16_t)(TLE5012_data[1] & 0x3FFF); if ((TLE5012_data[1] & 0x4000) != 0) { speed = -speed; } // Do something with speed value // ... // Delay for some time for (int i = 0; i < 1000000; i++); } } ``` 此代码示例包括以下步骤: 1. 定义TLE5012的引脚和命令代码。 2. 定义一个TLE5012数据缓冲区。 3. 初始化TLE5012,包括配置GPIO和SPI1。 4. 读取TLE5012数据,包括发送读取角度和速度的命令,等待SPI传输完成并接收数据,然后将数据存储到TLE5012数据缓冲区中。 5. 提取速度值,根据数据格式进行解码。 6. 对速度值进行处理,例如打印到串行端口或控制另一个设备。 7. 等待一段时间,然后重复步骤4到6。 这只是一个示例代码,具体实现可能因特定硬件和应用程序而有所不同。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值