控制工程师论坛

嵌入式系统

控制发电机的PID

xilinxue
xilinxue

2008-09-13

这个附件也就是这里的程序,也可以把这几个帖子看完,这个是去年做的一个项目了,希望能对大家有点帮助

/***************************************/
//2008/05/25   cs5463 collect .
//             alarm 电池电压
/***************************************/
#include
#define   uchar  unsigned char
#define   uint   unsigned int
#define   SYSCLK       22118400
#define   BAUDRATE        2400
#define   SAMPLERATE0     50000         //ADC0采样频率
#define   VREF0           2908          //VERF电压(mV)
#define   PWM_MIN         0x0a00
#define   PWM_MAX         0xb000

#define   VOL_MAX         3000         //电压报警
#define   VOL_MIN         1600
#define   FRE_MAX         600          //频率报警
#define   FRE_MIN         400
#define   BAT_MIN         1000         //电池电压报警<=10V


static    uchar data txcount = 0x00;    /*发送字数20*/
static    uchar idata  rs232tran[20];
static    uint  data time_count = 0x0000; /*定时*/

static    uint  data t0high = 0x0000;   /*T0液位加1*/
static    uchar data  cycle = 0x02;
static    uint      xdata frequency = 0x0000;
static    uint      xdata frequencyp = 0x0000;
static    uint      xdata fr_lo = 0x0000;
static    uint      xdata fr_hi = 0x0000;
static    uchar     data  int_time;
static    uint  data stop_count = 0x0000;

static    uint  data vol_count = 0x0000;       //发电机电压报警
static    uint  data fre_count = 0x0000;       //频率报警
static    uint  data bat_count = 0x0000;       //电池电压报警
static    uint  data pre_count = 0x0000;       //压力报警
static    uint  data count_tspeed = 0;      //开机检测转速,如果超过2400r/min,5秒后进入主程序


static    long      xdata result[1];              /*传感器输出结果*/
static    uint      xdata cresult[1];             /*运算输出结果*/
static    uchar data num_samples0 = 0;
static    uchar data num_samples1 = 0;
static    uint  xdata csamples0[20];
static    uint  xdata csamples1[20];
static    long  xdata voltage;
static    uint      xdata disp_resultp = 0x00;
static    uchar data keydata1;
static    uchar data keydata2;
static    uchar data keydata3;
static    uchar data keydata4;


static    uchar data count5463 = 0;         //1.5秒钟内读不到CS5463数据,复位CS5463
static    uchar idata cs5463rw[3]={0,0,0};  //cs5463读写寄存器
static    uchar idata cs5463tm[3]={0,0,0};  //cs5463读出状态
static    long      xdata aresult[2];       //cs5463传感器输出结果
static    uint      xdata acresult[2];      //cs5463运算输出结果,0:voltage 1:current
static    uint      xdata ac_vresult[40];
static    uint      xdata ac_iresult[40];
static    uchar     data  vi_count = 0;
static    uchar bdata alm_in = 0x01;       /*各种报警信号*/


/***************PID运算*****************/
/***ui = ui1+a0*ei-a1*ei1+a2*ei2*增量式*/
static    uint data con_a0;      //用内部寄存器
static    uint data con_a1;
static    uint data con_a2;
static    uint  data con_ei;
static    uint  data con_ei1;
static    uint  data con_ei2;
static    long  data con_temp;
static    long  data con_temp1;
static    uint  data con_yk;
//static    uint  data con_givexz;
//static    uint  data disp_vxz;
static    uint  data con_ui1;
static    uint  data con_give;
static    uint  data con_time;       //定时100ms输出一次
static    uint  xdata  PWM;
/***************************************/

 


//--------------------------------
sfr16     TMR2RL = 0xca;      /*定时器2重载值*/
sfr16     TMR2 = 0xcc;        /*定时器2计数值*/
sfr16     TMR3RL = 0x92;      /*定时器3重载值*/
sfr16     TMR3 = 0x94;        /*定时器3计数值*/
sfr16     ADC0 = 0xbd;        /*ADC0数据*/
//---------------------------------


bit  right_acb = 0;         //right vaule
bit  stop_mb=0;              /*切断发动机点火标志*/
bit  stop_mbs=0;             /*切断完发动机标志0:没有1:有*/
bit  a0_b=0;                            /*0正   1负*/
bit  a1_b=0;
bit  a2_b=0;

sbit alm_in0=alm_in^0;       //1:工作正常开始计时
sbit alm_in1=alm_in^1;       //机油压力报警
sbit alm_in2=alm_in^2;       //电压高报警
sbit alm_in3=alm_in^3;       //电压低报警
sbit alm_in4=alm_in^4;       //频率高报警
sbit alm_in5=alm_in^5;       //频率低报警
sbit alm_in6=alm_in^6;       //电池电压报警
sbit alm_in7=alm_in^7;       //

sbit PWM_OUT = P0^7;          /*输出端口引脚*/
sbit oil_pre=P2^0;           /*油压报警*/
sbit close_oil=P1^5;
sbit reset_5463=P2^3;
sbit cs_5463=P2^4;
sbit sdi_5463=P2^5;
sbit sdo_5463=P2^6;
sbit sclk_5463=P2^7;
sbit stop_m=P1^6;

 

void SYSCLK_Init (void);
void delay1ms(int count);
void PORT_Init (void);
void PCA_Init(void);
void UART0_Init(void);
void ADC0_Init(void);
void Int0_Init(void);
void Timer0_Init(void);
void Timer2_Init(void);
void Timer3_Init(int counts);
void pid_INI(void);


void UART0_ISR(void);
void ADC0_ISR (void);
void Timer0_ISR(void);
void Timer2_ISR(void);
void Int0_ISR(void);
void PCA_ISR(void);


void measure_pulsef(void);
void measure(void);
void  pid_control(void);
void Hex2Bcd3(uint value);
void comm_pro(void);           //通讯数据处理
void alarm_symbol(void);
void alarm_battery(void);

/***********************/
void nop_1us(void);
void send_5463(uchar send_data);
void write_5463(uchar *pbuf,uchar command);
void read_5463(uchar *pbuf,uchar command);
void init_5463(void);
void drdy_pro(void);           //采样程序
/***********************/

回帖

评论3

总共 , 当前 /
首页 | 登录 | 注册 | 返回顶部↑
手机版 | 电脑版
版权所有 Copyright(C) 2016 CE China