芯片解密DSP的PID控制算法的实现
- 芯片解密/*****************************************************************
- 芯片解密PID Function
- The PID (比例、积分、微分) function is used in mainly
- control applications. PIDCalc performs one iteration of the PID
- algorithm.
- While the PID function works, main is just a dummy program showing
- a typical usage.
- ****************************************************************/
- /****************************头文件******************************/
- #include "DSP28_Device.h"
- #include "System.h"
- #include "DSP28_Adc.h"
- typedef struct PID {
- double SetPoint; // 设定目标Desired value
- double Proportion; // 比例常数Proportional Const
- double Integral; // 积分常数Integral Const
- double Derivative; // 微分常数Derivative Const
- double LastError; // Error[-1]
- double PrevError; // Error[-2]
- double SumError; // Sums of Errors
- } PID;
- /*********************PID计算部分*********************************/
- double PIDCalc( PID *pp, double NextPoint )
- {
- double 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 ); // 微分项
- }
- /**********************Initialize PID Structure************************/
- void PIDInit (PID *pp)
- {
- memset ( pp,0,sizeof(PID));
- }
- /********************Main Program*********************************/
- double sensor (void) // Dummy Sensor Function
- {
- return 100.0;
- }
- void actuator(double rDelta) // Dummy Actuator Function
- {}
- void InitAdc(void)
- {
- unsigned int i;
- AdcRegs.ADCTRL1.bit.RESET=1;
- NOP;
- AdcRegs.ADCTRL1.bit.RESET=0; //重新设置
- AdcRegs.ADCTRL1.bit.SUSMOD=3; //设置仿真挂起模式 3,
- AdcRegs.ADCTRL1.bit.ACQ_PS=0;
- AdcRegs.ADCTRL1.bit.CPS=0;
- //对高速时钟 HSPCLK 分频,=0 时,不分频,=1 时,二分频
- AdcRegs.ADCTRL1.bit.CONT_RUN=0; //开始-----停止模式
- AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
- //级联模式,SEQ1 和 SEQ2 作为一个 16 状态排序器工作。
- AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //带隙和参考电路上电for(i=0;i<10000;i++) NOP;
- AdcRegs.ADCTRL3.bit.ADCPWDN=1;
- //除带隙和参考电路外的 ADC 其它模拟电路上电
- for(i=0;i<5000;i++) NOP;
- AdcRegs.ADCTRL3.bit.ADCCLKPS=15;
- //时钟分频 ADCCLKPS=HSPCLKPS/[2*15*(ADCTRL1[7]+1)]
- AdcRegs.ADCTRL3.bit.SMODE_SEL=1; //选择同步采样模式
- AdcRegs.MAX_CONV.bit.MAX_CONV=0; //设置转换通道0
- AdcRegs.CHSELSEQ1.bit.CONV00=0;
- AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除 SEQ1 的中断标志位
- AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1; //清除 SEQ2 的中断标志位
- AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0; //无作用
- AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
- //将排序器立即复位到 CONV00 状态
- AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能 INT_SEQ1 的中断请求
- AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
- //每个 SEQ1 序列结束时,INT_SEQ1 置位
- AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0; //EVA 的触发信号不启动 SEQ1
- AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0; //无操作
- AdcRegs.ADCTRL2.bit.RST_SEQ2=0; //无操作
- AdcRegs.ADCTRL2.bit.SOC_SEQ2=0; //清除一个挂起的 SOC 触法
- AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0; //禁止 INT_SEQ2 产生的中断请求
- AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
- //每个 SEQ2 结束时,INT_SEQ2 置位
- AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
- //EVB 的触发信号不启动 SEQ2
- AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;

芯片解密