8位单片机PID控制PWM的算法如何实现,C语言计算?

作者&投稿:纵钓 (若有异议请与网页底部的电邮联系)
PID C语言实现 输出量如何加到PWM上~

看你用到什么上,如果是四旋翼,要通过四个翼的方向来判断。如果是单纯的一个pwm的PID闭环系统,比如稳压恒流,电机恒速,那就直接将P+I+D部分输出给PWM就是了。比如MSP430的:CCR1=P+I+D; 这里的CCR1就是430脉宽。PID会自己通过测量到的实际值调整CCR1的值,也就是脉宽。

1. PID调试步骤
没有一种控制算法比PID调节规律更有效、更方便的了。现在一些时髦点的调节器基本源自PID。甚至可以这样说:PID调节器是其它控制调节算法的妈。
为什么PID应用如此广泛、又长久不衰?

因为PID解决了自动控制理论所要解决的最基本问题,既系统的稳定性、快速性和准确性。调节PID的参数,可实现在系统稳定的前提下,兼顾系统的带载能力和抗扰能力,同时,在PID调节器中引入积分项,系统增加了一个零积点,使之成为一阶或一阶以上的系统,这样系统阶跃响应的稳态误差就为零。
由于自动控制系统被控对象的千差万别,PID的参数也必须随之变化,以满足系统的性能要求。这就给使用者带来相当的麻烦,特别是对初学者。下面简单介绍一下调试PID参数的一般步骤:
1.负反馈
自动控制理论也被称为负反馈控制理论。首先检查系统接线,确定系统的反馈为负反馈。例如电机调速系统,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。其余系统同此方法。
2.PID调试一般原则
a.在输出不振荡时,增大比例增益P。
b.在输出不振荡时,减小积分时间常数Ti。
c.在输出不振荡时,增大微分时间常数Td。
3.一般步骤
a.确定比例增益P
确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
b.确定积分时间常数Ti
比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
c.确定积分时间常数Td
积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。
d.系统空载、带载联调,再对PID参数进行微调,直至满足要求。



2.PID控制简介

