SPMC75增量编码器接口应用

spmc75增量编码器接口应用
增量式编码器是直接利用光电转换原理输出三组方波脉冲a、b和z相;a、b两组脉冲相位差90o,从而可方便地判断出旋转方向,而z相为每转一个脉冲,用于基准点定位。它的优点是原理构造简单,机械平均寿命可在几万小时以上,抗干扰能力强,可靠性高,适合于长距离传输。其缺点是无法输出轴转动的绝对位置信息。增量式编码器是一种测量设备转动的传感器,在电机驱动控制中得到广泛应用。
关键词:spmc75 增量编码器
1引言
本文主要是讲解spmc75f2413a的pdc定时器模块的增量码盘接口功能,用这个接口可以测量增量码盘转轴的角位移,同时还可根据单位时间的角位移计算出增量码盘转轴的角速度,进而得到转轴的转速。本例使用的增量码盘接口模式1,这是四倍频接口模式,适合图2-1中所示类型的波形。
2系统框图
系统结构如图2-1所示,主要由信源模拟发生模块和速度测量模块组成。两个模块均由spmc75f2413a构成。信源模拟发生模块产生如中a、b所示的信号波形,a、b信号相差90度,图中只示出了b超前a的情况,信号的频率由电位器调整。
图 2-1 系统结构图
3增量编码盘接口原理
3.1 设计原理
增量编码盘是一种测量角位移增量的传感器,根据其工作方式的不同可分为光电式、磁电式和纯机械式等几种,光电式和磁电式是现今最常用的方式。其中光电式用得最多是光电透射式,而磁电式主要是利用类式磁带的原理在一个圆周上均布了n、s的磁信号,利用磁敏组件检出信号。
spmc75f2413a的增量编码盘接口模式1工作原理如图3-1所示:外部输入信号tclka、tclkb频率相同但相位互差90度,其频率与其转速成正比,比例为增量编码的细分数(每转1转所输出的脉冲个数)。而两路信号的相位关系则代表了转向信息。当tclka超前tclkb时为正转,反之当tclka滞后tclkb时为反转。同时,由于这两路信号是互差90度的,为了提高测量的精度,计数器是在两路信号的跳变沿都计数,而计数的方向则由两路信号的相位关系确定。tclka超前时计数器增计数,tclka滞后时计数器减计数。如此,用户便可以得到从计数器开始计数后增量编码转轴的角位移量(如当增量编码盘的细分数为n时,增量编码盘的每一个脉冲代表的角位移为由于为四倍频计数,因此,当计数器的值为k时,所代表的角位移为)。同时,用户可以通过测量单位时间内的角位移而得到当前转轴的转速。其转速为:
------(式3-1)
式中:为转轴角速度;
为测量时间;
为内的计数器增量;
n为码盘的细分数;
图2-1 相位计数模式1
4硬件说明
4.1 信号模拟发生电路
这部分电路如图4-1所示,使用spmc75f2413a的mcp3实现双线增量码盘输出信号的模拟,并根据ad采集的数据设置信号的频率和方向,以满足系统测试的需要。
图4-1信号模拟发生电路
4.2 测量接口电路
电路如图4-2所示,这部分是本例的主体部分,它主要是利用spmc75f2413a的pdc定时计数器的相位计数(码盘接口)模式1完成位置信号的采集、速度的测量。为了提高测量精度,使用了四倍频技术。
图4-2测量接口电路
5软件说明
5.1 软件说明
系统的软件部分主要是系统所用到的硬件的初始化,并在硬件中断时进行相应的的处理。同时利用dmc的通信软体库完成与pc的通信,以便对系统状态和结果进行监控。
5.2 软件流程
5.2.1主程序流程
主程序在完成系统初始化以后,就不断检测有没有来自pc的控制信息,如果有便完成相应的控制功能,没有就继续检测。同时将当前系统测得数据送入dmc接口区,以便系统状态的监示。
图5-1 主程序流程图
5.2.2中断流程
中断服务主要有三个,一个是系统通信中断服务,主要是在dmc库中完成;一个是pdc定时器的溢出中断服务,在这里主要完成位置计数溢出的处理,以保证位置单元的正确性;最后一个是定时器的周期中断服务,这里主要完成当前位置信息的采集,同时根据位置增量计算当前的转速。
5.3 程序代码
使用spmc75f2413a的pdc0的相位计数模式(即两线增量码盘接口)实现使用两线增量码盘测量电机转速。
#include spmc75_regs.h
#include mcmacro.h
#include spmc75_dmc_uart_ext.h
#define samp_time 8 // 采样定时器 , 单位 ms
void daly_time(int time);
void pdc0_init(void);
void time2_init(void);
static int moto_speed = 0; // 电机转速
static int over_flag = 0; // 位置计数器溢出标志
static int encoder_data = 256*4; // 编码盘的细分常数
// 电机绝对位置 ( 长整数 , 为了计算方便 , 高低分开定义 )
static unsigned int position_count[2] = {0,0};
static unsigned int old_position_count = 0; // 上一次电机位置 ( 低 16 位 )
//=====================================================================
// ----function: main(void);
// -description: 主函数
// --parameters: none
// -----returns: none
// -------notes:
//=====================================================================
main()
{
pdc0_init();
time2_init();
mc75_dmc_uart_setup(9600);
int_irq();
while(1)
{
mc75_dmc_uart_service();
if(spmc_dmc_load_spdcmd(1) > 0)
encoder_data = spmc_dmc_load_spdcmd(1)*4;
spmc_dmc_save_spdnow(1,moto_speed);
}
}
//=====================================================================
// ----function: void pdc0_init(void);
// -description: 定时器初始化
// --parameters: none
// -----returns: none
// -------notes:
//=====================================================================
void pdc0_init(void)
{
p_ioa_dir->w &= 0xe7ff; // 设置用到的 io 口
p_ioa_attrib->w &= 0xe7ff;
p_ioa_buffer->w |= 0x1800;
p_ioa_spe->w |= 0x1800;
p_tmr0_ctrl->b.spck = cb_tmr0_spck_fckdiv1; // 设置采样时钟为主系统时钟
// 设置定时计数器模式为四倍频增量码盘接口
p_tmr0_ctrl->b.mode = cb_tmr0_mode_mode1;
p_tmr0_ctrl->b.ccls = cb_tmr0_ccls_disabled; // 禁止计数器清除
p_tmr0_ctrl->b.ckegs = cb_tmr0_ckegs_rising; // 设定计数边沿为上升沿
p_tmr0_ctrl->b.tmrps = cb_tmr0_tmrps_fckdiv1; // 设置时钟 , 这是必需的
// 使能计数器的上溢下溢中断
p_tmr0_int->w |= cw_tmr0_tcuie_enable + cw_tmr0_tcvie_enable;
p_tmr_start->b.tmr0st = 1; // 启动定时器
}
//=====================================================================
// ----function: void time2_init(void);
// -description: tmr2_module initialize function
// --parameters: none
// -----returns: none
// -------notes:
//=====================================================================
void time2_init(void)
{
p_tmr2_ctrl->b.mode = cb_tmr2_mode_normal; // 工作模式初始化为连续增计数
p_tmr2_ctrl->b.ccls = cb_tmr2_ccls_tpr; // 计数器清零源为周期匹配信号
p_tmr2_ctrl->b.ckegs = cb_tmr2_ckegs_rising; // 计数边沿为上升沿
p_tmr2_ctrl->b.tmrps = cb_tmr2_tmrps_fckdiv4;// 计数时钟为主时钟的 1/4
p_tmr2_tpr->w = 6000*samp_time; // 定时周期设为 48000---8ms
p_tmr2_int->b.tprie = cb_tmr2_tprie_enable; // 使能定时器的周期中断
p_tmr_start->b.tmr2st = cb_tmr_tmr2st_start; // 启动定时器
}
//=====================================================================
// description: irq1 interrupt source is xxx,used to xxx
// notes:
//=====================================================================
void irq1(void) __attribute__ ((isr));
void irq1(void)
{
if(p_tmr0_status->b.tcuif)
{
p_tmr0_status->b.tcuif = 1; //clear tcuif flag
(int)position_count[1] --; // 位置计数下溢出
over_flag = 1;
}
if(p_tmr0_status->b.tcvif)
{
p_tmr0_status->b.tcvif = 1; //clear tcvif flag
(int)position_count[1] ++; // 位置计数上溢出
over_flag = 1;
}
}
//=====================================================================
// description: irq4 interrupt source is xxx,used to xxx
// notes:
//=====================================================================
void irq4(void) __attribute__ ((isr));
void irq4(void)
{
long temp;
if(p_tmr2_status->b.tprif)
{
p_tmr2_status->b.tprif = 1;
position_count[0] = p_tmr0_tcnt->w;
if(position_count[0] 0) //1 正转 , 上溢
temp = (0xffff - old_position_count) + position_count[0] + 1;
else //0 反转 , 没有溢出
{
temp = old_position_count - position_count[0];
temp = -temp;
}
}
else
{
if(over_flag > 0) // 反转 , 溢出
{
temp = (0xffff - position_count[0]) + old_position_count + 1;
temp = - temp;
}
else // 正转 , 没有溢出
temp = position_count[0] - old_position_count;
}
over_flag = 0;
old_position_count = position_count[0];
moto_speed = (int)((temp*7500)/encoder_data);// 速度计算
}
}
//=====================================================================
// description: irq6 interrupt source is xxx,used to xxx
// notes:
//=====================================================================
void irq6(void) __attribute__ ((isr));
void irq6(void)
{
if(p_uart_status->b.rxif && p_uart_ctrl->b.rxie)
mc75_dmc_rcvstream();
}

AUTOSAR配置中的PostBuild、Precompile、Linktime
人工智能主导的智能化战争会是什么样
国产焊接机器人工艺存在哪些痛点
10步法则教你MOSFET选型
智能手机、物联网应用中的高分辨率音频
SPMC75增量编码器接口应用
VR直播平台NextVR其直播应用将登陆Oculus Rift PC VR平台
颚式破碎机皮带轮轴头磨损的修复方法及保养建议
无线模块的简介,它在“水盾”防溺水安全预警系统的应用
暑假期间如何快速提分?讯飞智能学习机有妙招
带间隧穿结的若干种架构及其应用的详细讲解
一文解构中软国际智慧零碳一站式解决方案
基于LinkSwitch-PH可控硅调光驱动器的高效LED照明设计
OPPO或将进军智能手表和智能耳机市场
五大高端旗舰进行充电对比,OPPO超级闪充又赢了
识别技术拐点
论如何拥有一个AI朋友丨AI的无限可能性
高清术语与命名规则
智能镜子显示器可让智能家居的体验更为智能
物联网卡管理平台能有效降低物联卡成本