OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1933|回复: 2

PID问题求助

[复制链接]

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-7-21
在线时间
22 小时
发表于 2017-7-22 11:46:41 | 显示全部楼层 |阅读模式
我想通过ad采样的数据利用PID调节输出PWM波的占空比,可是传递float型的数据不可以,传递u16型的数据可以,搞了好几天求大神帮忙解决一下。谢谢

float C1;u16 adcx;
while(1)
{         
  adcx=Get_Adc_Average(ADC_Channel_10,30); //pc0
  C1=(float)adcx*(3.3/4096);
  //d=PID_realize(1.0,adcx);-------------------这个可以调用
  d=PID_realize(1.0,C1);---------------------------这个不可以
  POINT_COLOR=RED;  LCD_Show_float(100,100,C1,16,16,0);////Êä³öµçѹ U1 ÏÔʾ
}
void PID_init()
{
pid.Set=0.0;
pid.Actual=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.err_next=0.0;
pid.Kd=0.045;
pid.Ki=0.07;
pid.Kp=0.32;
pid.change=0.0;
}
float PID_realize(float x,float y)
{
pid.Set=x;
pid.Actual=y;
pid.err=pid.Set-pid.Actual;
pid.change=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
pid.Actual+=pid.change;
pid.err_last=pid.err_next;
pid.err_next=pid.err;
return pid.Actual;
}







AD采样 PWM PID.rar

3.65 MB, 下载次数: 153

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-5-30
在线时间
26 小时
发表于 2017-7-22 22:24:44 | 显示全部楼层
float是8位的,u16是16位的,当然不行。你申请一个u16的变量,然后把采样的float值去掉一些精度强制转换位u16,再赋值给之前的u16变量。
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-7-21
在线时间
22 小时
 楼主| 发表于 2017-7-23 09:04:31 | 显示全部楼层
我PID函数定义的是传float型的数据,结果传类型一样的数据却不行,传u16数据却可以
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-23 02:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表