SimpleFOC移植STM32(三)—— 角度读取 (AS5600、AS5047P、TLE5012B、MA730、MT6701、ABZ)


SimpleFOC的教程比较多,做了一个总链接,欢迎点击阅读:SimpleFOC教程链接汇总

说明

本节比较简单,主要是演示I2C接口和SPI接口读取编码器角度。
为增加大家对编码器的理解,后面介绍常用编码器并提供原理图和源代码。

一、硬件介绍

  本节实验适合运行在SimpleMotor和STM32最小系统板上(Bluepill)。
在这里插入图片描述
20230323更新,增加了MT6701编码器说明

1.1、硬件准备

1.1.1、SimpleMotor方案

序号名称数量
1SimpleMotor1
2带编码器云台电机2
3USB转串口1
412V电源1

两个编码器可以是两个AS5600,也可以是两个TLE5012B,或者一个是AS5600,一个是TLE5012B。

在这里插入图片描述

驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

1.1.2、STM32方案

序号名称数量
1STM32核心板1
2带编码器云台电机2
3USB转串口1
45V电源1
5杜邦线若干

两个编码器可以是两个AS5600,也可以是两个TLE5012B,或者一个是AS5600,一个是TLE5012B。

在这里插入图片描述

驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

1.2、硬件连接

1.2.1、原理图

在这里插入图片描述
在这里插入图片描述

1.2.2、接线

在这里插入图片描述
或者
在这里插入图片描述

二、代码编译下载

  本节代码只演示AS5600和TLE5012B两种编码器,其它编码器请自行移植代码。

2.1、代码解析

  1、主循环读角度值,每隔1秒打印一次。可以同时读两个编码器,只需读一个的屏蔽另一个。
  如果需要打印速度,可以把屏蔽打开。在这里插入图片描述
  2、“MyProject.h”文件中选择编码器型号,1表示使用,0表示不用。只用一个编码器的,可以把不用的都设置为0。
在这里插入图片描述
  3、上电初始化,根据“MyProject.h”中的宏定义编译。
在这里插入图片描述
  4、需要说明的是I2C读编码器的代码,本节代码采用硬件I2C,支持I2C1和I2C2。STM32的硬件I2C代码网上有很多参考,但是写的比较乱,移植了几个都不能用,在ST官网上找了一个例程,因年代久远,与现在常用的库函数风格不同,都是直接操作寄存器,不过做为底层代码,不会影响大家的体验。

在这里插入图片描述
  5、ST官网I2C例程,我放在网盘了,有需要的可以下载看看。
在这里插入图片描述
  6、I2C的波特率是400KHz,SPI波特率是9MHz。
在这里插入图片描述
在这里插入图片描述

2.2、下载验证

  1、根据实际连接的编码器类型,设置“MyProject.h”中的参数,
  2、编译下载。串口或者SWD,
  3、转动电机,观察角度变化。(角度的单位是rad,速度单位是rad/s)
在这里插入图片描述

2.3、其它说明

  1、I2C和SPI速度对比:

- 两个编码器都使用AS5600,主循环3420Hz,
- 两个编码器都使用TLE5012B,主程序15200Hz,
- M1是AS5600,M2是TLE5012B,主程序5530Hz,
- M1是TLE5012B,M2是AS5600,同上

  以上数据来自实际测试,会有误差。

  2、不同编码器工作电压电流对比:

- AS5600:3.3-5V,6.5mA @max
- TLE5012B:3-5.5V,14mA @Type,
- AS5047/AS5048:3.3-5V,15mA @max
- MA730:3.3V,11.7mA @Type,

  以上数据来自各芯片的数据手册。


三、百度网盘代码说明

3.1、AS5600

在这里插入图片描述
①、原理图
在这里插入图片描述
②、SimpleMotor的I2C2连接
在这里插入图片描述

③、也可以用STM32最小系统板连接
在这里插入图片描述
④、串口打印角度0—360°
在这里插入图片描述

3.2、AS5047P

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

3.3、TLE5012B

3.3.1、STM32ReadTLE5012B_spi2_m2
①、原理图
在这里插入图片描述
②、SimpleMotor的M2接口连接

在这里插入图片描述

③、也可以用STM32最小系统板连接

在这里插入图片描述
④、串口打印角度0—360°

在这里插入图片描述

3.3.2、STM32ReadTLE5012B_spi2_m1
①、原理图在这里插入图片描述

②、SimpleMotor的M1接口连接
在这里插入图片描述

③、也可以用STM32最小系统板连接

3.3.3、STM32ReadTLE5012B_spi1
①、原理图
在这里插入图片描述


②、不支持SimpleMotor,用STM32最小系统板连接
在这里插入图片描述

3.4、MA730

在这里插入图片描述

3.5、MT6701

在这里插入图片描述

驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

每个代码的压缩包解压后有接线图片,可以参考,
每个main.c文件,最上面有单片机的引脚使用说明。
在这里插入图片描述

3.6、ABZ

main.c文件,最上面有单片机的引脚使用说明。
在这里插入图片描述



(完)


本节源码下载:
链接:https://pan.baidu.com/s/1ueR9a9_uL-Zce_CKTwhawQ
提取码:9qls

欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)


请继续阅读相关文章:
SimpleFOC移植STM32(一)—— 简介
SimpleFOC移植STM32(二)—— 开环控制
SimpleFOC移植STM32(三)—— 角度读取
SimpleFOC移植STM32(四)—— 闭环控制
SimpleFOC移植STM32(五)—— 电流采样及其变换

  • 32
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
vue 仿抖音视频列表(兼容微信内置X5浏览器) 新增留言功能,优化安卓微信环境境下播放不流畅问题,添加请求下一页数据效果 制作 仿抖音视频列表遇到很多坑,特别是安卓微信内置浏览器,让人脑壳疼,核心代码不多 便于理解 图标css使用的事iconfot字体库,优化页面加载速度 http://at.alicdn.com/t/font_1048614_mi5i5ba1uag.css 组件用到了vant 中的swiper滑动组件 ———————————————— 版权声明:本文为CSDN博主「superKM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/superKM/article/details/87603255 h5 原生 video 属性 webkit-playsinline ios 小窗播放,使视频不脱离文本流,安卓则无效 微信内置x5内核, x5-video-player-type="h5-page" 启用H5播放器,是wechat安卓版特性,添加此属性,微信浏览器会自动将视频置为全屏 x5-video-player-fullscreen="true" 全屏设置,设置为 true 是防止横屏 x5-video-orientation 控制横竖屏 landscape 横屏,portrain竖屏; 默认portrain poster:封面 src:播放地址 loop防止播放视频结束后,显示腾讯的广告 ———————————————— 版权声明:本文为CSDN博主「superKM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/superKM/article/details/87603255
以下是一个可能的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。 这只是一个示例代码,具体实现可能因特定硬件和应用程序而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值