关于dsp2812的ccs3.3.中出现error: a void function may not return a value

关于2812dsp中的pid程序,error:avoidfunctionmaynotreturnavalue,不能输出adjust值,不知道改如何是好。我的偏差值是ek=... 关于2812dsp中的pid程序,error: a void function may not return a value,不能输出adjust值,不知道改如何是好。我的偏差值是ek=sina[i]-sinb[i];//标准值-采样值,采样值不是ad采样得来的,为了方便自己先假设了一个sinb函数表。
interrupt void T1PINT_ISR(void) // 通用定时器T1的周期中断
{
//变量初始化,根据实际情况初始化
float Kp=4;
float Ti=0.005;
float T=0.001;
float Td=0.0002;

float a0=5.6;
float a1=5.6;
float a2=0.8;
// Ki=KpT/Ti=0.8,微分系数Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的结果确定这些参数
float ek=0;
float ek1=0;
float ek2=0;
float uk=0;
int uk1=0;
int adjust=0;
int i=0;

ek=sina[i]-sinb[i];//标准值-采样值

if(ek<0.1) //ee 为误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡。ee的值可自己设
{
adjust=0;
}
else
{
uk=a0*ek+a1*ek1+a2*ek2;
ek2=ek1;
ek1=ek;
uk1=(int)uk;

if(uk>0)
{
if(uk-uk1>=0.5)
{
uk1=uk1+1;
}
}
if(uk<0)
{
if(uk1-uk>=0.5)
{
uk1=uk1-1;
}
}

adjust=uk1;
}
return adjust;

sina[i]=sina[i]- adjust;

if((i>=0)&&(i<N/2)) //前半周期
{
EvaRegs.CMPR1=EvaRegs.T1PR*((1.0+M*sina[i])/2.0); //A相

}

if((i>=N/2)&&(i<N)) //后半周期
{
EvaRegs.CMPR1=EvaRegs.T1PR*((1.0-M*sina[i-30])/2.0); //A相

}

i++;
{
if(i>=N)
{
i=0;
}

}

PieCtrl.PIEACK.bit.ACK2=1; //响应同组中断
EvaRegs.EVAIFRA.bit.T1PINT=1;//清除中断标志位
EINT; //开全局中断
}
展开
 我来答
pevin
推荐于2018-03-20 · TA获得超过487个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:185万
展开全部
因为你定义的中断函数是void类型的,所以函数体内不能有返回值
adjust不要用return来返回,直接设成一个全局变量就好了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
易捷测试
2024-10-23 广告
load pull的简单原理是使用一个叫tuner的东西,可理论模拟任意阻抗的负载,(你可以把tuner想像成一个一段并联传输线和一段串联传输线的组合器件,而传输线的长度和阻抗都是可调的,那么通过调节即可遍历smith原图的任意位置)实际测... 点击进入详情页
本回答由易捷测试提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式