使用Stm32Cubemx配置定时器正交编码模式详解

发布者:创意狂想最新更新时间:2019-07-30 来源: eefocus关键字:Stm32Cubemx  配置定时器  正交编码模式 手机看文章 扫描二维码
随时随地手机看文章

        这篇文章也是本人做完一个项目后抱着想记录点东西巩固下知识同时又想给后来的技术同伴一点参考的想法写下来的,和本人之前有关中颖芯片的博文意图是一致的。看完本篇文章可以了解stm32芯片如何配置定时器正交编码模式的同时对cubemx也会有一定的了解。这款工具很好用,很方便,希望所有用st芯片的伙伴们都能掌握它的用法,使用一种工具很快能上手,主要是大家要了解标准库和HAL库之间的一些微小机制区别就很容易了,这篇文章不打算讲这些,要不跑题了,有空的话专门写一篇文章,不过大家也可以在网上找到很多资料,废话不多说了下一段进入主题。


        这里假设大家都下了cubemx软件,对软件具有一定的熟悉度。用stm32f030系列来为例吧。对于什么叫正交编码就不多说了,想必要看我这篇文章的应该都是直接工程或项目中用到了,具有一定基础,实在不知道的就网上找资料了。这里还是插入两幅时序图,一个代表增,一个代表减。

打开cubemx,新建工程,下面直接上图比较直观;


这里选择定时器1,输入通道是通道1和通道2,注意这里的外部中断并不是用来接编码器的第三跟线(可以用作清零计数器作用),后面会向大家解释。


主要配置清单:


1.不分频;


2.向上计数;


3.选择 Encoder Mode TI1 and TI2;


4.两路通道配置成上升沿检测;


这里我是要用4倍模式的即上升沿和下降沿都要检测到并且计数器加一或减一,但为什么cubemx却配制成上升沿检测,之前我也试过配制成双边模式,但效果不对,当然您知道为什么也烦请一定评论告诉我。


到现在也没讲cubemx怎么用,我相信写程序的对这种工具都很容易上手,稍微点一下就通,也就不花多少笔墨在这上面,不过还是要提醒下,使用cubemx生成的代码一定要写在/*BEGIN*/和/*END*/之间,否则下次重新更改配置生成后自己写的代码会被覆盖,配置好之后保存自动生成工程代码。


接下来讲讲一些编程思想,用到正交编码的地方大部分是用作带方向的计数,至于大家各自项目里计数的含义(或者说得到的脉冲数所代表的含义)各不相同,在我的项目中脉冲数代表距离,大家很快便明白。


上图配置中我配置的是0 - 20000计数。使用函数__HAL_TIM_GET_COUNTER(&htim1)可以实时获取计数值。编码器带方向,在我使用的过程中正转计数器从0计数到20000,反转计数器从20000计数到0.这样的话假设从0开始经过一段时间假设计数值是10000那这10000是经过正转n个20000之后的10000还是反转n个20000的10000,可能你会说设一个更新中断计数。我们设置的是向上计数,怎么判断他是正转的20000还是反转的20000更新中断,正转当转到20000时更新中断产生,翻转当转到0跳到20000也有一个更新中断。这时,大家会想到实时设置两个获取计数器的值,更新中断里判断两个值得情况便知道正反转,理论是可以的,但是当转速过快,或者我干脆就在0和20000附近来回转,那么情况便很糟糕,随时计数可能乱套。这时大家还会想到配制成中央对齐模式是否可以,本人配置过,效果不对,可能编码器只能从0计数到预装载值,或者从预装载值计数到0;那这个时候怎么办,__HAL_TIM_SET_COUNTER()这个功能派上用场了,初始值用它将计数器配置为10000(这里以20000为例),每次进更新中断在中断里都设置成这个值,这样就达到了从中点要么向上,要么向下计数的结果。避免稍微移动转盘出现0和20000来回产生中断的情况。至于怎么处理数据,我直接上代码,文字已经写得够多了,大家也看不情愿了,最后的结果是可以很方便的得到不管如何转(一直正转,一直反转,时而正转时而反转)相对于最初真实的距离点(是n个正或反20000倍数加m(零头)个脉冲)。


这是中断里面的处理过程(下面的注释和项目是不一致的,主要为了说明问题):


 if(htim == &htim1)

{

if(puse_n.puse_count < 10000)  //向下计数     和更新中断产生前的计数值比较便知道是正转产生的更新中断还是反转产生的

{

puse_n.loop_num--;       //10000的倍数

}

if(puse_n.puse_count > 10000) //向上计数

{

puse_n.loop_num++;

}

__HAL_TIM_SET_COUNTER(&htim1,10000);

}


这是获取最后结果的函数:


void get_true_distance(Puse_number* my_puse)

{

my_puse->puse_count = __HAL_TIM_GET_COUNTER(&htim1);

if(my_puse->loop_num == 0 && my_puse->puse_count > 10000)   //刚开始是正转

{

my_puse->true_puse = my_puse->puse_count - 10000;

}

else if(my_puse->loop_num == 0 && my_puse->puse_count < 10000)  //刚开始是反转

{

my_puse->true_puse = 10000 - my_puse->puse_count;

}

else if(my_puse->loop_num > 0 )

{

my_puse->true_puse = my_puse->loop_num*10000 + my_puse->puse_count - 10000;  //正转my_puse->loop_num倍的10000后

}

else if(my_puse->loop_num < 0)

{

my_puse->true_puse = (-1)*my_puse->loop_num*10000 + 10000 - my_puse->puse_count;  //反转my_puse->loop_num倍的10000后

}

else if(my_puse->loop_num == 0 && my_puse->puse_count == 10000)   //起点

{

my_puse->true_puse = 0;

}

}


