当前位置: 首页 > news >正文

广告公司 网站制作百度扫一扫识别图片

广告公司 网站制作,百度扫一扫识别图片,网站怎么做英文版的,上海网站制作网站制作公司MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32 1. 获取代码:2. 加入你的项目2.1 以 STM32 为例:2.2 以 ESP-IDF 为例: 3. 对接 API3.1 以 STM32 为例: 4. 更多函数说明5. 写入 EEPROM 示例 MT6835 Framework 纯C语言实现,跨平台&…

MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32

      • 1. 获取代码:
      • 2. 加入你的项目
        • 2.1 以 STM32 为例:
        • 2.2 以 ESP-IDF 为例:
      • 3. 对接 API
        • 3.1 以 STM32 为例:
      • 4. 更多函数说明
      • 5. 写入 EEPROM 示例

MT6835 Framework

纯C语言实现,跨平台(stm32、ESP32),移植灵活,低耦合高内聚的
MT6835(21位磁编) 驱动框架

1. 获取代码:

请为你的Git账户配置好SSH,然后在你喜欢的项目目录下使用以下命令
或去 项目地址页面 下载

git clone git@github.com:Hotakus/mt6835.git

2. 加入你的项目

2.1 以 STM32 为例:

该项目为标准 CMake 项目,可以很方便的加入你的项目中。
例如,STM32CubeMX 可以自动生成 STM32 的 CMake 工程文件,请在你的根目录的CMakeLists.txt中(不是该项目)加入以下内容:

add_subdirectory(mt6835) # 添加子目录,在 add_executable() 之前# 找到这句话,在上下加入代码
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})# 假设你的项目名为 “your_project”,则添加依赖⬇
# target_link_libraries 一般放在 add_executable() 之后
target_link_libraries(your_project mt6835) 
2.2 以 ESP-IDF 为例:

若你使用其他平台,请跳过该小节
若你使用 ESP-IDF 框架进行 ESP32 开发,首先,你的ESP-IDF项目根目录应该会有一个components文件夹,
若没有,请自己创建一个,这个目录用于添加额外组件(拉取的本项目同样要放在这个目录下)。
接下来,进入mt6835项目根目录,注意到CMakeLists_esp_idf.txt文件,
然后将CMakeLists.txt与该文件名进行交换即可。ESP-IDF 会自动检测


3. 对接 API

程序预留硬件抽象层 API 给用户对接,对于 MT6835,采用 SPI 全双工通信,可以读出21位的角度原始数据,请确保以下:

  • 提前配置好 SPI 全双工通信(例如 STM32 可以使用 STM32CubeMX 配置 SPI1 )
  • SPI 时钟理论不超过 16MHz,
  • CPOL(1), CPHA(1),8bit 数据模式,
  • 软 CS,提前配置好一根 CS 引脚,默认拉高

在该项目的 example 目录,你可以看到预先实现的对应平台的移植文件,可以直接放到你的项目中使用。若你想要自己实现,可以参考下面的示例:

