HAL库的使用之Cube配置编码器输入捕获模式

2023-11-09

   做平衡小车目前有两种思路,第一种是使用编码器电机,这样一般是两个闭环控制,直立闭环和速度闭环,另一种是使用步进电机,一般使用步进电机很少进行闭环控制。使用Cube进行配置时,发现几点注意事项,STM32单片机自带编码器接口,可以直接进行使用,十分方便,所以根据硬石科技的资料,编码器模式在STM32HAL库中叫做Encoder 。
   首先有一点注意事项,在配置编码器模式的时候一定要对所使用定时器的初始化进行修改:
   /* TIM2 init function */

void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_IC_InitTypeDef sConfigIC;

htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}
//以下是个人修改代码 ,经过试验,没有以下代码的修改,定时器初始化后不能进入编码器模式。
sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI2;

sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sEncoderConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sEncoderConfig.IC1Filter = 0;

sEncoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sEncoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sEncoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sEncoderConfig.IC2Filter = 0;
HAL_TIM_Encoder_Init(&htim2, &sEncoderConfig);
// if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
// {
// _Error_Handler(FILE, LINE);
// }

// if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
// {
// _Error_Handler(FILE, LINE);
// }

}
主循环进入前,还要进行将编码器打开
打开代码如下:
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
进行读取的时候还需要设置变量进行读取
uwDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);
CaptureNumber=__HAL_TIM_GET_COUNTER(&htim2);
__IO uint16_t time_count=0;
__IO uint32_t CaptureNumber=0;
__IO uint8_t start_flag=0;
uint32_t uwDirection = 0;//读取计数方向

HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
PWM_Change_Duty(1800,0);
start_flag = 1;

