资源简介
用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
- 上一篇:汽车车牌字体_包括中文数字字母
- 下一篇:USB在FPGA上的实现源码
相关资源
- 经典的电机的速度PID控制程序.rar
- 数字pid与开关电源
- PCS7-PID调节块使用详解.pdf
- AT89c51单片机流水灯
- STM8S PWM和蜂鸣器的实验代码
- 51单片机中用PWM控制LED亮度调节
- 28BYJ-48步进电机(51单片机)
- 模糊控制与传统PID控制比较
- 基于STC89C51的CAN总线点对点通信模块设
- 89C51双机通信proteus仿真
- PID在LabView中的实现
- 基于c51的音乐播发编程proteus仿真
- stc89c52 智能小车五路循迹程序
- PID-小车类-PID算法控制小车直线行驶制
- 基于AT89C51单片机的篮球比赛记分牌设
- 基于汇编程序AT89C51八路抢答器
- proteus仿真max7219的使用方法
- 单片机PWM调速程序
- 倒立摆 51PID程序 已经实现
- PWM整流技术
- ABBasc510变频器 GSD文件
- STM8S输出PWM控制模拟舵机+MPU6050陀螺仪
- qt 内建PID模拟仿真
- PWM的FPGA实现
- 基于labview的温度自动控制PID算法
- 双闭环可逆直流脉宽PWM调速系统
- FOC矢量控制参考代码
- 用矩阵键盘改变PWM的占空比与频率
- 基于STC89C51单片机的数字抢答器——毕
- 利用PWM定时器实现蜂鸣器控制
评论
共有 条评论