|
楼主 |
发表于 2008-12-20 19:26:04
|
显示全部楼层
注意 以下为我东摘西抄回来的,仅仅供参考
**********************************
我不知道你们所说的伺服电机是指那种,是不是就是直流电机伺服系统?如果是这个的话我可以和你们简单说一下,这种伺服电机有两套控制理论:一,古典控制理论,这个我不是很清楚,二,现代控制理论,也就是所谓的PID控制,模糊PID控制,鲁棒理论等等。
我目前做的是简单的PID控制,还没有涉及到模糊PID调节,我是用TI公司的TMS320LF2407A做的PID控制器+L6203 H桥的控制,利用TMS320LF2407A的PWM发生器,就做了一个闭环,控制起来很简单,不过目前这种控制精度上有一些问题!正计划用古典控制理论改进。
需要的话我可以写一些关于PID和PWM控制的一些简单的介绍!反正最近有个培训要做也正好是讲直流电机的控制。
****************************************************************
【6楼】 ilan2003 小松工程
积分:2885
派别:
等级:------
来自:浙江杭州
我刚用了一点点,
伺服电机的工作过程与原理。
伺服电机的控制方式有两种:
位置控制:外部给CLK+DIR控制,和控制步进电机一样的,只是步进电机是开环的,而伺服电机是璧还的。
速度控制:电机按照设定的速度控制,设定方式分为外部模拟量控制和驱动器上的键盘设顶速度
都是通过电机的内部的光电编码器实现反馈的,一般光电编码器是2500线,4倍频就是10000线,既一圈分成10000等份。
我就知道这些,可能还有写错误的理解,希望指正
我用的电机的光电码盘是500线的! 2500线算高精度吧!
还有是否能详细解释一下你的"速度控制"是一个什么样的概念.通过设定速度怎么控制电机?
可能你要表达的并不是控制电机方面的东西,而是屏蔽电机驱动谈外部给电机驱动器的信号的方式,哦!对了!你说的是控制方式(这个概念比较容易混淆)
我不知道下面我联系数控系统的控制理论来理解你的位置控制和速度控制可对.如果不对希望你能谅解,在数控系统中,涉及到插补算法的问题,普通的插补算法分两种:脉冲当量插补和时间标量插补.可能分别对应你说的两种控制方式.
一,位置控制:我们的控制系统通过脉冲当量插补的方式给我们的电机驱动器以脉冲信号,电机驱动器接受到脉冲信号后驱动电机走相应的距离,这一距离称为系统的步长.这一种在步进电机驱动的数控系统中比较常见,在伺服系统中也有,其实在伺服系统中是累计输入的脉冲数和反馈的脉冲数,然后根据两者的差值做PID调节,并不是真正的脉冲当量控制.
二,速度控制:可能对应于时间标量插补,就是把电机将要行程的距离用相同的时间间隔来分割,根据你分割出来的距离的不同来改变电机的速度,在这个系统中,电机接收到的是距离量,这个距离量必须在规定的时间走完,比如说我的时间间隔是500us,我在500us开始给电机驱动器一个距离量L,那么在接下来的500us内电机就拼命完成L距离的行程.(有的时候会出现跑过的情况,这个时候电机会反转来保证L的距离,这个取决于你的PID调节力度).
************************************************************
你到PIC的网站上找dsPIC30F2010的资料,就会找到各种伺服电机的驱动资料
现在有专用IC,性价比最高,可参考流明诺瑞与凌阳的产品说明,分别有几个型号,专门针对电机开发的.在凌阳单片机赠送的光盘里,有伺服电机的演示程序.
http://www.openservo.com/moin.cgi/StepByStep
**********************************************************
IC
HEDS-9100 9352
http://auction1.taobao.com/auction/item_detail-0db1-414e1ad7282c476c2eea660fbbd86555.jhtml?pm1=1
联系人:郑先生
固定电话: 86-0755-61329871、61329872
手机: 13714483344
传真: 0755-61685792
展销柜:深圳市福田区新亚洲电子商城2楼2B004B 公司:华强南路御景华城20楼C室
邮编: 518000
QQ: 130388555
MSN: 130388555@qq.com
Email:130388555@QQ.com
*************************************************
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=636900&bbs_page_no=1&search_mode=1&search_text=伺服&bbs_id=9999
看你的要求好象是用驱动器的,这是我最近写的一个测试步进电机的程序,你参考一下吧,希望能帮你,但是使用C51写的
/*步进电机实验程序;驱动器型号 BQM241A 电机型号:85BYG450-004-05*/
/*800个脉丛走360,频率大约?K*/
/*P0.0正转输入;P0.1反转输入*/
/*20060526*/
#include <stdio.h>
#include <reg51.h>
unsigned int step_number=600;
unsigned int current=0;
unsigned char speed=0;
unsigned char count=0;
unsigned char speed2_flag=0; //56mm运行
unsigned char speed3_flag=0; //快速返回标志
unsigned char speed4_flag=0;
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
void init(void);
void DelayMs(unsigned int number);
void key(void);
void init() //初始化程序
{
P0_4=0;
TMOD = 0x01; //T0 方式1
TH0 =0xff;
TL0 =0x00;
EA = 1;
ET0 = 1;
TR0 = 0;
}
void DelayMs(unsigned int number){
unsigned char temp;
for(;number!=0;number--) {
for(temp=112;temp!=0;temp--) {
}
}
}
main()
{
init();
while(1){
if(P0_0==0)
{
DelayMs(10);
if(P0_0==0)
{
if (current<20000)
{ P1_1=1; //正转
TR0=1;
}
else if (current==20000)
TR0=0;
}
}
else if(P0_1==0)
{
DelayMs(10);
if(P0_1==0)
P1_1=0; //反转
TR0=1;
}
else if(P0_3==0)
{ DelayMs(10);
if(P0_3==0)
step_number=5600+24*600; //迅速返回,然后进入点动模式
speed3_flag=1;}
}
}
timerint () interrupt 1 // T0 中断,产生CP
{
P1_0=!P1_0;
step_number--;
if (P1_1==1¤t<20000)
current++;
else if(P1_1==0¤t>0)
current--;
if(speed2_flag==1) //56mm运行区
{
if(step_number==5500)
{speed=0x7f;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==5400)
{speed=0x9f;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==5300)
{speed=0xbf;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==300)
{speed=0x9f;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==200)
{speed=0x7f;
TH0 = 0xff;
TL0 = speed;
}
}
//56mm运行区结束
if(speed3_flag==1) //快返运行区5600mm+24x6mm
{
if(step_number==19900)
{speed=0x7f;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==19800)
{speed=0xaf;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==19700)
{speed=0xcf;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==19600)
{speed=0xdf;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==19500)
{speed=0xee; //>ee not good
TH0 = 0xff;
TL0 = speed;
}
if(step_number==600)
{
speed=0xaf;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==400)
{
speed=0x7f;
TH0 = 0xff;
TL0 = speed;
}
if(step_number==300)
{
speed=0x0;
TH0 = 0xff;
TL0 = speed;
}
} //快返运行区结束
if(step_number==0)
{
TR0 = 0;
TH0 = 0xff;
TL0 = 0;
speed=0; //停止后速度为初最低,为了点动
step_number=600;
speed2_flag=0;
speed3_flag=0;
speed4_flag=0;
count++;
if(count==25)
{
count=0;
step_number=5600;
speed2_flag=1; //24X6后走56MM
}
}
else { //重送初植
TR0 = 1;
TH0 = 0xff;
TL0 = speed+0x0a; //去掉蚝时
}
}
__________________________
不怕不会,就怕不学 |
|