while (1)
{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
OLED_Clear();
PWM_Change_Duty(3600,0);
uwDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);
CaptureNumber=__HAL_TIM_GET_COUNTER(&htim2);//获取计数值
OLED_Clear();
sprintf(str,“1sjs:%d”,CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count);
OLED_ShowString(0,0,str);
sprintf(str,“sjzs:%0.2f”,(float)(CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count)/11/34/2);
OLED_ShowString(0,4,str);

  count=CaptureNumber;		
	
	delay_ms(1000);

}
上述的公式内容有待完善但是可以正常使用,具体参数还要继续调整
,硬件配置时一定要打开定时器的两路接口,因为这样才能对AB相同时进行捕获
这里面的预分频应该使用0,使用的时候注意一下。
在这里插入图片描述
在这里插入图片描述
以上代码是重中之重,一定要根据自己手里的电机型号编码器种类进行配置。
在这里插入图片描述
以上用于在电机反转的时候进行修正,因为此时的捕获值与实际正好相差 65535 - CaptureNumber。
经过具体试验只有以下程序能够在中断中跑起来:(切记如果太复杂了会导致程序卡死)
在这里插入图片描述
切记在中断中再次触发其它中断一定要使第一中断优先级最高,否则无法正常进入中断程序。
以下代码的中断有限最高级是外部中断EXTI9_5其次是定时器2和定时器4,经过试验发现只有这样,编码器才能正常工作。 在这里插入图片描述
最关键问题发现,中断无法进入的另一个原因是因为没有初始化完成寄存器,因此在具体使用程序的时候将中断初始化放在最后。
在这里插入图片描述
这两个函数用来读取编码器的数值。
在这里插入图片描述
这是最终的初始化流程顺序,在程序使用外部中断的时候中断初始化函数一定要放到最后,放到其他初始化前面会导致无法对未初始化的寄存器进行初始化,这条一定要在调用外部中断进行触发的时候切记,十分重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HAL库的使用之Cube配置编码器输入捕获模式 的相关文章

  • Flink_03_Window(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 keyBy不仅是为了分组 同时还是为了能把数据分布到不同分区进行并行
  • JavaScript详解

    目录 一 什么是JavaScript 二 JavaScript的引入方式 三 JavaScript的基础语法 3 1 书写语法 3 2 输出语句 3 3 变量 3 4 数据类型 3 5 运算符 3 6 流程控制语句 3 7 函数 四 Jav
  • 笔记本屏幕忽亮忽暗解决方法大全,总有一款适合你

    笔记本屏幕忽亮忽暗解决方法大全 导言 傻逼Intel的傻逼设计 其原本目的是想在屏幕显示暗的东西时能有更高的暗部表现 或者 顺便省电 实际上眼睛导致干涩流泪 解决方法一 在Intel图形设置关闭Intel节能技术 解决方法二 在intel控

随机推荐

  • Element按需引入

    ElementUI网址 https element eleme cn zh CN component quickstart 1 1 安装 babel plugin component npm install babel plugin com
  • Windows网络守门人UserLock教程:如何分配登录时间配额

    UserLock是您的Windows网络守门人 它可以轻松实现有效的Windows和Active Directory网络用户访问控制策略 并严格执行 在UserLock中我们可以定义时间配额规则以限制所选会话类型的周期性连接时间 接下来 我
  • 法将数据写入传输连接: 你的主机中的软件中止了一个已建立的连接_LabVIEW_基于Network Steams 的无损传输技术...

    LabVIEW提供了用于创建分布式应用程序的多种技术的访问权限 LabVIEW 2010中引入的网络流是在这些应用程序之间流传输数据的理想方法 使用网络流 您可以轻松地在网络上或同一台计算机上共享数据 本文是对网络流进行介绍 并讨论了其功能
  • 【通俗易懂】vue中loading功能实现方法

    效果图 我是点击后让他出现loading效果 上代码
  • STM32MP157 AP6236 WiFi蓝牙模块

    STM32MP157 AP6236 WiFi蓝牙模块 1 介绍 2 修改设备树 3 配置Linux内核 3 1 配置支持WiFi设备 3 2 配置支持IEEE 802 11 3 3 配置支持蓝牙 4 配置Buildroot 5 板子配置 6
  • Vue + axios + vant 封装公共请求

    import axios from axios 引入axios import router from router 引入路由 import Toast from vant 引入提示层 export function post obj 调用时
  • 线程的声明周期

    要想实现多线程 必须在主线程中创建新的线程对象 JAVA中使用Thread类及其子类的对象来表示线程 在它的完整的生命周期一般要包括5类 新建 当一个Thread类或子类的对象被声明并创建时 新生的线程对象就处于新建状态 就绪 处于新建状态
  • Matlab读取csv文件csvread函数的使用

    方法一 M csvread FILENAME 读取逗号分隔值格式的文件名 结果直接返回给M 因此 文件只能包含数值 方法二 M csvread FILENAME R C 从逗号分隔值格式的文件中读取数据 从R行和C列开始 R和C从零开始 因
  • PHP cURL获取HTTP响应头

    前言 平时做开发时 经常会用到PHP的cURL扩展 用于请求外部HTTP接口 大多数情况下 我们只需要获取接口返回的响应体 HTTP response body 但如果我们想获取响应头 HTTP response header 那可以怎么做
  • Mac-解决程序包javafx.util不存在

    环境 macos m1芯片 IDEA jdk zulu 8 jdk 1 8 0 322 支持m1芯片的 解决方式 1 更换jdk版本 不使用支持m1芯片的jdk 到官网 链接下载macos的jdk1 8 0 333 且下载成功之后不需要配置
  • Eclipse调整XML源代码文件字体大小

    Eclipse调整XML源代码文件字体大小 Window gt Preferences gt General gt Appearance gt Colors and Fonts gt Basic gt Text Font 点击Edit 设置
  • 简单的书签服务LinkDing

    今天是上海全域静态管理的第 29 天 周三抗原 周四老苏刚做完核酸 居委突然通知后面的不做了 大家一阵慌乱 结果后来又通知继续 这是要闹哪样 据说是怕系统崩溃 周五终于休息了 根据居委会的通告 周二的核酸又发现一管异常 希望昨天的复检正常吧
  • Codeforces Round#808 div.1+div.2题解

    视频讲解 BV1ya411S7KF div 2 A Difference Operations 题目大意 给定长度为 n n n 的数组 a a a 可以进行任意次操作 每次操作选择一个整数
  • Android高德地图获取当前缩放等级及可视区域四个角的坐标

    获取当前缩放等级 未开启定位图层 在fragment中oncreatview生命周期中无法获取到 可以在Onresume中获取 float zoom mAMap getCameraPosition zoom VisibleRegion vi
  • 第5章域内横向移动分析及防御

    域内横向移动投不定在夏杂的内网攻击中被广泛使用的一种技术 尤其是在高级持续威胁 Advanced Persistent Threats APT中 攻击者会利用该技术 以被攻陷的系统为跳板 访问其他域内主机 扩大资产范围 包括跳板机器中的文档
  • 三千预算进卡吧的顺口溜是啥

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 三千预算进卡吧 加钱加到十万八 十核 E7装上去 四路泰坦抱回家 4K 屏幕组三屏 万元液态温度压 固态硬盘装三块 硬盘内存使劲加 键鼠必花几千元 耳机手柄八千八 还有机箱
  • Java异常————argument type mismatch

    今天写程序遇到的错误 Exception in thread main java lang IllegalArgumentException argument type mismatch argument type mismatch 参数类
  • 简单几步:实现Redis的访问

    一 导入jar包 这里有两个 jedis 2 9 0 jar commons pool2 2 4 2 jar 二 写一个工具类 我叫做 RedisTools类 代码如下 import redis clients jedis JedisPoo
  • 史上最全的Selenium三大等待介绍

    一 强制等待 1 设置完等待后不管有没有找到元素 都会执行等待 等待结束后才会执行下一步 2 实例 driver webdriver Chrome driver get https www baidu com time sleep 3 设置
  • HAL库的使用之Cube配置编码器输入捕获模式

    做平衡小车目前有两种思路 第一种是使用编码器电机 这样一般是两个闭环控制 直立闭环和速度闭环 另一种是使用步进电机 一般使用步进电机很少进行闭环控制 使用Cube进行配置时 发现几点注意事项 STM32单片机自带编码器接口 可以直接进行使用