目录
一、项目需求
通过GD32F150C8T6的IO口识别EC11的旋转方向和脉冲输出计数,将值产给PC,最终实现机械臂的角度输出和方向控制。由于EC11单圈20plu,分辨力低,所以程序上对其进行四倍频,提高分别率到单圈80plu,勉强满足要求。
二、EC11介绍
1.原理图
2. 工作原理:S1、S2两相都输出方波,顺时针方向旋转编码器时,A相超前B相90度(如上图,A相先产生下降沿,B比A相滞后),逆时针方向旋转时,B相超前A相90度。
3. 倍频:相对于刻度盘来说的,比如,刻度盘栅格数是100,那么转一圈就计数100次,为1倍频,如果通过某种方式可以实现转一圈计数400次,那就说实现了4倍频。
4. 整理思路:
(1)如果不进行倍频,则GD32在EC11的脉宽内检测到第一个脉冲边沿时脉冲值计数一次,再通过判断A相超前还是滞后B相来判断方向,返回给PC;
(2)EC11的一个脉宽周期单向有4个边沿,而每个边沿均可被GD32的IO口识别,也就是说可以被检测4次,4次检测就相当于计数4次,在每次边沿检测时,可以判断该边沿极性和另外一向的电平高低来判断旋转方向,实现4倍频;
(3)对于GD32来说,每次和EC11输入信号(A、B相)都是一次信息交互,脉冲计数、方向判断都是在这次交互种中完成。而最佳的交互触发方式就是通过检测边沿跳变,只要有边沿跳变,那就进行通信。
(4)可以通过IO查询、外部中断、正交编码的方式实现该需求。用IO查询太慢了,因为程序执行周期较短,单圈80个脉冲,但在加速瞬间依然还是会丢脉冲值,不过对本次项目来说还勉强能接受。外部中断方式基本实现不丢包,但是消耗CPU资源。正交编码要求特定外设的IO口,由于搞硬件的一开始选错了IO,选了只有单通道捕获,双互补通道输出的IO口,所以不能用来做正交编码,所以这部分代码只配置,没测试。这里放出外部中断实现的代码。
三、外部中断
1.中断优先级:
(1)中断优先级分为主优先级(抢占优先级)和次优先级(响应优先级),抢占优先级的
级别高于响应优先级。
(2)而数值越小所代表的优先级就越高;
(3)如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
(4)高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
(5)抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
2.中断和事件的区别:
产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
简单点来说,就是中断最终会自动进入中断服务函数,而事件则不会有对应的服务函数。中断是软件级的,而事件是硬件级的。
3. GD32F150xx外部中断映射
4.中断向量表(和F103不一样)
如图红框,EXTI0和EXTI1公用一个中断向量EXTI0_1_IRQn;
EXTI2和EXTI3公用一个中断向量EXTI2_3_IRQn;
EXTI4---EXTI15公用一个中断向量EXTI4_15_IRQn;
四、程序源码
下面代码里的handler()函数是对计数的脉冲值和判断的方向值进行处理后发给PC,没上传。