新闻中心

EEPW首页>嵌入式系统>设计应用> 步进电机的调焦系统设计

步进电机的调焦系统设计

作者: 时间:2016-12-21 来源:网络 收藏

3 软件设计:

由于电机的运行和转动步数以及两步之间间隔时间有关系,故采用计时器计时的方法来计算时间,F240初始化程序如下:

void Initcpu(void) //初始化F240程序
{ *WDCR=0x6f; // 禁止自带的看门狗功能;
*CKCR1=0x69; // 外部输入晶振为20MHZ,F240工作在20MHZ;
*CKCR0=0xc3; // 系统时钟为10MHZ;
*SYSCR=0x4000; } // F240输出频率CLKOUT=IOPC1(I/O管脚);

F240初始化后,计时器的基本计时时间为0.1?s,考虑到F240定时器是16位计数器,这难以满足计算长时间的需求,所以采用通过计算进入定时器中断的次数来计算长时间的方法。例如设置定时器周期寄存器值为800即*T1PR=800,那么进一次定时器中断时间为800*0.1= 80?s如果计时为1s的话,则只需进12500次中断即可,以此类推;故定义的数组内容表示如下:

int table[ ]= { 25,800,255, //第1行
. . . . . . } //第n行

其中25为电机步数;800为定时器周期寄存器值;255每两步间所要进入定时器中断的次数。实现准确地控制步进电机控制器关键在于由F240 I/O口产生规定的脉冲信号,提供给步进电机控制器从而驱动步进电机正确转动,程序中包括F240初始化、电机正转、等待、电机反转几个程序模块。程序流 程图如图2所示:


图2 程序流程图

以下是实现电机正转的程序。程序中变量解释:step:用于存储数组中电机步数;every step:用于存储数组中每两步间所要进定时中断的次数;flag:数组行数标志(程序假设需正转36组)。

void interrupt INT2_ISR()
{ while (*EVIVRA==0x0027) //是否是定时器中断
{ if(flag<36) //用来完成正转
{
if (steptotal==step) //是否走完数组每行规定的步数
{ flag++; //数组行标志加1
steptotal=0; //电机转动步数清零
step=table[++j]; //更新电机运行步数数据
*T1PR=table[++j]; //更新定时器定时周期
everystep=table[++j]; //更新需要进入定时器中断次数
*T1CNT=0; } //从零开始计时,启动定时器
i++; //循环标志位加1
if(i==1) *PADATDIR=0xff05; // 提供下降沿,正转,不脱机
else{ if (i==everystep)
{ i=0;
steptotal++; } //电机每转一步标志位加1
else
*PADATDIR=0xff04; //CP脚为高电平为产生下降沿准备,正转,不脱机
}
*IMR=0x02; //开定时器中断
enable(); //开启F240总中断
}
}

4 实验结果及其注意事项

电机转动的步数和时间坐标都是由主机端通过MATLAB仿真取得的,因此实际调焦曲线的与理想曲线的拟合程度大大提高了;步进电机控制器采用四相八拍运行 方式,并且由DSP进行控制,步进机精确地按照步进角(0.9度)转动。实际应用该调焦系统调整摄影镜头,拍摄运动轨迹已知的目标,达到了满意的效果。

定时器时间的准确计算对高精度地测量一些物理量是非常重要的。当需要定时器计算的时间比较长时,定时器计数还不够,这时就需要利用定时器自身的中断,即短时间定时一到就进入定时器中断服务子程序,利用进入的次数来达到计时的目的。

5 结束语

本文对基于DSPTMS320F240利用步进驱动器UP-4HB03M控制步进电机进行了研究,改进了传统的工程中调焦方式,精度大大提高, 经测试系统运行稳定,由于DSP操作方便,而且采用C语言方式编写,易于日后的代码修改和程序移植。


上一页 1 2 下一页

评论


技术专区

关闭