MT6825编码器在STM32中的使用

文章目录

  • 1、PWM 绝对值位置读取功能
    • 1.1 DataSheet说明
    • 1.2 硬件支持
    • 1.3 Cubemax配置及使用
    • 1.4 项目代码实现
    • 1.5 效果验证
    • 1.6 注意事项
  • 2、SPI 绝对值位置读取功能
    • 2.2 硬件支持
    • 2.3 Cubemax配置及使用
    • 2.4 项目代码实现

1、PWM 绝对值位置读取功能

1.1 DataSheet说明

在这里插入图片描述

1.2 硬件支持

在这里插入图片描述

1.3 Cubemax配置及使用

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

1.4 项目代码实现

PWM输入捕获定时器初始化:

void MX_TIM4_Init(void)
{/* USER CODE BEGIN TIM4_Init 0 *//* USER CODE END TIM4_Init 0 */TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_SlaveConfigTypeDef sSlaveConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM4_Init 1 *//* USER CODE END TIM4_Init 1 */htim4.Instance = TIM4;htim4.Init.Prescaler = 83;htim4.Init.CounterMode = TIM_COUNTERMODE_UP;htim4.Init.Period = 0xFFFF;htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim4) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_Init(&htim4) != HAL_OK){Error_Handler();}sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;sSlaveConfig.InputTrigger = TIM_TS_TI2FP2;sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sSlaveConfig.TriggerPrescaler = TIM_ICPSC_DIV1;sSlaveConfig.TriggerFilter = 0xA;if (HAL_TIM_SlaveConfigSynchro(&htim4, &sSlaveConfig) != HAL_OK){Error_Handler();}sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0xA;if (HAL_TIM_IC_ConfigChannel(&htim4, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;if (HAL_TIM_IC_ConfigChannel(&htim4, &sConfigIC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM4_Init 2 *//* USER CODE END TIM4_Init 2 */}

编码器初始化函数:

/*** @brief  * @param  void* @retval void*/
void Bsp_Encoder_Init(void)
{if(sensor_peripheral.AuxEncoder_Sensor.encType==ENCODER_TYPE_MT_PWM_Abs){MX_TIM4_Init();HAL_TIM_IC_Start_IT (&htim4, TIM_CHANNEL_1);HAL_TIM_IC_Start_IT (&htim4, TIM_CHANNEL_2);	ENC_485_RX_EN;		}MX_TIM3_Init();		//ENCHAL_TIM_Encoder_Start_IT(&htim3, TIM_CHANNEL_ALL);
}

输入捕获中断回调:

/*** @brief  Input Capture callback in non-blocking mode* @param  htim TIM IC handle* @retval None*/
#define TIM_ENCODER_PWM TIM4
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM_ENCODER_PWM)  //{Encoder_MT_PWM_Readout();} 
}

输入捕获中断处理函数:

void Encoder_MT_PWM_Readout(void)
{if (htim4.Channel == HAL_TIM_ACTIVE_CHANNEL_2){enc_mt_pwm_input.freqTemp[0]=HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_2)+1;                                                // 1.读取整周期时间enc_mt_pwm_input.dutyTemp[0]=HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_1)+1;                                                // 2.读取高电平时间__HAL_TIM_SetCounter(&htim4, 0);   }
}

角度读取函数(包含数据处理):