目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。同时,控制理论的发展也经历了古典控制理论、现代控制理论和智能控制理论三个阶段。智能控制的典型实例是模糊全自动洗衣机等。自动控制系统可分为开环控制系统和闭环控制系统。一个控制系统包括控制器、传感器、变送器、执行机构、输入输出接口。控制器的输出经过输出接口、执行机构,加到被控系统上;控制系统的被控量,经过传感器,变送器,通过输入接口送到控制器。不同的控制系统,其传感器、变送器、执行机构是不一样的。比如压力控制系统要采用压力传感器。电加热控制系统的传感器是温度传感器。目前,PID控制及其控制器或智能PID控制器(仪表)已经很多,产品已在工程实际中得到了广泛的应用,有各种各样的PID控制器产品,各大公司均开发了具有PID参数自整定功能的智能调节器(intelligent regulator),其中PID控制器参数的自动调整是通过智能化调整或自校正、自适应算法来实现。有利用PID控制实现的压力、温度、流量、液位控制器,能实现PID控制功能的可编程控制器(PLC),还有可实现PID控制的PC系统等等。 可编程控制器(PLC) 是利用其闭环控制模块来实现PID控制,而可编程控制器(PLC)可以直接与ControlNet相连,如Rockwell的PLC-5等。还有可以实现PID控制功能的控制器,如Rockwell 的Logix产品系列,它可以直接与ControlNet相连,利用网络来实现其远程控制功能。
1、开环控制系统
开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对控制器(controller)的输出没有影响。在这种控制系统中,不依赖将被控量反送回来以形成任何闭环回路。
2、闭环控制系统
闭环控制系统(closed-loop control system)的特点是系统被控对象的输出(被控制量)会反送回来影响控制器的输出,形成一个或多个闭环。闭环控制系统有正反馈和负反馈,若反馈信号与系统给定值信号相反,则称为负反馈( Negative Feedback),若极性相同,则称为正反馈,一般闭环控制系统均采用负反馈,又称负反馈控制系统。闭环控制系统的例子很多。比如人就是一个具有负反馈的闭环控制系统,眼睛便是传感器,充当反馈,人体系统能通过不断的修正最后作出各种正确的动作。如果没有眼睛,就没有了反馈回路,也就成了一个开环控制系统。另例,当一台真正的全自动洗衣机具有能连续检查衣物是否洗净,并在洗净之后能自动切断电源,它就是一个闭环控制系统。
3、阶跃响应
阶跃响应是指将一个阶跃输入(step function)加到系统上时,系统的输出。稳态误差是指系统的响应进入稳态后,系统的期望输出与实际输出之差。控制系统的性能可以用稳、准、快三个字来描述。稳是指系统的稳定性(stability),一个系统要能正常工作,首先必须是稳定的,从阶跃响应上看应该是收敛的;准是指控制系统的准确性、控制精度,通常用稳态误差来(Steady-state error)描述,它表示系统输出稳态值与期望值之差;快是指控制系统响应的快速性,通常用上升时间来定量描述。
4、PID控制的原理和特点
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。
比例(P)控制
比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
积分(I)控制
在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
微分(D)控制
在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。
5、PID控制器的参数整定
PID控制器的参数整定是控制系统设计的核心内容。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小。PID控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。现在一般采用的是临界比例法。利用该方法进行 PID控制器参数的整定步骤如下:(1)首先预选择一个足够短的采样周期让系统工作;(2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期;(3)在一定的控制度下通过公式计算得到PID控制器的参数。



3.PID控制器参数的工程整定,各种调节系统中PID参数经验数据以下可参照:

温度T: P=20~60%,T=180~600s,D=3-180s

压力P: P=30~70%,T=24~180s,

液位L: P=20~80%,T=60~300s,

流量L: P=40~100%,T=6~60s。



4. PID常用口诀:

参数整定找最佳,从小到大顺序查

先是比例后积分,最后再把微分加

曲线振荡很频繁,比例度盘要放大

曲线漂浮绕大湾,比例度盘往小扳

曲线偏离回复慢,积分时间往下降

曲线波动周期长,积分时间再加长

曲线振荡频率快,先把微分降下来

动差大来波动慢。微分时间应加长

理想曲线两个波,前高后低4比1

一看二调多分析,调节质量不会低
参考资料:http://www.yuanqijian.com/bbs/htmled_topic.php?topi_id=64489

PID控制在8位单片机中仍然有广泛的应用,比如温度控制,利用比例、积分、微分补偿来做恒温补偿控制,当然由于有这些数学处理,用C语言相对方便一些,以下是一个具体的实例。

#include<reg51.h>  

#include<intrins.h>  

#include<math.h>  

#include<string.h>  

struct PID {  

unsigned int SetPoint; // 设定目标 Desired Value  

unsigned int Proportion; // 比例常数 Proportional Const  

unsigned int Integral; // 积分常数 Integral Const  

unsigned int Derivative; // 微分常数 Derivative Const  

unsigned int LastError; // Error[-1]  

unsigned int PrevError; // Error[-2]  

unsigned int SumError; // Sums of Errors  

};  

struct PID spid; // PID Control Structure  

unsigned int rout; // PID Response (Output)  

unsigned int rin; // PID Feedback (Input)  

sbit data1=P1^0;  

sbit clk=P1^1;  

sbit plus=P2^0;  

sbit subs=P2^1;  

sbit stop=P2^2;  

sbit output=P3^4;  

sbit DQ=P3^3;  

unsigned char flag,flag_1=0;  

unsigned char high_time,low_time,count=0;//占空比调节参数  

unsigned char set_temper=35;  

unsigned char temper;  

unsigned char i;  

unsigned char j=0;  

unsigned int s;  

/***********************************************************  

延时子程序,延时时间以12M晶振为准,延时时间为30us×time  

***********************************************************/  

void delay(unsigned char time)  

{  

     unsigned char m,n;  

     for(n=0;n<time;n++)  

     for(m=0;m<2;m++){}  

}  

/***********************************************************  

写一位数据子程序  

***********************************************************/  

void write_bit(unsigned char bitval)  

{  

  EA=0;  

  DQ=0; /*拉低DQ以开始一个写时序*/  

if(bitval==1)  

{  

  _nop_();  

  DQ=1; /*如要写1,则将总线置高*/  

}  

 delay(5); /*延时90us供DA18B20采样*/  

 DQ=1; /*释放DQ总线*/  

_nop_();  

_nop_();  

EA=1;  

}  

/***********************************************************  

写一字节数据子程序  

***********************************************************/  

void write_byte(unsigned char val)  

{  

     unsigned char i;  

    unsigned char temp;  

    EA=0;  

    TR0=0;  

for(i=0;i<8;i++) /*写一字节数据,一次写一位*/  

{  

  temp=val>>i; /*移位操作,将本次要写的位移到最低位*/  

  temp=temp&1;  

  write_bit(temp); /*向总线写该位*/  

}  

  delay(7); /*延时120us后*/  

// TR0=1;  

  EA=1;  

}  

/***********************************************************  

读一位数据子程序  

***********************************************************/  

unsigned char read_bit()  

{  

unsigned char i,value_bit;  

EA=0;  

DQ=0; /*拉低DQ,开始读时序*/  

_nop_();  

_nop_();  

DQ=1; /*释放总线*/  

for(i=0;i<2;i++){}  

value_bit=DQ;  

EA=1;  

return(value_bit);  

}  

/***********************************************************  

读一字节数据子程序  

***********************************************************/  

unsigned char read_byte()  

{  

unsigned char i,value=0;  

EA=0;  

for(i=0;i<8;i++)  

{  

if(read_bit()) /*读一字节数据,一个时序中读一次,并作移位处理*/  

value|=0x01<<i;  

delay(4); /*延时80us以完成此次都时序,之后再读下一数据*/  

}  

EA=1;  

return(value);  

}  

/***********************************************************  

复位子程序  

***********************************************************/  

unsigned char reset()  

{  

unsigned char presence;  

EA=0;  

DQ=0; /*拉低DQ总线开始复位*/  

delay(30); /*保持低电平480us*/  

DQ=1; /*释放总线*/  

delay(3);  

presence=DQ; /*获取应答信号*/  

delay(28); /*延时以完成整个时序*/  

EA=1;  

return(presence); /*返回应答信号,有芯片应答返回0,无芯片则返回1*/  

}  

/***********************************************************  

获取温度子程序  

***********************************************************/  

void get_temper()  

{  

unsigned char i,j;  

do  

{  

   i=reset(); /*复位*/  

}  while(i!=0); /*1为无反馈信号*/  

     i=0xcc; /*发送设备定位命令*/  

   write_byte(i);  

   i=0x44; /*发送开始转换命令*/  

   write_byte(i);  

   delay(180); /*延时*/  

do  

{  

   i=reset(); /*复位*/  

}  while(i!=0);  

   i=0xcc; /*设备定位*/  

   write_byte(i);  

   i=0xbe; /*读出缓冲区内容*/  

   write_byte(i);  

   j=read_byte();    

   i=read_byte();  

   i=(i<<4)&0x7f;  

   s=(unsigned int)(j&0x0f);     //得到小数部分 

   s=(s*100)/16;  

   j=j>>4;  

   temper=i|j; /*获取的温度放在temper中*/  

}  

/*====================================================================================================  

Initialize PID Structure  

=====================================================================================================*/  

void PIDInit (struct PID *pp)  

{  

memset ( pp,0,sizeof(struct PID));    //全部初始化为0 

}  

/*====================================================================================================  

PID计算部分  

=====================================================================================================*/  

unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )  

{  

unsigned int dError,Error;  

Error = pp->SetPoint - NextPoint;          // 偏差     

pp->SumError += Error;                     // 积分     

dError = pp->LastError - pp->PrevError;    // 当前微分   

pp->PrevError = pp->LastError;     

pp->LastError = Error;  

return (pp->Proportion * Error             // 比例项     

+ pp->Integral * pp->SumError              // 积分项  

+ pp->Derivative * dError);                // 微分项  

}  

/***********************************************************  

温度比较处理子程序  

***********************************************************/  

void compare_temper()  

{  

unsigned char i;  

if(set_temper>temper)      //是否设置的温度大于实际温度 

{  

   if(set_temper-temper>1)  //设置的温度比实际的温度是否是大于1度 

  {  

   high_time=100;      //如果是,则全速加热 

   low_time=0;  

  }  

       else  //如果是在1度范围内,则运行PID计算 

  {  

    for(i=0;i<10;i++)  

  {  

    get_temper();   //获取温度 

     rin = s; // Read Input  

    rout = PIDCalc ( &spid,rin ); // Perform PID Interation  

  }  

    if (high_time<=100)  

      high_time=(unsigned char)(rout/800);  

    else  

          high_time=100;  

      low_time= (100-high_time);  

  }  

}  

else if(set_temper<=temper)  

{  

   if(temper-set_temper>0)  

  {  

    high_time=0;  

    low_time=100;  

  }  

   else  

  {  

     for(i=0;i<10;i++)  

   { 

         get_temper();  

         rin = s; // Read Input  

     rout = PIDCalc ( &spid,rin ); // Perform PID Interation  

   }  

     if (high_time<100)  

      high_time=(unsigned char)(rout/10000);  

       else  

      high_time=0;  

      low_time= (100-high_time);  

  }  

}  

// else  

// {}  

}  

/*****************************************************  

T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期  

******************************************************/  

void serve_T0() interrupt 1 using 1  

{  

if(++count<=(high_time))  

output=1;  

else if(count<=100)  

{  

output=0;  

}  

else  

count=0;  

TH0=0x2f;  

TL0=0xe0;  

}  

/*****************************************************  

串行口中断服务程序,用于上位机通讯  

******************************************************/  

void serve_sio() interrupt 4 using 2  

{  

/* EA=0;  

RI=0;  

i=SBUF;  

if(i==2)  

{  

while(RI==0){}  

RI=0;  

set_temper=SBUF;  

SBUF=0x02;  

while(TI==0){}  

TI=0;  

}  

else if(i==3)  

{  

TI=0;  

SBUF=temper;  

while(TI==0){}  

TI=0;  

}  

EA=1; */  

}  

void disp_1(unsigned char disp_num1[6])  

{  

unsigned char n,a,m;  

for(n=0;n<6;n++)  

{  

// k=disp_num1[n];  

 for(a=0;a<8;a++)  

 {  

     clk=0;  

  m=(disp_num1[n]&1);  

  disp_num1[n]=disp_num1[n]>>1;  

  if(m==1)  

   data1=1;  

  else  

   data1=0;  

   _nop_();  

   clk=1;  

   _nop_();  

 }  

}  

}  

/*****************************************************  

显示子程序  

功能:将占空比温度转化为单个字符,显示占空比和测得到的温度  

******************************************************/  

void display()  

{  

unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};  

unsigned char disp_num[6];  

unsigned int k,k1;  


k=high_time;  

k=k%1000;  

k1=k/100;  

if(k1==0)  

disp_num[0]=0;  

else  

disp_num[0]=0x60;  

k=k%100;  

disp_num[1]=number[k/10];  

disp_num[2]=number[k%10];  

k=temper;  

k=k%100;  

disp_num[3]=number[k/10];  

disp_num[4]=number[k%10]+1;  

disp_num[5]=number[s/10];  

disp_1(disp_num);  

}  

/***********************************************************  

主程序  

***********************************************************/  

void main()  

{  

unsigned char z; 

unsigned char a,b,flag_2=1,count1=0;  

unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2}; 

TMOD=0x21;  

TH0=0x2f;  

TL0=0x40;  

SCON=0x50;  

PCON=0x00;  

TH1=0xfd;  

TL1=0xfd;  

PS=1;  

EA=1;  

EX1=0;  

ET0=1;  

ES=1;  

TR0=1;  

TR1=1;  

high_time=50;  

low_time=50;  

PIDInit ( &spid );    // Initialize Structure  

spid.Proportion = 10; // Set PID Coefficients  比例常数 Proportional Const  

spid.Integral = 8;    //积分常数 Integral Const  

spid.Derivative =6;   //微分常数 Derivative Const  

spid.SetPoint = 100; // Set PID Setpoint 设定目标 Desired Value  

while(1)  

 {  

if(plus==0)  

 { 

EA=0;  

for(a=0;a<5;a++)  

for(b=0;b<102;b++){}  

if(plus==0)  

  { 

set_temper++;  

flag=0;  

  } 

 }  

else if(subs==0)  

  {  

for(a=0;a<5;a++)  

for(b=0;a<102;b++){}  

if(subs==0)  

{  

 set_temper--;  

 flag=0;  

}  

  }  

else if(stop==0)  

{  

     for(a=0;a<5;a++)  

    for(b=0;b<102;b++){}  

    if(stop==0)  

{  

   flag=0;  

   break;  

}  

   EA=1;  

}  

       get_temper();  

   b=temper;  

if(flag_2==1)  

  a=b;  

if((abs(a-b))>5)  

  temper=a;  

else  

  temper=b;  

  a=temper;  

  flag_2=0;  

if(++count1>30)  

{  

  display();  

  count1=0;  

}  

  compare_temper();  

}  

   TR0=0;  

   z=1;  

while(1)  

{  

    EA=0;  

if(stop==0)  

{  

     for(a=0;a<5;a++)  

    for(b=0;b<102;b++){}  

    if(stop==0)  

    disp_1(phil);  

// break;  

}  

EA=1;  

}  



能帮我设计一个用单片机控制PWM占空比再控制可控硅的开端的硬件及程序。如果有发至liu983580@163.com

直接配置单片机PWM输出的占空比就行了啊


如何用单片机PID去控制压力?
这个有很多例程,首先你要获取传感器的信号。然后还有设计好驱动方式,比如如何连续调节压力。这样才能通过误差信号连续调节输出。闭环调节好后,加入PID参数调节各种信号获取理想性能。

单片机中的PID算法是什么意思啊,有什么用途呢?谢谢!
PID算法是一种经典的控制算法.由比例\/积分\/微分组成.建议看看控制理论.PID就是比例积分微分控制,在工业里面应用非常广泛,据统计,现在有一半以上以上的工业系统直接应用PID控制.PID分模拟和数字,既然用到了单片机当然就得用数字了,另外PID还分理想,实际,微分先行,抗积分饱和等等,但都是在理想或者实际PID...

单片机pid算法控制步进电机的电路图和程序
int lunp,luni,lund; \/\/PID 校正值 int or; \/\/右轮给定值 int ren;int ren_1,ren_2;int ryn_1,ryn_2;int vr1,vr2; \/\/反馈右轮速度值(取样周期内的方波数)int rfz; \/\/运算后赋给PWM的值 int ryn,rynn;int run=0,run_1=0; \/\/偏差校正值 即校正PWM输出 int runp,runi,rund...

pid控制技术的概念?现在更多的是用在单片机上吗
PID控制就是“比例-积分-微分”控制。比例(P)控制 比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。积分(I)控制 在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入...

pid控制采样时间是单片机中断时间吗
不是。pid控制采样时间是单片机用采样时间来计算的,循环中断每次到100ms都扫描,但不进行运算,只有达到采样时间1s才进行运算。PID控制及其控制器或智能PID控制器(仪表)已经很多,产品已在工程实际中得到了广泛的应用。

单片机用PID控制可控硅,让电烤箱温度恒定的算法请教高手!
pid位置式算法,在温度比设定温度低x度时,用pd,当比设定温度低x度以内,用pid。可控硅部分,硬件用BTA26或者BT139(看加热器件的功率了),采用过零检测来确定过零点,用单片机的外部中断配合tmer,来控制开关时间。在pd和pid阶段,pid参数可能要用2套参数,自己实验吧,还有,你可以看一下,Ziegler-...

PID控制是什么意思?
PID控制器(比例-积分-微分控制器)是一个在工业控制应用中常见的反馈回路部件,由比例单元P、积分单元I和微分单元D组成。这个理论和应用的关键是,做出正确的测量和比较后,如何才能更好地纠正系统。PID(比例(proportion)、积分(integral)、导数(derivative))控制器作为最早实用化的控制器已有近百年...

stm32单片机温度控制pid代码
STM32的 PID和PWM墨水温度控制系统 控制方案: K_SENSOR热电偶作为温度传感器,50w电烙铁作为加温设备作为控制对象,预先设定一个温度值,微处理器为ARM公司... 查看全部>>

单片机能否实现PID控制?
可以,但编程算法会比较复杂,可以根据PID的算法公式为基础加以完善!!

单片机如何加pid算法去控制步进电机实现转速缓慢平稳精确控制
步进电机本身是一种开环控制(open loop),一般可以通过选择合适的步距角来决定需要的步进电机型号,通过改变脉冲个数和型号可以控制其转动的角度和速度。如果想要设计pid控制器,还需要选择合适的编码器来实现闭环控制,具体算法你应该通过百度得到,当然反馈的信号是角度了。

