打印
[其他ST产品]

一个设定频率,一路测量频率,执行机构通过DAC调节电压,控制频率改变,这个PID参数...

[复制链接]
1458|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2023-6-8 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个设定频率,一个测量频率,通过PID调节控制DAC寄存器的值,这个DAC12位的,执行机构通过这个电压改变频率,这个PID算法的各个参数怎么搞出来?
//extern int U_Set;
//extern u16 CCR1_Val;
/*====================================================================================================
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.
=====================================================================================================*/
typedef struct PID {
float SetPoint; // 设定目标Desired value
float Proportion; // 比例常数Proportional Const
float Integral; // 积分常数Integral Const
float Derivative; // 微分常数Derivative Const
float LastError; // Error[-1]
float PrevError; // Error[-2]
float SumError; // Sums of Errors
} PID;
/*====================================================================================================/
PID计算部分
=====================================================================================================*/
PID   vPID={0,0.1,0.001,0.001,0,0,0};
float PIDCalc( PID *pp, float NextPoint )
{
float dError,
Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
    if(pp->SumError>900)  pp->SumError=900;
    else if(pp->SumError<-900)   pp->SumError=-900;
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项
);
}
float Vol(int vSet,int v3){
float vOut; // PID Response (Output)
float vIn; // PID Feedback (Input)
vPID.SetPoint = vSet; // Set PID Setpoint
vIn = (float)v3; // Read Input
vOut = PIDCalc ( &vPID,vIn ); // Perform PID Interation  
return vOut;
}
void mian()
{
while(1)
{
if(Flag_3S==1)
  {
   if(target-TIM_ExtCntFreq>=6||target-TIM_ExtCntFreq<=-6)
   {
        Pv=Vol(target,TIM_ExtCntFreq);// PID算法
        dac_value=dac_value+Pv/2.04;//DAC 寄存器调节
    DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);
   }
   led3=~led3;
   Flag_3S=0;
}
   
  }
}

使用特权

评论回复
沙发
LcwSwust| | 2023-6-8 10:14 | 只看该作者
百度 PID 整定

使用特权

评论回复
板凳
光辉梦境| | 2023-6-22 17:33 | 只看该作者
这种一般PID有现成的参数调试逻辑吧

使用特权

评论回复
地板
三生万物| | 2023-6-22 19:07 | 只看该作者
没研究过,这种PID一般都是具体调参

使用特权

评论回复
5
暖了夏天蓝了海| | 2023-6-22 21:15 | 只看该作者
PID的框架大多数是一样的,只是里面参数都需要自己来调的

使用特权

评论回复
6
一秒落纱| | 2023-6-22 23:12 | 只看该作者
参数根据你的项目来提供的吧

使用特权

评论回复
7
淡漠安然| | 2023-6-23 09:21 | 只看该作者
PID给我的感觉就是数学了,数学程序化

使用特权

评论回复
8
江河千里| | 2023-6-23 11:02 | 只看该作者
你说的参数都是常用的那几个参数吧

使用特权

评论回复
9
冰春彩落下| | 2023-6-23 13:48 | 只看该作者
你这个程序从哪儿来的呢?一般作者都会说每个参数的含义吧

使用特权

评论回复
10
夜阑风雨| | 2023-6-23 13:52 | 只看该作者
PID网上有很多教程的啊,请看一看吧,能有点思路

使用特权

评论回复
11
远山寻你| | 2023-6-23 16:27 | 只看该作者
还没玩过PID,一般感觉在飞控这块能用得到

使用特权

评论回复
12
别乱了阵脚| | 2023-6-23 19:23 | 只看该作者
你不能完全用他的PID的,你也需要修改一下的

使用特权

评论回复
13
Wordsworth| | 2024-2-1 07:05 | 只看该作者

主从定时的方式占用CPU资源少

使用特权

评论回复
14
Clyde011| | 2024-2-1 08:08 | 只看该作者

主从定时器门控的方式

使用特权

评论回复
15
公羊子丹| | 2024-2-1 09:01 | 只看该作者

主定时器为TIM1,通道2配置为PWM输出

使用特权

评论回复
16
万图| | 2024-2-1 10:04 | 只看该作者

中断计数的方式实现简

使用特权

评论回复
17
Uriah| | 2024-2-1 11:07 | 只看该作者

当PWM频率较高时,频繁的中断将影响程序运行的效率

使用特权

评论回复
18
帛灿灿| | 2024-2-1 13:03 | 只看该作者

都可以产生指定个数的PWM脉冲

使用特权

评论回复
19
Bblythe| | 2024-2-1 14:06 | 只看该作者

输出了5个频率为10KHz的PWM脉冲

使用特权

评论回复
20
周半梅| | 2024-2-1 16:02 | 只看该作者

从定时器为TIM2,从模式选择为门控模式,触发源选择ITR0,开启定时器2中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

3060

帖子

7

粉丝