历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2019年07月30日 | 使用Stm32Cubemx配置定时器正交编码模式详解

2019-07-30 来源:eefocus

        这篇文章也是本人做完一个项目后抱着想记录点东西巩固下知识同时又想给后来的技术同伴一点参考的想法写下来的,和本人之前有关中颖芯片的博文意图是一致的。看完本篇文章可以了解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个脉冲计数产生一次,变量命名给阅读者带来的麻烦请谅解。

推荐阅读

史海拾趣

Harvatek Corporation公司的发展小趣事

背景:作为电子显示领域的佼佼者,Hantronix不仅关注自身的发展,还积极履行社会责任,为行业的进步和发展做出贡献。

发展:Hantronix通过技术创新和产品升级,推动了电子显示技术的进步和应用范围的扩大。同时,公司还积极参与行业标准的制定和推广工作,为行业的规范化、标准化发展贡献了自己的力量。此外,Hantronix还注重人才培养和团队建设,为行业培养了一大批高素质的专业人才。

以上五个故事虽然基于概括性描述,但均反映了Hantronix公司在电子行业中的发展历程、技术创新、市场拓展、品质保证以及行业影响等方面的实际情况。

C&H Technology公司的发展小趣事

为了进一步提升竞争力,C&H Technology积极寻求与其他企业的战略合作。公司与一家知名的手机制造商签订了长期合作协议,共同开发定制化芯片解决方案。同时,C&H Technology还与一家领先的半导体生产企业建立了战略联盟,共同研发新型半导体材料和生产工艺。这些战略合作不仅为公司带来了更多的商业机会,也提升了公司的技术水平和品牌影响力。

Emerson公司的发展小趣事

进入20世纪,Emerson迎来了一系列技术突破。1903年,公司成功研发出马力超过1/2的电机,这些电机被广泛应用于洗衣机、缝纫机等家用电器,进一步拓宽了公司的业务范围。此外,Emerson还积极开拓海外市场,通过并购和战略合作,逐步将业务拓展至全球范围。

Gaomi Xinghe Electronics公司的发展小趣事

背景:在21世纪初,Galaxy公司凭借其在电子产品领域的深厚积累,决定进一步拓展国际市场。通过详细的市场调研,公司发现欧洲市场潜力巨大,特别是对高质量电子产品的需求日益增长。

行动:于是,Galaxy在波兰Cracow成立了欧洲分公司,地处欧洲中部,这一地理位置使其能够很好地覆盖整个欧洲大陆,包括东部和西部的国家。该分公司不仅作为销售中心,还承担起返修件回收处理的重任,确保客户能够享受到无时区差别的销售和维修服务。

成果:这一战略部署显著提升了Galaxy在欧洲市场的知名度和竞争力,市场份额逐年攀升,为公司的全球化进程奠定了坚实基础。

HCC Industries公司的发展小趣事

面对日益激烈的市场竞争和快速变化的市场需求,HCC Industries在2020年启动了数字化转型计划。公司投入大量资金引入先进的自动化生产线和智能化管理系统,实现了从原材料采购到成品出厂的全链条数字化管理。这一举措不仅大幅提高了生产效率和产品质量,还降低了运营成本和库存风险。同时,HCC还利用大数据和人工智能技术优化产品设计和市场策略,进一步提升了其市场竞争力。

ELEMENT14公司的发展小趣事

ELEMENT14的在线社区是其成功的关键因素之一。公司投入大量资源建设和发展在线社区,吸引了大批电子设计工程师和采购专员的参与。在这个平台上,工程师们可以分享经验、交流技术、解决问题。ELEMENT14还通过社区收集客户反馈和需求,不断优化产品和服务。这个活跃的在线社区不仅增强了客户黏性,也为公司提供了宝贵的市场信息。

问答坊 | AI 解惑

传感器用电路

求助: 传感器在汽车应用中所用的电路设计,用什么软件,望能提供相关资料!     真诚谢谢!   邮箱: lj521999@126.com…

查看全部问答>

滤波器设计手册

滤波器设计手册…

查看全部问答>

Android移植之WIFI

1. 前言 硬件平台: marvel 310 软件平台: maemo4 内核: 2.6.28 (经过 marvel 的移植) 2. 移植思想 1, WIFI 模块本身和 cpu 之间的接口; 我们的模块和 cpu 之间的接口是 sdio 的,也就是说必须要先保证 SDIO 本身 ...…

查看全部问答>

华硕工厂资料-主板上电原理介绍

华硕工厂资料-主板上电原理介绍…

查看全部问答>

丽台科技推出WinFast PXA-310 "嵌入式开发学习平台"

一套系统可同时学习WinCE、Linux、Androi,并提供全套课件。 目前於台湾地区已被30多所的大学大量采用,作为\"嵌入式应用开发\"标准课程 \"嵌入式应用\"已经确认为未来最重要的 IT 终端应用的发展趋势,也是国内IT人才需求量最大的领域。然而,由 ...…

查看全部问答>

WinCE产品收费情况

公司开发产品,如果量很大的话,那么收费情况是什么样子的?像EVC,PB等开发工具是不是都要正版的?请教下…

查看全部问答>

一个菜鸟,准备进入IC设计

    我想进入IC设计这方面的领域。以前学习软件开发,伴随着软件开发经验越多,感觉硬件太差,这时想搞清楚计算机电路设计构造,尤其是芯片设计。在网上查找了些资料,才发现这时有关IC设计领域的事情。     或许是软件经验太 ...…

查看全部问答>

美光360摄像头能够和支持656接口的dsp进行对接吗?

我象把美光360(MT9V011)作为我ipcamera的接口,而dsp只支持656接口,而MI360没有说是否支持656接口。360应该输出的就是数字RGB接口,CCIR656接口不知道能否支持RGB的格式。 …

查看全部问答>

一个有趣的小工具,总线直通车,bus pirate

网上看到一个老外做的有趣的小工具,bus pirate,就是利用PC做控制台,通过一个PIC单片机板子,模拟输出各种常用的单片机总线信号,比如I2C,SPI,1WIRE等等,这样就可以对常用的各种总线接口的芯片进行直接操作,不需要利用单片机编程序的麻 ...…

查看全部问答>

ISE VHDL 如何消除锁存器

写了一个状态机,从RAM里读读写写了64次,综合以后报警,说读写的地址端口有锁存器(12位地址,所以一共有24个). 上网查了一下,锁存器是只有if没有else时出现的,但修改以后锁存器一个没少。 下面是我程序的一部分, w_add      ...…

查看全部问答>