PID控制电机pid的程序该怎么设计呀?PID调节PWM波。没这方面的思路

查看: 18849|回复: 68
关于PID控制电机转速的问题!
我是刚接触PID的新手,看了很多PID的理论知识,有一点不明白。我是用位置式PID对电机进行调速。那个PID控制器的输入量和输出控制量是什么对应关系了?或者换句话说就是输入量是什么,输出控制量是什么.。输入量是速度的偏差,假如我设定转速时5m/s,实际转速是4m/s,那么偏差就是1m/s ,把这个偏差当做输入量送到PID控制器并进过计算的输出控制量与PWM如何对应,那个输出我怎么处理,难道直接就送给电机?PID运算出的控制量需经过映射到实际控制量从而实现对系统的调节,速度的偏差如何映射成PWM?
PID控制是一个讲求实践的学科,如果你刚刚开始学习PID,大可以在浏览了书本知识后,
暂时将这些内容忘在脑后,从一个最基本的原则开始,慢慢发现问题,思考问题,解决
问题,并总结和体会,最终你会从实践中真正学到什么是PID。
PID入门原则很简单:
假设你的支流电机上安装了一个带AB相的旋转编码器,并且你已经能够正确独取当前的
相对脉冲信号。那么尝试这么做:
1、先尝试将电机固定在某一个位置,即如果当前脉冲数大于一个目标脉冲数,就全速
& &反转,如果脉冲数小于这个目标脉冲数,就全速正转动;
2、以定长时间为单位,给目标脉冲数一个恒定增量,比如,每秒钟增加10个脉冲;观察
& &现象并体会;
3、尝试解决大幅度震东问题,先从简单的比例调节开始;
4、尝试以“打提前量”的思维方式,减小振动幅度;
5、在震荡收敛的前提下,尝试加入积分环节解决静差问题;并注意以上三个环节加入时
& &公式的符号。
6、用心体会,PID调节理论在多,关键是你自己体会到没有……对电机就要像自己身体的
& &一个部分一样,根据声音,发热程度,现象就能知道调节哪个参数。学习的过程中,要
& &大胆尝试,也要做好烧毁驱动电路的觉悟……我烧的MOS管都是论脸盆往外扔的……
谢谢你,傻孩子学长~~~我有点理解了,我明天就照你说的来慢慢学习~
学习了,我也在问同样的问题.
我也碰到这个问题,可控硅调压,检测的输出电压,PID计算结果要对应定时时间.
傻孩子学长,我照你说的第一步,我在外部中断对脉冲计数。
g_iPulesNumALl是存放编码器的脉冲数
*P_IOB_GPIO_SETUP = 0x是正转
& &if(g_iPulesNumAll&10000)
& && && &*P_IOB_GPIO_SETUP = 0x; //电机反转
电机反转一会,驱动电路就烧了,每次必烧。是不是给电机反转次数太多了,那么我上面那个if判断语句应该怎么改了?
如果你的电路如此脆弱,建议先改进驱动……否则你无法实现闭环驱动的……
请教Gorgon Meducer 傻孩子,我这几天搞可控硅调压真是找不到方向了,我是用于可控硅移相调压,就是过零后延时时间调整导通角,从而调压.在可控硅输出检测电压作为PID的输入量,PID部分程序我参照了本网站的程序,采用的浮点数,我运行了大概62个us,我就不理解,PID的输出量怎么和那个延时时间对应起来.谢谢!!
PID部分程序:
double& && &rO& && && && && && & //&&PID Response (Output)& &
double& && &rIn;& && && && && && &&&//&&PID Feedback (Input)&&
typedef struct PID {& &
& && &&&double&&SetP& && && &&&//&&设定目标 Desired Value& &
& && &&&double&&P& && && &//&&比例常数 Proportional Const& &
& && &&&double&&I& && && &&&//&&积分常数 Integral Const& &
& && &&&double&&D& && && &//&&微分常数 Derivative Const& &
& && &&&double&&LastE& && && & //&&Error[-1]& &
& && &&&double&&PrevE& && && & //&&Error[-2]& &
& && &&&double&&SumE& && && &&&//&&Sums of Errors& &
double PIDCalc( PID *pp, double NextPoint )//这里是位置式算法& &
& & double&&dError,& &
& && && && &E& &
& && &&&Error = pp-&SetPoint -&&NextP& && && & // 偏差,& &偏差=设定值-返回值
& && &&&pp-&SumError += E& && && && && && && & // 积分项, 偏差和& &
& && &&&dError = pp-&LastError - pp-&PrevE& &&&// 微分项&&上一次误差-上上一次误差& &
& && &&&pp-&PrevError = pp-&LastE& &
& && &&&pp-&LastError = E& &
& && &&&return (pp-&Proportion * Error& && && && &&&// 比例项& &
& && && && &+& &pp-&Integral * pp-&SumError& && && &// 积分项& &
& && && && &+& &pp-&Derivative * dError& && && && & // 微分项& &
& && &&&);& &
void PIDInit (PID *pp)& &
& & memset ( pp,0,sizeof(PID));& &
主程序对PID初始化:
& & PID& && && &sPID;& && && && && &&&//&&PID Control Structure& &
& & PIDInit ( &sPID );& && && && && & //&&Initialize Structure& &
& & sPID.Proportion = 2;& && && && &&&//&&Set PID Coefficients& &
& & sPID.Integral& &= 1;& &
& & sPID.Derivative = 1;& &
& & sPID.SetPoint& &= 200.0;& && && &&&//&&Set PID Setpoint&&
在过零脉冲来时做PID运算:
rOut = PIDCalc (&sPID,rIn);& &//&&Perform PID Interation
dingshishijian=rO&&
celiangzhi是测量的电压;dingshishijian是定时器新的延时时间
#define wsfw_c
#include &inttypes.h&
#include &avr/io.h&
#include &avr/interrupt.h&
#include &avr/signal.h&
#include &avr/wdt.h&
#include &avr/pgmspace.h&
#include &avr/eeprom.h&
#include &avr/delay.h&
#include &math.h&
#include &string.h&
#include &stdint.h&
#define BIT(x)& && &&&(1&&(x))& && && &&&
#define NOP()& && &&&asm(&nop&)
#define uint unsigned int
#define uchar unsigned char
#define N 7
#define Nw 7
volatile u
volatile uint value_bufw[Nw];&&
volatile uchar countw,kw,
volatile uchar&&i;&&
volatile uchar&&&&
volatile uint& &AD_RESULT;&&
volatile uchar yanshi1;
double& && &rO& && && && && && & //&&PID Response (Output)& &
double& && &rIn;& && && && && && &&&//&&PID Feedback (Input)&&
typedef struct PID {& &
& && &&&double&&SetP& && && &&&//&&设定目标 Desired Value& &
& && &&&double&&P& && && &//&&比例常数 Proportional Const& &
& && &&&double&&I& && && &&&//&&积分常数 Integral Const& &
& && &&&double&&D& && && &//&&微分常数 Derivative Const& &
& && &&&double&&LastE& && && & //&&Error[-1]& &
& && &&&double&&PrevE& && && & //&&Error[-2]& &
& && &&&double&&SumE& && && &&&//&&Sums of Errors& &
void delay( )
NOP();NOP();NOP();NOP();NOP();NOP();NOP();
void ADS8320_READ( )
celiangzhi=
& && && &&&
& && && && && & }
double PIDCalc( PID *pp, double NextPoint )//这里是位置式算法& &
& & double&&dError,& &
& && && && &E& &
& && &&&Error = pp-&SetPoint -&&NextP& && && & // 偏差,& &偏差=设定值-返回值
& && &&&pp-&SumError += E& && && && && && && & // 积分项, 偏差和& &
& && &&&dError = pp-&LastError - pp-&PrevE& &&&// 微分项&&上一次误差-上上一次误差& &
& && &&&pp-&PrevError = pp-&LastE& &
& && &&&pp-&LastError = E& &
& && &&&return (pp-&Proportion * Error& && && && &&&// 比例项& &
& && && && &+& &pp-&Integral * pp-&SumError& && && &// 积分项& &
& && && && &+& &pp-&Derivative * dError& && && && & // 微分项& &
& && &&&);& &
void PIDInit (PID *pp)& &
& & memset ( pp,0,sizeof(PID));& &
int main(void)
& & DDRA&&= 0xFF;
& & DDRE&&= 0xFF;PORTE=0x00;
& & DDRD=0x00;&&PORTD=0x00;
& && &&&DDRC=0& && &&&PORTC=0x00;//0xe7;
& & DDRF=0& && &&&//PORTF=0
& && &&&DDRG=0
& && &&&PORTG|=(1&&PG3);
& && &&&//PORTG&=~(1&&PG3);
& && &&&/*******串口1采集数据********/
& && &&&UCSR1B = 0x00;
& && &&&UCSR1A = 0x00;
& && &&&UCSR1C = 0x06;
& && &&&UBRR1L = 0x33;
& && &&&UBRR1H = 0x00;
& && &&&UCSR1B = 0x98;
& & /*******串口1采集数据*********/
& && &&&EICRA=0x0f;//0x0a;//0x0f;
& && &&&EICRB=0x00;
& && &&&EIMSK=0x03;
& && && && && && && && && && &
& && &&&MCUCR&&= 0x00;
& && &&&MCUCSR = 0x80;//禁止JTAG
& & PID& && && &sPID;& && && && && &&&//&&PID Control Structure& &
& & PIDInit ( &sPID );& && && && && & //&&Initialize Structure& &
& & sPID.Proportion = 2;& && && && &&&//&&Set PID Coefficients& &
& & sPID.Integral& &= 1;& &
& & sPID.Derivative = 1;& &
& & sPID.SetPoint& &= 200.0;& && && &&&//&&Set PID Setpoint& &
& && && &sei();//开全局中断
& &&&wdt_enable(WDTO_2S);
wdt_reset();& && && &&&//喂狗&&
ADS8320_READ( );
& && && && &&&
SIGNAL(SIG_OVERFLOW1)
TCCR1B=0x00;
TIMSK=0x00;
TCNT1H = 0x00;&&
TCNT1L = 0x00;//初始值
PORTG&=~(1&&PG3);//可控硅导通
asm(&nop&);asm(&nop&);asm(&nop&);asm(&nop&);
asm(&nop&);asm(&nop&);asm(&nop&);asm(&nop&);
asm(&nop&);asm(&nop&);asm(&nop&);asm(&nop&);
asm(&nop&);asm(&nop&);asm(&nop&);asm(&nop&);
PORTG|=(1&&PG3);//可控硅不导通
SIGNAL(SIG_INTERRUPT0)
&&PID& && && &sPID;& && && && && && & //&&PID Control Structure& &
//EIFR=EIFR|0x01;
rOut = PIDCalc (&sPID,rIn);& &//&&Perform PID Interation
dingshishijian=rO& &
TCNT1H = (dingshishijian-1)/256;&&
TCNT1L = (dingshishijian-1)%256;//初始值&&
TCCR1A=0x00;
TCCR1B=0x02;
//TCCR1C=0x80;
TIMSK=0x04;
SIGNAL(SIG_INTERRUPT1)
&&PID& && && &sPID;& && && && && && & //&&PID Control Structure& &
//EIFR=EIFR|0x02;
rOut = PIDCalc (&sPID,rIn);& &//&&Perform PID Interation
dingshishijian=rO& &
TCNT1H = (dingshishijian-1)/256;&&
TCNT1L = (dingshishijian-1)%256;//初始值&&
TCCR1A=0x00;
TCCR1B=0x02;
TIMSK=0x04;
我将定时时间做到了1个us,半波10ms,最大10*1000us.过零信号是10ms来一次.我的程序是10ms做一次PID运算.
我习惯使用的PID调节算法和你上面提供的思路不同……
傻孩子学长是不是把PID控制器的输出量当成一个恒量送到设定的目标脉冲数去?
那么PID控制器的输出量是送到什么地方去的?学长能给段代码参考下吗?
代码在我另外一个帖子里面都给出来了。
/bbs/bbs_content.jsp?bbs_sn=827436&bbs_page_no=1&bbs_id=1005
这个代码只用了简单地P调解,但是基本构架已经很明确了,很容易修改为完整的PID系统。
傻孩子学长,不知道我的理解对不对。
& &&&控制器的输入量是脉冲个数的偏差,那么经过PID控制器的计算得到的输出量当做是当前PWM占空比的改变量。
& && &打个比方,比如说输入电压r(t)为0-5V,对应的输出转速信号y(t)的范围为0-5000r/min,那么PID控制器中的比例项是不是输入电压r(t)和转速y(t)之间的比例关系的系数k=1/1000。。。。
& &&&或者是这个比列系数K和PID控制器中的比列项没有关系,必须先将转速转换为电压,再把电压当做输入量送入到PID控制器进行计算得到控制量,也就是说输入和输出必须是相同的物理量。
& & 偏差经过控制器的计算得到的控制量是电压的该变量,并被附加到当前的电压上。
to 【13楼】 mtlegolas&&
& & 和电压有什么关系……
& & 你的理解有一点小问题,不是“当前PWM暂空比的改变量”而就是“当前的暂空比”
& & 控制器的输入量是脉冲个数的偏差,那么经过PID控制器的计算得到的输出量当做是当前PWM占空比。
to 【14楼】 Gorgon Meducer 傻孩子
直接用电压来控制电机转速
输入电压r(t)为0-5V,对应的输出转速信号y(t)的范围为0-5000r/min。
如果PID控制器的输入量是转速的偏差话,那么PID控制器中的比例项是不是输入电压r(t)和转速y(t)之间的比例关系的系数k=1/1000。。。。
& &&&或者是这个比列系数K和PID控制器中的比列项没有关系,必须先将转速转换为电压,再把电压当做输入量送入到PID控制器进行计算得到控制量,也就是说输入和输出必须是相同的物理量。
& &&&还是输入量是转速的偏差,比例项和PID控制器中的比列项没有关系,也不用转换电压。。。直接把输出量送到电机
不知道这几种种理解哪种是对的
to 【15楼】 mtlegolas
& & 我实现的PID系统不是基于转速闭环的,而是基于位置闭环,在位置闭环基础上叠加一个速度而以。
所以我们讨论的概念不同。我的PID系统输入是一个脉冲,而不是转速的偏差,输出是一个拥有电机方向
属性的PWM值。
to 【16楼】 Gorgon Meducer 傻孩子:
你是在伺服驱动器外做的速度环吗?
否则,要实现一个位置环,其内部必有一个速度环,要实现一个速度环,其内部必有一个电流环
谁说实现一个位置环,内部必须有一个速度环……
我就是先做位置环,然后直接叠加一个速度控制……
准确说,和LM629的算法是碰巧一致的。
好文章。标记
严重关注PID的速度环。
关注PID,学习
带速度和电流PID反馈的直流无刷电机的硬件电路是怎么设计的啊???
Gorgon_Meducer 发表于
to 【13楼】 mtlegolas&&
& & 和电压有什么关系……
& & 你的理解有一点小问题,不是“当前PWM暂空比的改变 ...
您好!看了帖子!感觉你对PID算法很了解,有没有小车PID算法的源程序发个给我呀!邮箱是谢谢了
记忆? 发表于
您好!看了帖子!感觉你对PID算法很了解,有没有小车PID算法的源程序发个给我呀!邮箱是谢谢了 ...
快4年前的东西了……手边已经没有了。
看了你们讨论还是有收获的
Gorgon_Meducer 发表于
谁说实现一个位置环,内部必须有一个速度环……
傻孩子大哥,真的好欣赏你的耐心解答!
Gorgon_Meducer 发表于
代码在我另外一个帖子里面都给出来了。
/bbs/bbs_content.jsp?bbs_sn=827436&bbs_page ...
代码能重新发一遍吗,现在贴子没了,还有就是问下&&尝试以“打提前量”的思维方式,减小振动幅度;& &,提前量指的是?
sirriam 发表于
代码能重新发一遍吗,现在贴子没了,还有就是问下&&尝试以“打提前量”的思维方式,减小振动幅度;& &, ...
4年前的东西了……代码我也没有了……提前量这里说的不好,其实就是PID的D,其感觉就有点像电感……
哦,知道了,谢谢
谢谢 获益匪浅
mark THANKY YOU
Gorgon_Meducer 发表于
4年前的东西了……代码我也没有了……提前量这里说的不好,其实就是PID的D,其感觉就有点像电感…… ...
大哥,我想问问包含速度环和位置环的电机控制这样设计对不对:用一个pid调一个速度环,再用一个pid实现位置环,然后把速度环输出当作位置环输入,这样对吗?谢谢~
jiuyouyun 发表于
大哥,我想问问包含速度环和位置环的电机控制这样设计对不对:用一个pid调一个速度环,再用一个pid实现位 ...
这样可以的,但是反过来也许更容易一点。
Gorgon_Meducer 发表于
这样可以的,但是反过来也许更容易一点。
反过来?什么意思?麻烦说具体点~
jiuyouyun 发表于
反过来?什么意思?麻烦说具体点~
先做一个位置环,然后利用位置环来实现速度环……
为什么这么做呢,假设我们已经有了一个位置环,我们叫电机转到哪里,它就转到哪里,而且特性还很硬。
在这个基础上,我们只要以一个固定的周期修改位置环的目标位置,电机就会转起来……因为目标位置是以
固定周期来修改的,通过控制增量,就可以精确的控制速度——这是位置环在微观时间内保证的——如果增量
还不是一个常数,那么你甚至可以加入加速度的概念——这其实就是微分了。
Gorgon_Meducer 发表于
先做一个位置环,然后利用位置环来实现速度环……
为什么这么做呢,假设我们已经有了一个位置环,我们叫 ...
感谢你热心回复~你的原理说的非常明白,我都看懂了。我还想问问,我的控制的最终目标是精确的位置,内嵌一个速度环也是为了更好地控制位置,那为了得到特性很硬的位置控制,是不是可以先弄一个速度环出来?然后在速度环后面加上一个位置环?非常感谢~~
jiuyouyun 发表于
感谢你热心回复~你的原理说的非常明白,我都看懂了。我还想问问,我的控制的最终目标是精确的位置,内嵌 ...
精确位置不是靠速度环来实现的,位置环自己就可以做出精确的位置。如果你的电机有减速器,如果减速比比较大,或者
旋转编码器的线数比较高,根本不用担心你说的精确位置的问题,你可以算一算,一个线数的误差对应实际外部的输出距离
是多少。对于位置环,简单的 P就可以达到目的了,加入I算法以后可以减少静差——如果你想降低系统的发热,以及齿轮的
磨损,可以加入D
Gorgon_Meducer 发表于
先做一个位置环,然后利用位置环来实现速度环……
为什么这么做呢,假设我们已经有了一个位置环,我们叫 ...
你好,我也需要要实现一个PID位置环控制伺服电机,看了帖子之后还是似懂非懂所以在此请教一下。我现在需要在开发板实现一个位置环然后经过D/A转换输出模拟量给伺服驱动器控制伺服电机运动。假设我需要控制一个轴走10cm, 这个10cm怎么给定?假设 一个脉冲走1mm的话,这个值就对应100个脉冲? 是不是每个定时周期内以一定步长给定一个位置量?就是说第一个周期给 1mm 第二个2mm 第三次给3mm ...10cm ,然后采集编码器返回的脉冲与给定位置对应的脉冲求差值,经过PID运算输出控制量。这个控制量是什么?怎么通过D/A转换给伺服驱动器作为伺服驱动器速度环的输入?自己这两天看资料有点晕,问题表达的不好,希望见谅。
gunny 发表于
你好,我也需要要实现一个PID位置环控制伺服电机,看了帖子之后还是似懂非懂所以在此请教一下。我现在需 ...
控制量和测量量往往随着系统的不同而不同,在前面的讨论中,我们默认控制量是电压——也就是PWM,与你的DA没什么不同,
但是测量量取决于你接的传感器了,前面的讨论中默认你接的是旋转编码器。我不知道你接的什么传感器,但是传感器直接决定
了的算法。
Gorgon_Meducer 发表于
控制量和测量量往往随着系统的不同而不同,在前面的讨论中,我们默认控制量是电压——也就是PWM,与你的D ...
传感器就是伺服电机自带的旋转编码器
gunny 发表于
传感器就是伺服电机自带的旋转编码器
如果是旋转编码器,那么旋转的距离或者说角度就和旋转编码器一圈的线数,有没有倍频(1/2/4),有没有减速器,减速器的减速比是多少。
如果你想对应的是距离而不是角度,那么还要看你轮子的直径是多少……
Gorgon_Meducer 发表于
如果是旋转编码器,那么旋转的距离或者说角度就和旋转编码器一圈的线数,有没有倍频(1/2/4),有没有减 ...
这是结构图,关于位置信息如何给定?进行PID运算,输出控制量经D/A输出模拟电压到驱动器,请您能不能详细说一下?假设编码器转一圈反馈1000个脉冲好了,对应10cm距离,10ms中断采集一次编码器反馈的脉冲(位置量)
本帖子中包含更多资源
才可以下载或查看,没有帐号?
gunny 发表于
这是结构图,关于位置信息如何给定?进行PID运算,输出控制量经D/A输出模拟电压到驱动器,请您能不能详细 ...
控制信息还不够,D/A信息如何控制电机的?因为电机实际上有正转,反转,自由,和制动 四个控制状态,单纯的电压信息
不借助别的信号辅助通常无法做到完整的电机控制。
楼主,你能不能抽空写本关于PID控制电机的书,不需要高深的理论,完整详细的介绍你自己的一个例子就行,一步一步的;
其实很多人都想学这个,但市面上的书几乎都是讲理论的。如果你知道有什么好资料的话,麻烦推荐给大家吧。
PID控制是一个讲求实践的学科,如果你刚刚开始学习PID,大可以在浏览了书本知识后,
暂时将这些内容忘在脑 ...
帮忙看看这个帖子,关于PID的疑问,谢谢~
楼主,你能不能抽空写本关于PID控制电机的书,不需要高深的理论,完整详细的介绍你自己的一个例子就行,一 ...
写错了,应该是问傻孩子的,问版主。
标记,正在感性认识pid中
如果是旋转编码器,那么旋转的距离或者说角度就和旋转编码器一圈的线数,有没有倍频(1/2/4),有没有减 ...
傻孩子兄,我现在调的电机需要外部可以设定速度,但是又需要快速停准。因为负载在变,现在是速度环+电流环在跑,可以做到快启快停,但是最后的停准就麻烦了,现在是位置开环,我们的精度不高,停止位+-15°就可以了,而且每次都停这里,只要停准即可,请问需要加位置环么?但是加了位置环,速度的调节貌似就不成了。如果位置开环,又很难听得准,请问有啥好方法么?
傻孩子兄,我现在调的电机需要外部可以设定速度,但是又需要快速停准。因为负载在变,现在是速度环+电流 ...
你这种情况最适合先实现位置环,然后利用位置环来构建速度(注意不是速度环,而是构建速度)
假设你已经有位置环了,那么你思考,周期性的以固定的增量来修改位置,是不是就获得速度了呢?
你这种情况最适合先实现位置环,然后利用位置环来构建速度(注意不是速度环,而是构建速度)
假设你已经 ...
请问速度环调节方式是怎样呢?需要加入PID么?如果是,是将制定的信号数作为参考,将反馈的信号数作为反馈,不需要其他环(如速度环搭配)直接输出占空比么?
你这种情况最适合先实现位置环,然后利用位置环来构建速度(注意不是速度环,而是构建速度)
假设你已经 ...
好吧,我刚才试了一下,单个位置环好像不好调,可能是我调的不好,但是加上速度环(参数之前已整定)感觉就定位挺准的了
好吧,我刚才试了一下,单个位置环好像不好调,可能是我调的不好,但是加上速度环(参数之前已整定)感觉 ...
我觉得你曲解了我的意思。单独的位置环就足够了。我不清楚为什么你的位置环不好调。
从原理上来说,位置环是最简单的,不像速度环还存在不同速率下速度测量的量程和精度
问题。位置环借助一个旋转编码器配合简单的P算法就可以做的有模有样,加入D和I则更好
能有效消除震荡,发热,噪音和静差问题。
我觉得你曲解了我的意思。单独的位置环就足够了。我不清楚为什么你的位置环不好调。
从原理上来说,位置 ...
谢谢傻孩子多日的细心回复。主要我没说清楚,我只看到了对我有用的部分。我做的电机数百W,6krpm额定速度,对速度和负载要求比较多,需要加减速块,
对负载响应的速度也要快。我现在加减速可以调的不错,但是减速快了之后位置就停不准了,所以想加位置环(简易)。但是如果只有单纯的位置环,估计很
难达到要求,或者说以我的水平很难单纯用位置环做到以上要求。我现在的想法是减速到一定速度,然后加入位置环,在接近停靠位置,直接将电机锁在那个
角度。傻孩子觉得我的方法是否合理,或者有什么好的建议呢
本帖最后由 Gorgon_Meducer 于
10:30 编辑
谢谢傻孩子多日的细心回复。主要我没说清楚,我只看到了对我有用的部分。我做的电机数百W,6krpm额定速度 ...
那你可以直接先调一个单纯的位置环出来看看效果,完成以后你可以有两个选择:
1、使用我前面说的利用位置环来实现速度——速度其实是位置环在宏观上的现象,其实加速度和速度都很好控制
& &&&因为速度是单位时间内位置的增量,而加速度是单位时间内速度的增量
& &&&比如你实现了一个50Hz中断,以及一个位置环,任意时刻你可以通过SetPosition来设定目标位置,则
& &&&static int32_t s_lSpeed = 0;
& &&&int32_t GetSpeed(void)
& &&&{
& && && &int32_t lR
& && && &SAFE_ATOM_CODE(
& && && && & lResult = s_lS
& && && &)
& && && &return lR
& &&&}
& & void SetSpeed(int32_t lSpeed)
& & {
& && &&&SAFE_ATOM_CODE(
& && && && &s_lSpeed = lS
& && &&&)
& & }
& &&&static int32_t s_lAcceleration = 0;
& &&&int32_t GetAcceleration(void)
& &&&{
& && && &int32_t lR
& && && &SAFE_ATOM_CODE(
& && && && & lResult = s_lA
& && && &)
& && && &return lR
& &&&}
& &&&ISR(Timer_OVF_vect) {
& && && &int32_t lCurrentPosition = GetPosition();& && && && && && &//!& 获取当前的目标位置
& && && &int32_t lSpeed = GetSpeed();& && && && && && && && && && &&&//!& 获取当前的速度
& && && &int32_t lAcceleration = GetAcceleration();& && && && && & //!& 获取当前加速度
& && &&&
& && && &lSpeed += lA& && && && && && && && && && && && && & //!& 更新速度
& && && &SetSpeed( lSpeed );& && && && && && && && && && && && && && &
& && && &
& && && &lCurrentPosition += lS
& && && &
& && && &SetPosition( lCurrentPosition );& && && && && && && && && && &&&//!& 设置新的目标位置
& &&&}
复制代码
2、按照你的设想,在接近目标的时候,并且速度在一定范围内时由位置环切换到速度环
你好,我也需要要实现一个PID位置环控制伺服电机,看了帖子之后还是似懂非懂所以在此请教一下。我现在需 ...
你好,看你12年的贴子遇到一个STM32+HT1621 关于VLCD的问题,想问一下,STM32 3.3V,但HT1621 VLCD想用5V的情况,QQ2 7 5270136
pid的积分量是电机的惰性
PID是电工必备的知识
一般帖子我不回复&&顶顶
学习了。谢谢!
用过只有一个信号的编码方式控制速度,用的可控硅移相方式,目标是直流电机,效果一般
阿莫电子论坛, 原"中国电子开发网"直流电机pid调速控制系统分析设计_电子元器件_中国百科网
直流电机pid调速控制系统分析设计
    摘要:本文利用altera公司的fpga芯片ep2c35f672c6作为系统,采用数字pid算法对直流电机进行pwm闭环调速控制。并且利用硬件描述语言(vhdl)自行设计、生成pwm模块和测速模块,最后通过实验验证了该系统的可行性。关键字:fpga芯片,系统控制器,直流电机以往的直流电机调速系统通常采用单片机或dsp进行控制,而单片机需要使用大量的外围电路,且系统的可升级性差,如更换控制器,往往要对整个软硬件进行重新设计,可重用性不高。而采用dsp作为主要控制器,如果碰到处理多任务系统时,一片dsp不能胜任,这时就需要再扩展一片dsp或者fpga芯片来辅助控制,从而实行双芯片控制模式。但这样做,既增加了两个处理器之间同步和通信的负担,又使系统实时性变坏,延长系统开发时间。基于以上此类问题,本文提出了采用altera公司推出的nios软核来控制直流电机调速系统,它的好处在于ni-os属于软核处理器,可以直接通过软件形式扩展成双核乃至多核,无需外加芯片;再者nios软核处理器和所有外围电路可以集成到一片fpga芯片上来实现整个直流电机控制系统,这样无疑大大减小了控制器体积和重量,设计人员也可以在短时间内完成整个系统的制作,提高了工作效率。本文利用altera公司的fpga芯片ep2c35f672c6作为系统控制器,采用数字pid算法对直流电机进行pwm闭环调速控制。并且利用硬件描述语言(vhdl)自行设计、生成pwm模块和测速模块,最后通过实验验证了该系统的可行性。1 系统硬件设计1.1 系统总体设计方案选用altera公司的de2开发板作为开发平台,采用sopc技术通过在fpga中植入嵌入式系统处理器nios作为核心控制电路,利用fpga中的可编程逻辑资源和ip软核来构成该嵌入式系统处理器的接口功能模块,借助于avalon总线,实现对外围pwm模块、测速模块、sdram、键盘等硬件的控制,fpga通过avalon总线对输入模块和输出等模块进行配置,整体功能框图如图1所示。整个系统的主要工作流程如下:当系统启动完成各单元初始化后,通过键盘输入期望设定值,同时由光电编码器采集实测转速传输到测速模块,通过nios处理器处理电机pid控制算法,并将计算后的数据传输给自定制的pwm模块对其进行闭环控制。最后在nioside上采集到实际输出数据,并通过matlab软件画出控制曲线波形图,最后对实验结果进行分析。1.2 pwm模块系统中的自定制pwm模块是通过写vhdl代码,经过仿真、编译、管脚分配,最后生成pwm功能模块。它在整个系统中的作用是:对实测转速通过计算进行闭环控制。生成的pwm模块如图2所示。图2中:clk为时钟信号端;sta用来控制直流电机正反转;conword为占空比信号;pwm_a表示直流电机处于正转状态时的占空比输出;pwm_b表示直流电机处于反转时的占空比输出。pwm模块的原理如下:将时钟源50 mhz的基频信号64分频,作为pwm模块的基频信号,以256个该基频脉冲信号作为pwm输出的一个周期,由nios处理器给出的conword的值指定一个pwm周期内高电平持续时间,改变conword的值即刻改变占空比输出的值。1.3 测速模块系统中的测速模块生成方式如pwm模块,它在整个系统中的作用如下:主要是利用基频的周期来计算光栅信号的周期,算出直流电机的转速,其生成的模块如图3所示。图3中:clk为时钟信号端;en为使能信号,即表示光栅有效;dout表示光橱有效时间。测速模块的原理如下:给出已知频率的基频,用光栅作为门限,测基频脉冲的个数,由基频的周期来计算光栅信号的周期,再算出转速,电机控制算法即根据测速模块测出的速度进行算法调整,达到闭环控制的效果。2 系统软件设计本次设计的软件主要分为两部分:(1)利用quartus7.2完成nios系统的构建:利用sopc builder构建使用vhdl编写各控制模块。(2)利用nioside完成系统控制与控制算法编写,主要使用c语言进行控制与算法编写;对直流电机进行成功控制后,在nioside上采集输出转速的实测数据,将其导入matlab画出控制效果图,整体软件框图如图4所示。本次设计使用sopc builder组建的nios嵌入式系统,如图5所示。该系统除了配置nios最小系统的cpu核niosii cpu,avalon总线,使用fpga资源例化的存储器之外,还有以下外接的控制单元:(1)(2)co(3)(4)锁相环(5)(6)通用i/o接口,包括pwm模块接口conw,msta和测速模块接口speed,按钮接口button。对于sopc builder组建的nios系统,可以在quartus软件方便地调用,在quartus中block diagram设计调用nios系统的框图如图6所示。给该系统配备工作时钟,并分配fpga的i/o管脚,程序经综合,布局,仿真之后,就可将配置文件通过各种配置方法下载到fpga上。本文使用jtag+as方式配置,通过usb blaster下载电缆线将计算机usb接口与fpga的jtag口相连,把配置文件从计算机下载到fpga中,这样就完成了系统的软件设计。3 实验与数据分析3.1 测试系统测试系统由一个额定电压为2.5 v的直流有刷电机和altera公司的de2开发板组成。电机相关技术指标为:额定电压为2.5 v,额定功率为o.065 w,额定转速为2 150 r/min,空载转速为2 650 r/min。整个测试系统的硬件结构图如图1中所示,其工作流程在前文中有详细介绍。3.2 实验结果及分析将直流电机增量式pid算法以c语言的形式写入nioside中,调试后将其采集到的实测数据导入matlab,画出时间与转速之间的关系图形如图7~图9所示。(1)比例(p)控制取采样周期t=0.1 s,kp=0.5,实验结果如图7所示。在p控制中,比例环节的作用是对偏差作出快速响应,kp,越大,控制能力越强,但跟过大的kp会增大超调量,另外比例环节可以减少稳态误差,但不能完全消除。从图7中可以看出比例环节使得电机的转速从零提升到设定值的过程比较快,但出现了比较明显的超调,且存在一定的稳态误差。(2)比例积分(pi)控制取采样周期t=o.1 s,kp=0.5,t1=2,实验结果如图8所示。在pi控制中,积分环节的作用的是消除累计下来的偏差(即稳态误差),在控制过程中,只要有偏差存在,积分环节的输出就不断增大,直到偏差为零,输出才可能稳定在某一值上。但积分环节会降低响应速度,增加超调量,t1越大,积分作用越弱。从图8中可以看出,在比例环节上加上积分环节,先前的稳态误差得到消除,电机转速趋于设定值,但同时也增加了另一段超调量。(3)比例积分微分(pid)控制取采样周期t=0.1 s,kp=0.5,t1=2,td=0.1,实验结果如图9所示。在pid控制中,微分作用是根据偏差的变化趋势进行控制的,偏差变化得越快,微分环节输出就越大,并且能在偏差值变大前进行修正。微分环节有利于减小超调量,克服振荡,td越大,微分作用越大。从图9中可以看出,加入微分环节后,超调量明显得到有效抑制。从图7~图9中可以看出,用pid控制算法控制基于nios的直流电机控制效果还是不错的,有一定的稳定性,即便在转速出现跳变时,也能进行良好的跟踪。pid控制算法已经相当成熟,参数可以通过整定很容易得到,实验表明,此方案具有一定的可行性。4 结语提出一种直流电机的新型控制方式,即利用nios软核和fpga芯片对其控制。通过实验验证,将pid增量式算法应用到此系统中,能进行良好的闭环控制。在电机控制中如遇更复杂的电机,如无刷电机等,用nios软核进行控制,可以将其扩展为双核乃至多核,一个cpu用来控制算法,另一个cpu用来控制外围系统,互不干扰,发挥nios处理器的最大优势。
收录时间:日 14:01:55 来源:元器件交易网 作者:有0人参与
上一篇: &(&&)
创建分享人
喜欢此文章的还喜欢
Copyright by ;All rights reserved. 联系:QQ:

我要回帖

更多关于 电机pid 的文章

 

随机推荐