使用TMS320F28335测量360°舵机转速

目录

  • 前言
  • 相关知识
    • eCAP模块简介
    • 红外传感器简述
  • 实现过程
    • GPIO配置
    • eCAP模块配置
    • 其他代码
  • 效果
  • 总结

大家新年好啊。前几天回乡下过年了,也没带啥东西回去,所以啥也干不了,昨天回来了,又做了一个小实验,跟大家分享一下。

前言

之前用F28335驱动一个舵机旋转(链接在这),一般来说,舵机无法整圈旋转,因此一般也不算转速。不过我手头上这个是360°舵机,所以可以整圈旋转,因此打算利用F28335的eCAP模块结合红外传感器对舵机的转速进行测量。

相关知识

eCAP模块简介

脉冲捕获模块可以通过捕获脉冲量的上升沿或者下降沿,来计算脉冲信号的宽度和占空比,进而可以进行相关控制操作。其典型应用有:

  1. 电机测速
  2. 测量脉冲电平宽度
  3. 测量一系列脉冲占空比和周期
  4. 电流/电压传感器的PWM编码信号的解码

F28335一共有6组eCAP模块,每个eCAP模块不但具有捕获功能,而且还可用作PWM输出功能,这次咱利用的是它的捕获功能。

红外传感器简述

本次所用的红外传感器主要是利用不透明的物体对红外射线的遮挡来实现测量。传感器实物如下图所示,有一根电源线、一根地线以及一根信号线。另外,传感器上还有一个槽结构,当不透明物体位于槽中并将红外射线遮挡时,信号线上输出低电平,否则输出高电平。因此,我们可以通过检测信号线的电平来判断槽中是否有物体;同时,如果将一个整圈旋转的物体置于槽中,就可以通过电平切换的时间间隔对旋转物体的转速做出测量。
使用TMS320F28335测量360°舵机转速_第1张图片
(图片来自网络,侵删)

实现过程

GPIO配置

GPIO配置主要分为eCAP模块相关GPIO配置以及红外传感器相关GPIO配置。由于红外传感器的输出信号是eCAP模块的输入信号,所以将传感器的信号线接到eCAP模块的输入线;另外,由于传感器功率较低,因此直接利用开发板上的DVDD3.3端口给传感器供电。GPIO配置代码如下:

EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO48 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 1;
EDIS;

DVDD3.3的配置在例程函数中,无需修改,此处不列出。

eCAP模块配置

eCAP模块的配置首先要进行时钟使能:

SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK=1;

然后需要对eCAP模块的各个寄存器进行设置:

void Config_eCAP6(void)
{
     
	EALLOW;
	GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;
	GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 0;
	GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 1;
	EDIS;

	ECap6Regs.ECCTL1.bit.CAP1POL = 1;  // capture falling edge
	ECap6Regs.ECCTL1.bit.CAP2POL = 1;
	ECap6Regs.ECCTL1.bit.CAP3POL = 1;
	ECap6Regs.ECCTL1.bit.CAP4POL = 1;
	ECap6Regs.ECCTL1.bit.CTRRST1 = 0;  // no reset after event captured
	ECap6Regs.ECCTL1.bit.CTRRST2 = 0;
	ECap6Regs.ECCTL1.bit.CTRRST3 = 0;
	ECap6Regs.ECCTL1.bit.CTRRST4 = 0;
	ECap6Regs.ECCTL1.bit.CAPLDEN = 1;
	ECap6Regs.ECCTL1.bit.PRESCALE = 0;  // no prescale
	ECap6Regs.ECCTL2.bit.CAP_APWM = 0;  // capture mode
	ECap6Regs.ECCTL2.bit.CONT_ONESHT = 0;  // operate in continous mode
	ECap6Regs.ECCTL2.bit.SYNCO_SEL = 2;  // disable sync out signal
	ECap6Regs.ECCTL2.bit.SYNCI_EN = 0;  // disable sync-in option
	ECap6Regs.ECEINT.all = 0x0000;  // stop all interrpt
	ECap6Regs.ECCLR.all = 0xFFFF;  // clear all flags
	ECap6Regs.ECCTL2.bit.TSCTRSTOP = 1;  // start
	ECap6Regs.ECEINT.bit.CEVT4 = 1;  // enable cevt4 interrpt
}

其他代码

主要是eCAP中断服务函数,中断服务函数主要是读取CAPx寄存器的值并利用这些值进行转速的计算。除此之外,为了更好地进行交互,需要将转速进行显示,这里采用数码管来进行转速的显示。但是由于转速不一定为整数,同时目前我所写的数码管控制函数只能显示整数,所以对计算得到的转速进行乘以1000再取整的操作。主要代码如下:

interrupt void ISR_eCap6(void)
{
     
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
	ECap6Regs.ECCLR.all = 0xFFFF;  // clear all flags
	Uint32 t1, t2, t3, t4;
	Uint16 s;
	t1= ECap6Regs.CAP1;
	t2= ECap6Regs.CAP2;
	t3= ECap6Regs.CAP3;
	t4= ECap6Regs.CAP4;
	servo_speed_1 = CPU_CLK / 2 / (t3 - t1);
	servo_speed_2 = CPU_CLK / 2 / (t4 - t2);
	servo_speed = (servo_speed_1 + servo_speed_2) / 2;
	s = (Uint16)(servo_speed * 1000);
	DT_Show(s);
}

效果

360°舵机测速效果


可以看到,每次舵机的叶片转到红外传感器的槽之间时,红外传感器上的指示灯熄灭,说明此时红外传感器输出低电平。同时可以看到,数码管显示出了当前的转速,基本位于200-210之间,所以可得现在舵机的转速为0.2-0.21r/s。转速的误差一方面来自舵机转速的不稳定,另一方面也来自手持传感器的轻微晃动。

总结

到这里,利用eCAP模块和红外传感器测量360°舵机转速的小实验就完成了。可以看到,整一个的思路是先利用红外传感器检测遮挡来产生脉冲序列信号,然后通过eCAP模块捕获脉冲并根据脉冲间的时间进行转速的计算。不过转速显示上还有所欠缺,后面可以将小数的显示给补上。最后欢迎大家批评指正。

你可能感兴趣的:(我有一块F28335开发板系列,传感器,经验分享,c语言)