my_puse->true_puse是最后结果,这里代码里面有一点需要提出,当采用中间值时,实际更新中断是每10000个脉冲计数产生一次,变量命名给阅读者带来的麻烦请谅解。

关键字:Stm32Cubemx  配置定时器  正交编码模式 引用地址:使用Stm32Cubemx配置定时器正交编码模式详解

上一篇:STM32CubeMX学习:基本定时器
下一篇:STM32 CubeMX输入捕获测量PWM波形频率与占空比

推荐阅读最新更新时间:2024-11-10 16:23

STM32CubeMx 针对407 discovery点亮LED灯
STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(RTOS, USB, FatFs, TCP/IP, Graphics, 等等). 直观的STM32微控制器的选择和时钟树配置 微控制器图形化配置外围设备和中间件的功能模式和初始化参数 C代码生成项目覆盖STM32微控制器的初始化符合IAR™,Keil的™和GCC编译器。 对于新的产品设计,我们强烈推荐使用STM32Cube来加速你的开发过程,并为以后的产品平台移植打下良好的基础。1.新建工程 打开STM32cubeMX软件,
[单片机]
<font color='red'>STM32CubeMx</font> 针对407 discovery点亮LED灯
STM32F4 TIMER定时器配置(一)
定时器溢出时间计算: Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk ARR:自动重装载寄存器,用于装载计数器 PSC:PSC预分频器(分频范围1~65535) Tclk:外设时钟周期 定时器配置步骤 1定时器时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 2.初始化定时器 1.定义定时器结构体 TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; 2.设置自动重装载值 TIM_TimeBaseStructure.TIM_Period = 自动重载值; 3.设置预分频系数 TIM_TimeBaseS
[单片机]
MacOS下STM32CubeMX安装文件双击无反应的解决办法
更新到5.1.0 RC6版本后双击不行了,需要右键点击app安装文件,选择 显示包内容 ,然后进入`Contents-MacOS`目录,找到类似于`SetupSTM32CubeMX-5_1_0_macos`的文件,然后假设文件名是`SetupSTM32CubeMX-5.1.0.app`,存放目录为`~/Downloads/STM/en.SetupSTM32CubeMX-5.1.0-RC6/`,那么运行如下命令: `sudo ~/Downloads/STM/en.SetupSTM32CubeMX-5.1.0-RC6/SetupSTM32CubeMX-5.1.0.app/Contents/MacOs/SetupSTM32CubeM
[单片机]
STM32 定时器中断配置心得【自用】
1.IO配置 略 2.TIM配置 void TIM2_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period =359999; TIM_TimeBaseStructure.TIM_Prescaler = 99; TIM_TimeBas
[单片机]
Keil MDK STM32系列(五) 使用STM32CubeMX创建项目基础结构
概述 从前面介绍的STM32开发可以感受到, 虽然SPL对于纯寄存器方式开发已经是很大的进步, SPL将大部分寄存器配置做了很好的封装, 配置项简单易读, 但是外设与输出脚的映射关系, 配置项的数量, 配置之间的关联都使得配置难度并未降低, 在项目启动阶段依然要通过不断查阅MCU的用户手册去修改方案, 各种情况下的代码例程直接借鉴容易出错, 需要反复尝试, 往往在调通外设这一步就已经耗费了开发人员的大量时间. 所以ST将开发库的重心迁移到了HAL上, 配合HAL的就是STM32CubeMX这个图形化配置工具. 通过图形化界面, 通过预设的逻辑辅助生成代码模板. 这样可以将底层寄存器和外设的复杂定义和逻辑包装在工具界面之下, 避
[单片机]
STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 -------------------------------------------------------------------------------------------------------------------------- 错误:error: #20: identifier TIM_ICPOLARITY_BOTHEDGE is undefined 意思是,高级、通用定时器不能用BothEdge,只有基本定时器才能用BothEdge F4系列 /* 编码器初始化及使能编码器模式 */ ENCODER_TIMx_Init(); HA
[单片机]
STM32 HAL库学习系列第5篇 <font color='red'>定时器</font>TIM---编码器接口<font color='red'>模式</font><font color='red'>配置</font>
基于STM32CUBEMX驱动TOF模块VL53l0x(3)----驱动多个VL53L0X
概述 在本章中,我们将探讨如何同时驱动多个VL53L0X传感器进行距离测量。我们将介绍如何有效地管理多个传感器之间的通信和控制,以确保它们能够同时进行准确的距离测量。通过本章的学习,将能够了解如何利用多个VL53L0X传感器的优势,为应用程序提供更全面的环境感知能力。 视频教学 样品申请 源码下载 修改设备地址 VL53L0X使用I²C总线进行通信。默认情况下,VL53L0X的7位地址为0x29。然而,为了避免地址冲突并允许多个传感器共享相同的I2C总线,用户可以通过向寄存器I2C_SLAVE_DEVICE_ADDRESS(寄存器地址为0x8A)写入自定义的7位地址来修改传感器的地址。 修改后如下所示。 /
[单片机]
基于<font color='red'>STM32CUBEMX</font>驱动TOF模块VL53l0x(3)----驱动多个VL53L0X
STM32CubeMX系列教程5:串行通信(USART)
本章以串口为例讲解,HAL 库轮询,中断,DMA 三种编程模型。 1.前情回顾 在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。 常用的两种基本串行通信方式包括同步通信和异步通信。我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。 2.重定义printf函数。 打开STM32CubeMX新建工程,选择STMF746IGT6芯片,选择外部
[单片机]
<font color='red'>STM32CubeMX</font>系列教程5:串行通信(USART)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved