• 大小: 20KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-17
  • 语言: 其他
  • 标签: C51  PID  PWM  

资源简介

用51单片机写的PID算法控制电机的转身PWM。可以使用哈

资源截图

代码片段和文件信息

#include
/*********宏定义************/
#define uint unsigned int
#define uchar unsigned char
#define SYSCLK 24500000
#define Kp 3.0//比例系数
#define Ki 0.3//积分系数
#define Kd 200//微分系数
/**********特殊功能寄存器****************/
sfr16 TMR3RL=0x92;
sfr16 TMR3=0x94;
/**********变量定义************/
float N_target=10;//张力设定值
float N_real=0;//张力实际值
float PWM=0;
//bit flag;
//float Out[3]={000};
idata float diff[20]={00000000000000000000};//存放误差
idata float sum_diff=0; //误差累计
idata int Di=0;//数组坐标变量
idata float P_outI_outD_out;
//idata float pwm_0;
idata float temp;
/***********函数声明*************/
void PORT_Init(void);//端口初始化
void Oscillator_Init(void);//系统晶振设置
void PCA_Init(void);//PCA初始化
void Timer3_Init(void);//定时器3初始化
void Initial(void);//总初始化子函数
void Timer3_set(void);//定时器3设置,决定PID执行速率
void PID(void);//PID计算程序
void PID_to_TH(PWM);
//void PWM_set(void);//PWM占空比设置
void delay(uint t);//延迟函数
/************主函数部分**********************/
void main()
{
Initial();
delay(20);
Timer3_set();
EA=1;
EIE1=0x80;
PCA0CPH0=128;
while(1)
{
PID_to_TH(PWM);
}

}
/*************子函数*************************/
void Initial()
{
PORT_Init();
Oscillator_Init();
PCA_Init();
Timer3_Init();
}
void PORT_Init(void)
{
XBR1=0x45;//PCA四个模块连接到引脚
}
void Oscillator_Init(void)
{
OSCICN=0x87;//系统使用内部晶振,频率24500000,不分频
}
void PCA_Init(void)
{
PCA0CN=0x40;//允许PCA计数器/定时器
PCA0MD&=~0x40;//关闭看门狗
PCA0MD=0x08;//PCA时钟为系统时钟
PCA0CPM0=0xc2;//16位PWM输出
}
void Timer3_Init()
{
TMR3CN=0x04;//开启定时器3时钟为系统时钟的1/12
}
void Timer3_set()
{
unsigned long int tt;
tt=65536-(SYSCLK/12/1000)*20;
TMR3L=tt;
TMR3=tt;
}
void PID(void)
{
temp=diff[Di];
if(Di+1>=20)
Di=0;
else
Di+=1;
diff[Di]=N_target-N_real;
sum_diff+=diff[Di];
P_out=Kp*diff[Di];
I_out=Ki*sum_diff;
D_out=Kd*(diff[Di]-temp);
if(I_out>100)
I_out=100;
if(I_out<-100)
I_out=0;
PWM=P_out+I_out+D_out;
if(PWM<0)
    PWM=0;
    else if(PWM>=100)
    PWM=100;
}
void PID_to_TH(PWM)
{
PCA0CPH0=65536-65536*PWM;
}
void delay(uint t)
{
uint ij;
for(i=0;i {
for(j=0;j<300;j++);
}
}
void T3_zd() interrupt 14
{
TMR3CN&=0x7f;
PID();
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8985  2009-09-30 12:08  pid\PID_PWM

     文件       2417  2009-09-29 21:54  pid\PID_PWM.c

     文件       5512  2009-09-30 12:08  pid\PID_PWM.LST

     文件      13115  2009-09-30 12:08  pid\PID_PWM.M51

     文件       8639  2009-09-30 12:08  pid\PID_PWM.OBJ

     文件       1045  2009-09-30 15:41  pid\PID_PWM.Opt

     文件        325  2009-09-30 12:08  pid\PID_PWM.plg

     文件       2096  2009-09-25 20:22  pid\PID_PWM.Uv2

    .......      1046  2009-09-30 11:00  pid\PID_PWM_Opt.Bak

    .......         0  2009-09-25 11:39  pid\PID_PWM_Uv2.Bak

     文件       5115  2002-04-16 15:32  pid\STARTUP.A51

     文件      11763  2009-09-30 12:08  pid\STARTUP.lst

     文件        830  2009-09-30 12:08  pid\STARTUP.obj

     目录          0  2009-09-30 15:41  pid

----------- ---------  ---------- -----  ----

                60888                    14


评论

共有 条评论