3.1 以 STM32 为例:
#include <math.h>
#include "mt6835.h" // MT6835 驱动头文件
#include "spi.h"    // STM32CubeMX 生成的 SPI 头文件#define SPI_INSTANCE hspi1             // STM32CubeMX 生成的 SPI 句柄
#define SPI_CS       SPI1_CS_Pin       // STM32CubeMX 生成的 CS 引脚
#define SPI_CS_PORT  SPI1_CS_GPIO_Port // STM32CubeMX 生成的 CS 端口// 示例 CS 操作函数,可以根据需要进行修改
static void mt6835_cs_control(mt6835_cs_state_enum_t state) {if (state == MT6835_CS_HIGH) {  // 高电平HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, GPIO_PIN_SET);} else {// 低电平HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS, GPIO_PIN_RESET);}
}// 示例收发函数,可以根据需要进行修改
static void mt6835_spi_send_recv(uint8_t *tx_buf, uint8_t *rx_buf, uint8_t len) {HAL_StatusTypeDef status = HAL_OK;status = HAL_SPI_TransmitReceive_IT(&SPI_INSTANCE, tx_buf, rx_buf, len);if (status != HAL_OK) {printf("spi send_recv failed %d\n\r", status);return;}// wait ITuint32_t tickstart = HAL_GetTick();while (HAL_SPI_GetState(&SPI_INSTANCE) != HAL_SPI_STATE_READY) {if (HAL_GetTick() - tickstart > 1) {printf("spi send_recv timeout\n\r");return;}}
}int main(void) { /* STM32CubeMX 生成的初始化 */HAL_Init();......MX_SPI1_Init();/* 创建 MT6835 对象 */mt6835_t *mt6835 = mt6835_create();/* 链接 SPI 的 CS 操作函数 */mt6835_link_spi_cs_control(mt6835, mt6835_cs_control);/* 链接 SPI 收发函数 */mt6835_link_spi_send_recv(mt6835, mt6835_spi_send_recv);/* 可选 */// mt6835_link_spi_send(mt6835, mt6835_spi_send);// mt6835_link_spi_recv(mt6835, mt6835_spi_recv);/* 是否开启 CRC 校验,使用查表法,通常不会有性能影响* 若开启,则会使用 mt6835_t 结构体中的 crc_res 位存储该次角度读取正确性,* 用户可以根据 crc_res 的值进行判断,*/mt6835_enable_crc_check(mt6835);// mt6835_disable_crc_check(mt6835);    // 禁用 CRC 校验/* 开始读取角度 */uint32_t raw_angle = 0;float radian_angle = 0.0f;while(1) {/* * 读取原始角度数据* 第二个参数为读取方式, MT6835_READ_ANGLE_METHOD_NORMAL 或 MT6835_READ_ANGLE_METHOD_BURST * MT6835_READ_ANGLE_METHOD_BURST 会更快*/raw_angle = mt6835_get_raw_angle(mt6835, MT6835_READ_ANGLE_METHOD_BURST);radian_angle = raw_angle * (M_PI * 2.0f) / MT6835_ANGLE_RESOLUTION;// radian_angle = mt6835_get_angle(motor1_mt6835, MT6835_READ_ANGLE_METHOD_BURST);if (!mt6835->crc_res) {printf("crc error\n\r");}printf("raw_angle: %d, radian_angle: %f\n\r", raw_angle, radian_angle);HAL_Delay(500);}
}

若不想自己实现,则直接将example/stm32/mt6835_stm32_spi_port.h文件中宏定义MT6835_STM32_SPI_PORT_ENABLE改为1即可:
然后按照如下调用:

int main() {uint32_t raw_angle = 0;float radian_angle = 0.0f;mt6835_t * mt6835 = mt6835_stm32_spi_port_init();while(1) {raw_angle = mt6835_get_raw_angle(mt6835, MT6835_READ_ANGLE_METHOD_BURST);radian_angle = raw_angle * (M_PI * 2.0f) / MT6835_ANGLE_RESOLUTION;// radian_angle = mt6835_get_angle(motor1_mt6835, MT6835_READ_ANGLE_METHOD_BURST);printf("raw_angle: %d, radian_angle: %f\n\r", raw_angle, radian_angle);HAL_Delay(500);}
}

4. 更多函数说明

  • 创建销毁函数:

    • mt6835_create() 创建一个 mt6835 对象
    • mt6835_destroy() 销毁一个 mt6835 对象
  • 链接函数:

    • mt6835_link_spi_send() 链接 SPI 发送函数
    • mt6835_link_spi_recv() 链接 SPI 接收函数
    • mt6835_link_spi_send_recv() 链接 SPI 收发函数
    • mt6835_link_spi_cs_control() 链接 CS 引脚操作函数
  • CRC:

    • mt6835_enable_crc_check() 使能 CRC 校验(查表法)
    • mt6835_disable_crc_check() 失能 CRC 校验
  • GET 和 SET 函数

    • mt6835_get_id() 读取 MT6835 ID 寄存器
    • mt6835_set_id() 暂时写入 MT6835 ID 寄存器(配合 mt6835_write_eeprom() 函数)
    • mt6835_get_raw_angle() 读取原始角度数据(21位)
    • mt6835_get_angle() 读取原始角度数据并换算为弧度值(0 ~ 2*PI)
    • mt6835_get_raw_zero_angle() 读取原始零位值(12位)(零位值在 FOC 中很重要,最好是将正确零位固化在EEPROM中)
    • mt6835_get_zero_angle() 读取零位值,并换算成弧度值
    • mt6835_set_zero_angle() 暂时写入零位值(以弧度)到寄存器,(配合 mt6835_write_eeprom() 函数)
  • 底层函数:

    • mt6835_read_reg() 单字节读取寄存器
    • mt6835_write_reg() 单字节暂时写入寄存器(配合 mt6835_write_eeprom() 函数)
    • mt6835_write_eeprom() 将当前所有的可固化寄存器值写入(固化)到 EEPROM,所有写入操作最后都要额外调用这个函数

5. 写入 EEPROM 示例

存在寄存器的值断电消失,所以只是写入寄存器并不等于固化到 EEPROM

int main() {/* 写入 ID */mt6835_set_id(mt6835, 0xDA); // 写入 ID 0xDA 到寄存器,只在寄存器,断电消失HAL_Delay(1);uint8_t id = mt6835_get_id(mt6835); // 读取 IDprintf("id: 0x%x\r\n", id);/* 写入特定零位值,零位值需要你自己校准并读取角度 */// 2.0943951024f 是 120 度,假设 120 度是零位mt6835_set_zero_angle(mt6835, 2.0943951024f); //写入到零位寄存器,断电消失HAL_Delay(1);float zero_angle = mt6835_get_zero_angle(mt6835); // 读取零位值printf("zero_angle: %f rad\r\n", zero_angle);/*下面进行统一固化,为保证断电后 MT6835 数据不丢失,需要固化到 EEPROM *//** 直接调用 mt6835_write_eeprom 发送固化命令,* 命令成功发送则返回 0x55, 若正确收到 0x55,* 则程序 respond 为 true,错误则 false*/bool respond = mt6835_write_eeprom(mt6835);if (!respond) {printf("write eeprom failed\r\n");} else {printf("write eeprom success\r\n");}HAL_Delay(6000);    // 写入后至少 6 秒钟不能断电/* * 将上面的所有写入和固化操作注释掉,重新烧录程序,* 并重新给编码器上电,进行读取验证 */ id = mt6835_get_id(mt6835); // 读取 IDprintf("id: 0x%x\r\n", id);zero_angle = mt6835_get_zero_angle(mt6835); // 读取零位值printf("zero_angle: %f rad\r\n", zero_angle);// 若任何环节失败,请优先检测你的 SPI 初始化代码是否有问题,// 因为所有代码均经过正确验证
}

最后附上简单的 STM32CubeMX配置图片:
注意另配 CS 引脚,任意引脚设置为 OUTPUT 即可
在这里插入图片描述


文章转载自:
http://supraoptic.c7496.cn
http://gosport.c7496.cn
http://dilutor.c7496.cn
http://gymp.c7496.cn
http://woodcock.c7496.cn
http://hotdog.c7496.cn
http://derby.c7496.cn
http://operatic.c7496.cn
http://tig.c7496.cn
http://sinfully.c7496.cn
http://almacantar.c7496.cn
http://bollworm.c7496.cn
http://dipsophobiac.c7496.cn
http://voces.c7496.cn
http://carnally.c7496.cn
http://parricide.c7496.cn
http://hein.c7496.cn
http://constancy.c7496.cn
http://triptyque.c7496.cn
http://disinter.c7496.cn
http://hypersuspicious.c7496.cn
http://franchisee.c7496.cn
http://inflict.c7496.cn
http://inspiration.c7496.cn
http://obliquity.c7496.cn
http://buildable.c7496.cn
http://ice.c7496.cn
http://intrauterine.c7496.cn
http://microevolution.c7496.cn
http://tyrannically.c7496.cn
http://crater.c7496.cn
http://spousal.c7496.cn
http://copperknob.c7496.cn
http://uniteable.c7496.cn
http://indigestive.c7496.cn
http://jillion.c7496.cn
http://asahigawa.c7496.cn
http://notoungulate.c7496.cn
http://crabber.c7496.cn
http://giddiness.c7496.cn
http://scandic.c7496.cn
http://pforzheim.c7496.cn
http://shirtband.c7496.cn
http://hydrotaxis.c7496.cn
http://upholster.c7496.cn
http://isopathy.c7496.cn
http://meiosis.c7496.cn
http://ecla.c7496.cn
http://anteporch.c7496.cn
http://pornie.c7496.cn
http://gentile.c7496.cn
http://obliterate.c7496.cn
http://phs.c7496.cn
http://leapingly.c7496.cn
http://supplementation.c7496.cn
http://brynhild.c7496.cn
http://corporator.c7496.cn
http://deportable.c7496.cn
http://intercolumniation.c7496.cn
http://downflow.c7496.cn
http://caviar.c7496.cn
http://tashkend.c7496.cn
http://candent.c7496.cn
http://teleconverter.c7496.cn
http://atacamite.c7496.cn
http://bowel.c7496.cn
http://matsudo.c7496.cn
http://nabber.c7496.cn
http://ethnobotanist.c7496.cn
http://five.c7496.cn
http://multifamily.c7496.cn
http://avaluative.c7496.cn
http://ri.c7496.cn
http://churrigueresque.c7496.cn
http://achlorhydria.c7496.cn
http://subtracter.c7496.cn
http://afternoon.c7496.cn
http://repoint.c7496.cn
http://rhodophyte.c7496.cn
http://tetraparental.c7496.cn
http://six.c7496.cn
http://amole.c7496.cn
http://creamy.c7496.cn
http://scutellate.c7496.cn
http://harshness.c7496.cn
http://xi.c7496.cn
http://liberia.c7496.cn
http://mahratti.c7496.cn
http://units.c7496.cn
http://snowpack.c7496.cn
http://vibrissa.c7496.cn
http://singly.c7496.cn
http://incb.c7496.cn
http://towaway.c7496.cn
http://rehearse.c7496.cn
http://headteacher.c7496.cn
http://robotics.c7496.cn
http://etaerio.c7496.cn
http://erodent.c7496.cn
http://immixture.c7496.cn
http://www.zhongyajixie.com/news/96398.html

相关文章:

  • 谁帮助汉字叔叔做网站唐老鸭微信营销软件
  • 营销型网站与普通网站的比较站长之家seo信息
  • 学家装设计师要多少钱哈尔滨seo关键字优化
  • 网站建设公司网站定制开发如何创建网站站点
  • 哪些网站做英语比较好建设网站制作
  • 网站建设 环保 图片智能建站系统
  • 深圳专业做网站哪家专业一键免费建站
  • 绵阳个人网站建设百度手机助手下载安装最新版
  • 威海做网站多少钱seo建站营销
  • 做平面设计应该在哪个网站求职长春做网站推广的公司
  • 境外建网站2024会爆发什么病毒
  • 淮北做网站公司百度seo一本通
  • html5响应式网站建设平台seo快排软件
  • 深圳网站建设.-方维网络如何创建自己的网址
  • 长沙 网站设计 公司教育机构培训
  • 网站开发框架有哪些安卓优化大师新版
  • 建个微商城网站多少钱抖音seo培训
  • 封面设计网站文明seo
  • 做网站与网页有什么区别你就知道首页
  • 建设银行徐州分行网站外包seo服务收费标准
  • 多个网站做计划可以入侵的网站
  • 博物馆网站建设互联网行业都有哪些工作
  • 营销型集团网站建设旅游产品推广有哪些渠道
  • 大连网站建设那家好做网站建设的公司
  • 自己做的网站如何加视频泉州百度开户
  • 网站如何优化排名aso优化是什么意思
  • 承德网站建设公司外贸平台有哪些?
  • cent os安装wordpressseo优化网
  • java开发的手机网站建设网络优化报告
  • 阜新网站设计百度一下首页