DSP28335实现PID闭环
Simulink下的模型及结果给定参考是0.5,经过PID,然后执行机构,最后输出,Simulink的仿真结果如下:KP=10;KI=5;KD=0.5DSP实现包括两块:定时器0中断,PID函数。主要就是在中断函数中实现PID。采用增量式PID算法:定时器0中断函数及PID初始化,运算void TIM0_Init(float Freq,float Period){EALLOW;SysCtrlReg
·
Simulink下的模型及结果
给定参考是0.5,经过PID,然后执行机构,最后输出,Simulink的仿真结果如下:
KP=10;KI=5;KD=0.5
DSP实现
包括两块:定时器0中断,PID函数。主要就是在中断函数中实现PID。
采用增量式PID算法:
定时器0中断函数及PID初始化,运算
-
void TIM0_Init(float Freq,float Period) - {
-
EALLOW; -
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK=1; -
EDIS; -
EALLOW; -
PieVectTable.TINT0=&TIM0_IRQn; -
EDIS; -
//指向定时器0的寄存器地址 -
CpuTimer0.RegsAddr = &CpuTimer0Regs; -
//设置定时器0的周期寄存器值 -
CpuTimer0Regs.PRD.all = 0xFFFFFFFF; -
//设置定时器预定标计数器值为0 -
CpuTimer0Regs.TPR.all = 0; -
CpuTimer0Regs.TPRH.all = 0; -
//确保定时器0为停止状态 -
CpuTimer0Regs.TCR.bit.TSS = 1; -
//重载使能 -
CpuTimer0Regs.TCR.bit.TRB = 1; -
// Reset interrupt counters: -
CpuTimer0.InterruptCount = 0; -
ConfigCpuTimer(&CpuTimer0, Freq, Period); -
//开始定时器功能 -
CpuTimer0Regs.TCR.bit.TSS=0; -
//开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0 -
IER |= M_INT1; -
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; -
//使能总中断 -
EINT; -
ERTM; - }
- void PID_initial(void)
- {
-
pidStr.KP=10; -
pidStr.KI=5; -
pidStr.KD=0.5; - }
- float PID_control(float adcvalue,float ref)
- {
-
float Inck=0.0; -
pidStr.Ek=ref-adcvalue; -
Inck = pidStr.KP*(pidStr.Ek - pidStr.Ek_1) + pidStr.KI*pidStr.Ek -
+ pidStr.KD*(pidStr.Ek - 2*pidStr.Ek_1 + pidStr.Ek_2); -
pidStr.Ek_2 = pidStr.Ek_1; -
pidStr.Ek_1 = pidStr.Ek; -
pidStr.dacOut = pidStr.dacOut + Inck*1.000/60; -
if(pidStr.dacOut < 0.0000) -
pidStr.dacOut = 0.0000; -
if(pidStr.dacOut > 0.7) -
pidStr.dacOut = 0.7; -
return pidStr.dacOut; - }
- interrupt void TIM0_IRQn(void)
- {
-
EALLOW; -
LED2_TOGGLE; -
PID_control(a,0.5); -
DELAY_US(1); -
a=1.5*pidStr.dacOut; -
aa[ai]=a; -
ai++; -
PieCtrlRegs.PIEACK.bit.ACK1=1; -
EDIS; - }
主函数:
-
void main() - {
-
InitSysCtrl(); -
p=0; -
a=0.0; -
ai=0; -
LED_Init(); -
int i; -
for(i=0;i<500;i++) -
{ -
aa[i]=0; -
} -
InitPieCtrl(); -
IER = 0x0000; -
IFR = 0x0000; -
InitPieVectTable(); -
PID_initial(); -
TIM0_Init(150,1000); -
while(1) -
{ -
p++; -
if((p%2)==0) -
{ -
LED1_TOGGLE; -
} -
} - }
全局变量的定义:
C文件:
- #include “canshu.h”
- PID_ValueStr pidStr;
- float32 a;
- float32 aa[500];
- Uint16 ai;
H文件
-
extern float32 m[100]; - extern float32 aa[500];
- extern float32 a;
- extern Uint16 ai;
- typedef struct PID_Value
- {
-
float KP; -
float KI; -
float KD; -
float Ek; -
float Ek_1; -
float Ek_2; -
float dacOut; - }PID_ValueStr;
- extern PID_ValueStr pidStr;
最终效果:
欢迎批评指正
更多推荐


所有评论(0)