uint16_t Bsp_get_PWM_angle(void)
{enc_mt_pwm_input.usPwmAngReadFlag = 1;enc_mt_pwm_input.freq=enc_mt_pwm_input.freqTemp[0];enc_mt_pwm_input.duty=enc_mt_pwm_input.dutyTemp[0];if(enc_mt_pwm_input.dir){if(enc_mt_pwm_input.duty>=enc_mt_pwm_input.freq)enc_mt_pwm_input.duty=enc_mt_pwm_input.freq;elseenc_mt_pwm_input.duty=enc_mt_pwm_input.freq-enc_mt_pwm_input.duty;            //get negation}enc_mt_pwm_input.factor=enc_mt_pwm_input.freq/enc_mt_pwm_input.div;               //Acquire resolutionenc_mt_pwm_input.res=enc_mt_pwm_input.freq-(enc_mt_pwm_input.offset_h+enc_mt_pwm_input.offset_l)*enc_mt_pwm_input.factor;if(enc_mt_pwm_input.duty>=enc_mt_pwm_input.factor * enc_mt_pwm_input.offset_h)enc_mt_pwm_input.angle_temp=enc_mt_pwm_input.duty - enc_mt_pwm_input.factor * enc_mt_pwm_input.offset_h;    //get angleelseenc_mt_pwm_input.angle_temp=0;enc_mt_pwm_input.angle=enc_mt_pwm_input.angle_temp*(4095/(enc_mt_pwm_input.res*(84/(ENC_PWM_INPUT_PRE+1))));     /* get value from 0 to 4095 */return enc_mt_pwm_input.angle;
}

结构体定义及初始化:

#define SAMPLE_NUM               1                                              /* Number of samples */
typedef struct
{uint8_t  sample_count;                /* counts of samples */uint16_t freqTemp[SAMPLE_NUM];        /* Acquisition frequency */float freq;                           /* frequency */uint16_t dutyTemp[SAMPLE_NUM];        /* Capture high level */float duty;                           /* duty */uint8_t dir;uint8_t offset_h;                     //16 high uint8_t offset_l;                     //8 low uint16_t div;                         //4095+16+8=4119float factor; float res;                            /* Resolution */float angle_temp;	uint16_t angle;	uint8_t  usPwmAngReadFlag;
}enc_mt_pwm_input_t;extern enc_mt_pwm_input_t enc_mt_pwm_input;/************************************************************************************/
enc_mt_pwm_input_t enc_mt_pwm_input={.sample_count=0,.freqTemp={0},.freq=0,.dutyTemp={0},.duty=0,.dir=1,.offset_h=16,.offset_l=8,.div=4119,.factor=0,.res=0,.angle=0,.usPwmAngReadFlag = 0
};

1.5 效果验证

在这里插入图片描述角度(占空比)周期化变化,满足预期。

1.6 注意事项

在这里插入图片描述

2、SPI 绝对值位置读取功能

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

2.2 硬件支持

MT6825编码器电路
MT6825编码器电路
驱动板电路在这里插入图片描述

2.3 Cubemax配置及使用

在这里插入图片描述

2.4 项目代码实现

SPI外设初始化:

/* SPI1 init function */
void MX_SPI1_Init(void)
{/* USER CODE BEGIN SPI1_Init 0 *//* USER CODE END SPI1_Init 0 *//* USER CODE BEGIN SPI1_Init 1 *//* USER CODE END SPI1_Init 1 */hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_16BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;  //8 10.5Mbit/s 64 1.3125Mbits 16 5.25Mbit/shspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN SPI1_Init 2 *//* USER CODE END SPI1_Init 2 */}

结构体及初始化:

typedef struct{uint16_t  cmd[3];uint16_t  rec_data[3];uint8_t  no_mag_warning_flag;uint8_t  over_speed_flag;uint8_t  pc1_flag;uint8_t  pc2_flag;uint8_t  pc1_count;uint8_t  pc2_count;uint8_t  err;uint32_t sample_data;uint32_t angle_data;uint32_t pre_angle_data;
}mag_enc_t;extern mag_enc_t mag_enc;/**********************************************************/
mag_enc_t mag_enc = {.cmd = {0x8300, 0x8400, 0x8500},.rec_data = {0, 0, 0},.no_mag_warning_flag = 0,.over_speed_flag = 0,.pc1_flag = 0,.pc2_flag = 0,.pc1_count = 0,.pc2_count = 0,.err = 0,.sample_data = 0,.angle_data =0,.pre_angle_data =0
};

SPI读取绝对值位置:

uint32_t SPI1_MT6825_fast_ReadData(void)
{short timeOut=1000;SPI1_CS_LOW;
//	HAL_SPI_Transmit(&hspi1 ,(unsigned char *)&mag_enc.cmd[0] ,1,200);
//	HAL_SPI_Receive(&hspi1 ,(unsigned char *)&mag_enc.rec_data[0] ,3,200);HAL_SPI_TransmitReceive(&hspi1 ,(unsigned char *)&mag_enc.cmd[0] ,(unsigned char *)&mag_enc.rec_data[0] ,3,200 );while( hspi1.State == HAL_SPI_STATE_BUSY ){if (timeOut-- ==0) return 0;}   // wait for transmission completeSPI1_CS_HIGH;mag_enc.angle_data=((mag_enc.rec_data[0]&0x00FF)<<10)+((mag_enc.rec_data[1]&0xFC00)>>6)+((mag_enc.rec_data[1]&0x00F0)>>4);return mag_enc.angle_data;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279374.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机二级(Python)真题讲解每日一题:《方菱形》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 请写代码替换横线&#xff0…

uniapp 云开发省钱之调整函数执行内存大小

我这个5块钱一个月的服务空间配置&#xff1a; 现在还只有少量的用户和自己测试之用&#xff0c;目前消耗的情况&#xff1a; 云函数的使用量还是挺高的&#xff0c;目前还是正好能覆盖一个月的使用量&#xff0c;等用户量上来肯定是不行的&#xff0c;所以得想想办法压榨一下云…

2024年度最佳大型语言模型(LLMs)汇总

大型语言模型(LLMs)是人工智能文本处理的主要类型&#xff0c;也现在最流行的人工智能应用形态。ChatGPT是迄今为止最著名的使用LLM的工具&#xff0c;它由OpenAI的GPT模型的特别调整版本提供动力。但还有许多其他聊天机器人和文本生成器&#xff0c;包括从Google Bard和Anthro…

Basic RNN

文章目录 回顾RNNRNN CellRNNCell的使用RNN的使用 RNN例子使用RNN Cell实现使用RNN实现 嵌入层 Embedding独热向量的缺点Embedding LSTMGRU(门控循环单元)练习 回顾 DNN&#xff08;全连接&#xff09;&#xff1a;和CNN相比&#xff0c;拥有巨大的参数量&#xff0c;CNN权重共…

MySQL与金蝶云星空对接集成SELECT语句连通销售订单新增(销售订单集成测试)

MySQL与金蝶云星空对接集成SELECT语句连通销售订单新增(销售订单集成测试) ​​ ​​ 数据源系统:MySQL MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQLAB公司开发&#xff0c;属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方…

【mybatis】objectwrapper解读

简介 在 MyBatis 中&#xff0c;ObjectWrapper 是一个关键的接口&#xff0c;用于详细封装了对象的属性信息。ObjectWrapper 主要用于内部操作&#xff0c;它抽象了对象的属性操作&#xff0c;使得 MyBatis 能够统一处理原生类型、Bean 对象以及 Map 集合等。 类图展示 主要功…

架构扩展性

架构扩展性&#xff1a;应用扩展 数据扩展 组织扩展 流程扩展 核心方法论–扩展立方体&#xff1a; x轴&#xff1a;无脑克隆 y轴&#xff1a;功能分割z轴&#xff1a;客户分割扩展立方体在应用扩展的应用&#xff1a; x轴&#xff1a;横向克隆 对于无状态的应用&#xff0c;多…

苹果意将Gemini引入iPhone;英伟达发布新AI GPU;Grok正式开源

苹果正在谈判将 Gemini 引入 iPhone Mark Gurman 报道&#xff0c;苹果正在谈判将 Google 的生成式 AI 大模型 Gemini 引入 iPhone。 知情人士透露&#xff0c;两家公司正在积极谈判&#xff0c;让苹果获得 Gemini 授权&#xff0c;为今年 iPhone 软件的一些新功能提供动力。苹…

2024年Jira全面解析:从 Jira 的概念到优缺点、最新政策

Jira是澳大利亚的Atlassian公司开发的一款项目管理软件&#xff0c;名字来源于日文中“哥斯拉”的称呼“Gojira”。Jira不仅可以追踪缺陷和问题&#xff0c;还能管理项目。很多企业还将JIRA用于一些特殊的场景&#xff0c;比如作为仓库自动化工具、管理文档流程、优化费用等等。…

Python之Web开发中级教程----ubuntu安装MySQL

Python之Web开发中级教程----ubuntu安装MySQL 进入/opt目录 cd /opt 更新软件源 sudo apt-get upgrade sudo apt-get update 3、安装Mysql server sudo apt-get install mysql-server 4、启动Mysql service mysql start 5、确认Mysql的状态 service mysql status 6、安全设…

了解和编译安装mysql数据库

一. 数据库的基本概念 1.1 数据 ① 描述事物的符号记录 称为数据&#xff08;Data&#xff09;。包括数字、文字、图形、图像、声音、档案记录等 ② 数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。 相同格式和类型的数据统一存放在一起&…

Nginx发布之后可以使用IP访问,不能使用localhost访问, Nginx发布之后可以使用localhost访问,不能使用IP访问,

如标题所说 Nginx发布之后可以使用IP访问&#xff0c;不能使用localhost访问&#xff0c; Nginx发布之后可以使用localhost访问&#xff0c;不能使用IP访问&#xff0c; 修改配置文件也没有用 清除浏览器缓存数据

轻松解锁微博视频:基于Perl的下载解决方案

引言 随着微博成为中国最受欢迎的社交平台之一&#xff0c;其内容已经变得丰富多彩&#xff0c;特别是视频内容吸引了大量用户的关注。然而&#xff0c;尽管用户对微博上的视频内容感兴趣&#xff0c;但却面临着无法直接下载这些视频的难题。本文旨在介绍一个基于Perl的解决方…

【Linux(1)】Linux的一些基本指令(补充上一篇)

思维导图 学习内容 通过上面的学习目标&#xff0c;我们可以列出要学习的内容&#xff1a; linux的一些指令&#xff1a;cd mkdir cp touch which rm cat alias 一些基本的概念&#xff1a;指令的概念&#xff0c;用户家目录是什么...... 一、Linux的一些指令 1.1 重新认识…

vue3封装对话框el-dialog组件

实现逻辑&#xff1a; 1、引入对话框组件&#xff1b; 2、组件使用&#xff1b; 3、点新增和编辑的时候&#xff0c;通过ref调用对话框暴漏出来的方法&#xff0c;并传值&#xff1b; 4、关闭对话框时&#xff0c;封装方法&#xff0c;重置对话框的表单和重置校验&#xff1b; …

.htaccess全站设置SSL,wordpress全站设置SSL,网站重定向的次数过多”错误最佳解决方法教程

.htaccess全站设置SSL,wordpress全站设置SSL&#xff0c;网站重定向的次数过多”错误最佳解决方法教程 网上找了很多教程网无效**.htacces**设置&#xff0c;访问后台出现重定向次数过多&#xff0c;导致无法访问 找了好久&#xff0c;测试用AI机器人无法解决&#xff0c;参考…

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

【RabbitMQ | 第七篇】RabbitMQ实现JSON、Map格式数据的发送与接收

文章目录 7.RabbitMQ实现JSON、Map格式数据的发送与接收7.1消息发送端7.1.1引入依赖7.1.2yml配置7.1.3RabbitMQConfig配置类——&#xff08;非常重要&#xff09;&#xff08;1&#xff09;创建交换器方法&#xff08;2&#xff09;创建队列方法&#xff08;3&#xff09;绑定…

自动化部署利器:Jenkins+Gitlab助力Springboot项目快速上线,实现持续集成与持续交付!

Jenkins 能干什么 来自官网 官网 Jenkins怎么用【Linux版】 下载 war包 本机为Java8 选择Jenkins版本为2.289.1 注意&#xff1a; 如果是Java8 尽量和我的Jenkins版本保持一致哈&#xff01;后面可能会遇到各种坑。 把下载好的war放到Linux服务器的某一个目录下 启动war …

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式)

实现&#xff1a;mysql-5.7.42 到 mysql-8.2.0 的升级&#xff08;二进制方式&#xff09; 1、操作环境1、查看当前数据库版本2、操作系统版本3、查看 Linux 系统上的 glibc&#xff08;GNU C 库&#xff09;版本&#xff08;**这里很重要&#xff0c;要下载对应的内核mysql版本…