华坪县13195616517: PID控制电机的程序该怎么设计呀?PID调节PWM波.没这方面的思路 -
梅保因瑞: 首先,熟悉你所用的单片机或其他控制芯片的硬件资源和性能,确定好控制精度,然后将采样值PID通过算法转化为PWM的占空比输出.其实只要写个程序实现PID的计算式即可,e68a84e8a2ad3231313335323631343130...

华坪县13195616517: pid - PWM 温控pwm 利用pid算法 -
梅保因瑞: PID算法本身是很简单的,你随便找本讲PID的书,大胆的把公式抄上,肯定就能用.至于好用不好用的问题,在于另外两点, 第一是你用的参数的精度问题,如果你全部用浮点数来计算,当然不会出错,但程序可能会很大,可能大到你无法接...

华坪县13195616517: 基于单片机AT89c51的数字PID控制直流电机PWM调速系统C语言程序
梅保因瑞:首先弄清楚PID是一种控制算法!!! 1,“如果用单片机恒温可以使温度到达预定值就停止加热,低了就加热,用一个温度传感器反馈,这样算是一个自动控制吗”你这是控制系统,但是效果会非常差,尤其是对于温度控制这种大惯性系统,达...

华坪县13195616517: PID的计算公式 -
梅保因瑞: PID算法具体分两种:一种是位置式的 ,一种是增量式的. 位置式PID的输出与过去的所有状态有关,计算时要对e(每一次的控制误差)进行累加,这个计算量非常大,而明显没有必要.而且小车的PID控制器的输出并不是绝对数值,而是一个...

华坪县13195616517: 怎么用单片机产生PWM波形 -
梅保因瑞: 单片机产生PWM波形波形的方法: 主要是采用软件控制,控制2个时间. 具体就是由单片机的引脚输出PWM波形;单片机引脚 如P1.7 控制其输出高电平的时间T1 和输出低电平的时间T2. PWM波形的周期T=T1+T2 PWM波形的占空比=(100T1/T)% PWM波形实现的算法: 1 根据PWM波形的频率f,计算出PWM波形的周期T=1/f; 2 根据PWM波形的占空比 计算出高电平时间 T1=占空比*T 3 计算出低电平时间 T2=T-T1 4 按上述时间去控制 单片机引脚高低电平的时间就可以了. 呵呵 赶快自己写程序吧 别忘了给俺加分呀

华坪县13195616517: 改一下单片机控制PWM直流电机的程序 -
梅保因瑞: 单片机控制PWM直流电机的程序,具体如下:PWM控制直流电机实现上来说应该不难,最主要是要求:比如加速度,需要多块达到设定速度;一般来讲有“开环的查表法”和“闭环的采集实时速度法”;“开环查表”:前提是知道要达到的...

华坪县13195616517: 单片机中的PID算法 -
梅保因瑞: PID算法 下面对控制点所采用的PID控制算法进行说明. 控制点目前包含三种比较简单的PID控制算法,分别是:增量式算法,位置式算法,微分先行. 这三种PID算法虽然简单,但各有特点,基本上能满足一般控制的大多数要求. 1) PID增量...

华坪县13195616517: 怎样通过pid输出值来控制实际的系统 -
梅保因瑞: 用单片机阿 个人感觉这样比较方便 把pid程序写进单片机 然后用专门的控温驱动芯片 举个例子 比如MAX1968 然后单片机处理一下温度数据 在进行Pid处理 就可以输出一个模拟量给1968 1968就可以驱动加热器了 这样电路简单 控制和参数整定...

华坪县13195616517: 怎么实现用单片机控制的PWM发生电路 -
梅保因瑞: 这种电路主要是在单片机的程序,只要单片机有定时器,就可以利用CCR实现PWM输出,或是有PWM输出专用的模块也可以实现PWM输出.对后输出后的信号只需要根据需要加驱动电路就可以了,一般是半H桥居多.

华坪县13195616517: 如何用单片机产生PWM -
梅保因瑞: /*--------------- 文件名称: PWM.C 功能 :单片机脉冲方式产生PWM信号 ----------------*/ #include <reg52.h> // 引用标准库的头文件 #include <absacc.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int #define COUNT0 ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网