搜索
bottom↓
楼主: tim4146

【分享】增量式PID的stm32实现,整定过程

  [复制链接]

出0入0汤圆

发表于 2014-7-1 22:12:11 | 显示全部楼层
mark           

出0入0汤圆

发表于 2014-7-11 10:21:48 | 显示全部楼层
mark !

出5入4汤圆

 楼主| 发表于 2014-7-11 10:47:46 | 显示全部楼层
老蔡6198 发表于 2014-7-1 15:40
回复过楼主齿轮传感器,看来也是在玩电机控制

齿轮传感器那是一个朋友问我的,没什么经验所以才请教大家一下

出0入0汤圆

发表于 2014-7-11 11:41:54 | 显示全部楼层
mark      

出0入0汤圆

发表于 2014-7-11 12:06:31 | 显示全部楼层
非常好,不错,留个名,谢谢!

出0入0汤圆

发表于 2014-7-11 13:18:18 | 显示全部楼层
mark  STM32 电机PID

出0入0汤圆

发表于 2014-7-11 16:32:09 | 显示全部楼层
楼主你好,
void PID_setpoint(PIDtypedef*PIDx,u16 setvalue);  //设定 PID预期值
void set_speed(float W1,float W2,float W3,float W4);//设定四个电机的目标转速

预期值难道不是目标转速吗?

出0入0汤圆

发表于 2014-7-11 16:59:45 | 显示全部楼层
低惯量伺服电机空载2ms从0-3000转/分钟 ,不知道PID周期是多少

出5入4汤圆

 楼主| 发表于 2014-7-11 19:04:05 | 显示全部楼层
emobbs 发表于 2014-7-11 16:59
低惯量伺服电机空载2ms从0-3000转/分钟 ,不知道PID周期是多少

这个采样周期我也没去研究具体去多少比较好,惯量小的话应该取采样周期短一些 为好。你可以取几个T 放进去看看效果

出5入4汤圆

 楼主| 发表于 2014-7-11 19:12:22 | 显示全部楼层
技术宅 发表于 2014-7-11 16:32
楼主你好,
void PID_setpoint(PIDtypedef*PIDx,u16 setvalue);  //设定 PID预期值
void set_speed(float W ...

void PID_setpoint(PIDtypedef*PIDx,u16 setvalue)
{
  PIDx->setpoint=setvalue;
}
//确实是设定的预期转速,而且根据实际参数,执行一次的话就是改变了一个PID单元的设定值,即setpoint


void set_speed(float W1,float W2,float W3,float W4)
        {
                        float temp;
  if(W1>0)                   //判断W 正负,正数处理
          {
                  motor1_out0=0;
                  motor1_out1=1;
                  temp=W1*122.23;
                  PID_setpoint(&PID1,temp);

          }
          else   if(W1==0)                         //零值
          {
                  motor1_out0=0;
                  motor1_out1=0;
                 
                  PID_setpoint(&PID1,0);
          }
          else                                   //负数处理
          {
                  motor1_out0=1;
                motor1_out1=0;
                temp=-W1*122.23;
                PID_setpoint(&PID1,temp);
                }

  if(W2>0)                
          {
                  motor2_out0=0;
                  motor2_out1=1;
                  temp=W2*122.23;
                  PID_setpoint(&PID2,temp);
          }
          else   if(W2==0)                
          {
                  motor2_out0=0;
                  motor2_out1=0;
                 
                  PID_setpoint(&PID2,0);
          }
          else                                
          {
                  motor2_out0=1;
                motor2_out1=0;
                temp=-W2*122.23;
                PID_setpoint(&PID2,temp);
                }

if(W3>0)                
          {
                  motor3_out0=0;
                  motor3_out1=1;
                  temp=W3*122.23;
                  PID_setpoint(&PID3,temp);
          }
          else   if(W3==0)                
          {
                  motor3_out0=0;
                  motor3_out1=0;
                 
                  PID_setpoint(&PID3,0);
          }
          else                                
          {
                  motor3_out0=1;
                motor3_out1=0;
                temp=-W3*122.23;
                PID_setpoint(&PID3,temp);
                }

  if(W4>0)                
          {
                  motor4_out0=0;
                  motor4_out1=1;
                  temp=W4*122.23;
                  PID_setpoint(&PID4,temp);
          }
          else   if(W4==0)                
          {
                  motor4_out0=0;
                  motor4_out1=0;
                 
                  PID_setpoint(&PID4,0);
          }
          else                                
          {
                  motor4_out0=1;
                motor4_out1=0;
                temp=-W4*122.23;
                PID_setpoint(&PID4,temp);
                }
}
//这个函数你应该能看出,之前的PID_setpoint()已经包含在里面了。这个函数的功能是设定四个轮子的预期转速,但是转速w有正负,而我这边都是以大小来算的,电机转向就交给L298的两个方向控制线了。故需要判断正负。

出5入4汤圆

 楼主| 发表于 2014-7-11 19:13:30 | 显示全部楼层
技术宅 发表于 2014-7-11 16:32
楼主你好,
void PID_setpoint(PIDtypedef*PIDx,u16 setvalue);  //设定 PID预期值
void set_speed(float W ...

简单回答,预期值就是目标值,就是目标转速(单位不一定是r/s)

出0入0汤圆

发表于 2014-7-14 00:25:56 | 显示全部楼层
楼主我最近也在做PID的温度控制,请帮忙看看我的3个问题,谢谢了啊http://www.amobbs.com/forum.php? ... p;extra=#pid7682115

出0入0汤圆

发表于 2014-7-14 20:34:14 | 显示全部楼层
增量式PID的stm32实现

出0入0汤圆

发表于 2014-7-15 10:15:20 | 显示全部楼层
写的很清楚!!!!!!

出0入0汤圆

发表于 2014-7-17 22:14:34 | 显示全部楼层
楼主,请教2个个问题,你这里头定义了KP,Ti, Td, Ki, Kd,其中Ki,Kd是由Ti/Td/Kp计算得来的,而最开始KP/Ti/Td是手动整定得到的,那么为什么不直接整定KP/KI/Kd呢?

第二个问题是你定义的控制周期就是#define T 中的T吗?,他和转速采集周期,PWM周期,需要满足什么关系?
谢谢!

出5入4汤圆

 楼主| 发表于 2014-7-19 20:12:34 | 显示全部楼层
understone 发表于 2014-7-17 22:14
楼主,请教2个个问题,你这里头定义了KP,Ti, Td, Ki, Kd,其中Ki,Kd是由Ti/Td/Kp计算得来的,而最开始KP/Ti ...

第一个问题,整定参数的话,你调整Td Ti 跟你直接调整Kd Ki 没什么大的差别,后者是前者变换来的。我用的是试凑法,先比例 后积分 再微分
第二个问题,T是采样周期=采集转速的周期,和PWM信号没什么大的联系。PWM周期是电机决定的,比如我用1K的周期也行,但是噪音和振动方面不太好。

出0入0汤圆

发表于 2014-7-20 01:28:29 | 显示全部楼层
tim4146 发表于 2014-7-19 20:12
第一个问题,整定参数的话,你调整Td Ti 跟你直接调整Kd Ki 没什么大的差别,后者是前者变换来的。我用的 ...

嗯,理解了,我想最理想的PMW周期应该是最后使转速或者温度维持到目标值得时候,占空比维持不变。而最理想的PID控制周期应该是接近PWM周期。

出0入0汤圆

发表于 2014-7-20 01:29:00 | 显示全部楼层
补充一句,楼主头像好像王石。

出5入4汤圆

 楼主| 发表于 2014-7-20 16:07:56 | 显示全部楼层
understone 发表于 2014-7-20 01:29
补充一句,楼主头像好像王石。

没感觉像谁啊,不过说长得像某某名人还是挺开心的

出0入0汤圆

发表于 2014-7-21 21:06:56 | 显示全部楼层
确实是好东西,收下了

出235入235汤圆

发表于 2014-7-21 21:39:42 | 显示全部楼层
MAKE        

出0入0汤圆

发表于 2014-7-24 11:27:17 | 显示全部楼层
mark,标记

出0入0汤圆

发表于 2014-7-25 16:16:36 | 显示全部楼层
tim4146 发表于 2014-7-19 20:12
第一个问题,整定参数的话,你调整Td Ti 跟你直接调整Kd Ki 没什么大的差别,后者是前者变换来的。我用的 ...

float  Kp =     0.32  ; //比例常数
float  Ti =                0.09 ; //积分时间常数
float Td =                0.0028 ;  //微分时间常数

请教楼主,以上的几个参数还是不知道怎么得到的,可以说详细点吗?谢谢!

出0入0汤圆

发表于 2014-7-26 09:55:14 | 显示全部楼层
好详细,之前研究了好久都没弄好。这个可以借鉴下,多谢分享

出0入0汤圆

发表于 2014-7-26 10:46:37 | 显示全部楼层
高端算法!

出5入4汤圆

 楼主| 发表于 2014-7-26 16:09:26 | 显示全部楼层
yikuang 发表于 2014-7-25 16:16
float  Kp =     0.32  ; //比例常数
float  Ti =                0.09 ; //积分时间常数
float Td =     ...


给你一个小资料吧,几种常见的整定方法。我这里用的是试凑法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-7-28 01:18:53 | 显示全部楼层
mark学习!!pid很重要啊~

出0入0汤圆

发表于 2014-7-31 09:42:29 | 显示全部楼层
收藏了,以后研究研究再看看

出0入0汤圆

发表于 2014-7-31 15:13:31 | 显示全部楼层
好东西,谢谢分享

出0入0汤圆

发表于 2014-8-4 13:29:13 | 显示全部楼层
学习了,很好的资料

出0入0汤圆

发表于 2014-8-4 22:58:43 | 显示全部楼层
楼主  想请教下 对于4.6875这个系数  我们做智能车的也可以算出来么?  不同弯道的摩擦力不同 导致同一PWM对应了不同的速度  还请楼主指点

出5入4汤圆

 楼主| 发表于 2014-8-5 12:02:39 | 显示全部楼层
sunzehua 发表于 2014-8-4 22:58
楼主  想请教下 对于4.6875这个系数  我们做智能车的也可以算出来么?  不同弯道的摩擦力不同 导致同一PWM对 ...

这个系数是线性系统的前提下计算得到的。“不同PWM对应不同速度”,能否解释一下?

出0入0汤圆

发表于 2014-8-6 12:30:57 | 显示全部楼层
tim4146 发表于 2014-8-5 12:02
这个系数是线性系统的前提下计算得到的。“不同PWM对应不同速度”,能否解释一下? ...

我说的同一PWM对应了不同的速度   是因为外部阻力不同导致的  这样的话应该就无法算出这个系数了.   最近在调电机的增量式PID ,你定义的 Ki = Kp*(T/Ti)   ,Kd= Kp*(Td/T) 这两个 可以换成直接设定Ki,Kd的值么 请问有什么区别?

出0入0汤圆

发表于 2014-8-7 22:45:14 | 显示全部楼层
讲解得很详细,多新手很有帮助

出0入0汤圆

发表于 2014-8-8 14:38:48 | 显示全部楼层
就喜欢看着这种,争论中会有不错的收货.................没能力参加讨论,就先做看客呗

出0入0汤圆

发表于 2014-8-8 14:59:23 | 显示全部楼层
mark一下~                                             

出0入0汤圆

发表于 2014-8-9 14:30:26 来自手机 | 显示全部楼层
我准备仔细的学习学习

出0入0汤圆

发表于 2014-8-11 11:00:02 | 显示全部楼层
好难啊啊

出0入0汤圆

发表于 2014-8-12 08:39:57 | 显示全部楼层
好帖,,谢谢大神

出0入0汤圆

发表于 2014-9-10 17:05:26 | 显示全部楼层
很感谢LZ能分享PID的经历,小弟不才有个很easy的问题
PID1.sum_error+=(incPIDcalc(&PID1,frequency1));  
你说这个是增量式PID,但是为什么最后要来个累加的呢,那样不就是位置式了么?我才刚学,不太明白,希望LZ有空回复一下谢谢

出5入4汤圆

 楼主| 发表于 2014-9-10 22:47:15 | 显示全部楼层
kaisfree 发表于 2014-9-10 17:05
很感谢LZ能分享PID的经历,小弟不才有个很easy的问题
PID1.sum_error+=(incPIDcalc(&PID1,frequency1));  
...

增量式PID输出的不是控制量,而是控制量的变化值

出0入0汤圆

发表于 2014-9-11 10:44:24 | 显示全部楼层
谢谢LZ的回复,我的那个PID是这么写的:
/***********增量式PID设计***********/

void PWM_MOTOR(float Now_Val)
{
        float iError;                                        //e(k)
        int          pwm_out,Incpid_out;                //PID输出值
       
        iError = Now_Val - sptr->SetValue;                                //计算e(k)

        Incpid_out = sptr->kp * iError                                        //Δu(k)=Ae(k)-Be(k-1)+Ce(k-2)
                           - sptr->ki * sptr->LastError
                           + sptr->kd * sptr->PrevError;
        //传递e(k)的值于e(k-1),e(k-2)之间
        sptr->PrevError = sptr->LastError;
        sptr->LastError = iError;

        pwm_out = Incpid_out;

        STBY = 1;                                                                                //电机开启
        if(pwm_out>0){AIN1 = 0; AIN2 = 1;}                                 //调整电机正反转
        else{AIN1 = 1;AIN2 = 0; pwm_out = -pwm_out;}
       
        if(pwm_out > PWM_ARR) {pwm_out = PWM_ARR;}                 //防止PWM值超过255
       
        PWM_VALUE = pwm_out;       

       
}
我直接在我的模型上调试,最后那个如果吧pwm_out = Incpid_out改成如你所说的pwm_out += Incpid_out,实际出来感觉没什么差别,请问LZ怎么回事?谢谢

出0入0汤圆

发表于 2014-9-11 11:08:12 | 显示全部楼层
学习了,谢谢楼主分享!

出0入0汤圆

发表于 2014-9-11 11:15:15 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-9-11 11:15:38 | 显示全部楼层
PID 算法     

出0入0汤圆

发表于 2014-9-12 06:46:15 来自手机 | 显示全部楼层
不太明白,不知道lz

出0入0汤圆

发表于 2014-9-12 08:46:38 | 显示全部楼层
其实最难做的就是整定,有很多口诀,其实简单点就是先调比例,再根据需要调节积分和微分

出5入4汤圆

 楼主| 发表于 2014-9-12 09:16:42 | 显示全部楼层
kaisfree 发表于 2014-9-11 10:44
谢谢LZ的回复,我的那个PID是这么写的:
/***********增量式PID设计***********/

呐,公式里面Δu(k)知道什么意思的吧,就是u(k)的变化量啊,所以就是累加啊。
你改了公式之后还能有效控制吗?

出0入0汤圆

发表于 2014-9-12 12:15:56 | 显示全部楼层
好东西,正学习当中。谢谢楼主。

出0入0汤圆

发表于 2014-9-12 14:52:51 | 显示全部楼层
tim4146 发表于 2014-9-12 09:16
呐,公式里面Δu(k)知道什么意思的吧,就是u(k)的变化量啊,所以就是累加啊。
你改了公式之后还能有效 ...

对的呃,我之前没用累加的,也能达到控制效果,不知道为什么,不过现在已经累加上去了,感觉差不多,奇怪,所以不太懂这个,想跟你学习一下

出0入0汤圆

发表于 2014-9-12 15:12:41 | 显示全部楼层
tim4146 发表于 2014-9-12 09:16
呐,公式里面Δu(k)知道什么意思的吧,就是u(k)的变化量啊,所以就是累加啊。
你改了公式之后还能有效 ...

/**********PID参数初始化**********/

void PID_Init(void)
{
        sptr->LastError        = 0;
        sptr->PrevError        = 0;
        sptr->SumError  = 0;
       
        sptr->kp                = 3.5;
        sptr->ki                = 0.15;
        sptr->kd                = 0;
        sptr->SetValue        = 0.10;       
}

这是我对PID参数的初始化,麻烦你帮我看看这样对的吧,我是直接调KP,KI,KD三个参数的,没用你说的那个TI,TD,T,我不知道这样可不可以

出5入4汤圆

 楼主| 发表于 2014-9-12 15:41:47 | 显示全部楼层
kaisfree 发表于 2014-9-12 14:52
对的呃,我之前没用累加的,也能达到控制效果,不知道为什么,不过现在已经累加上去了,感觉差不多,奇怪 ...

不累加也行?试想如果连续三次的误差值都是0,也就是error=0,lastrerror=0,prewerror=0,那么你PID计算出的结果也是0,于是你控制量也是0,如果你是控制电机转速的,那电机岂不是就停转了么...
你肯定是哪个地方累加了,不然不可能正常控制的,不累加无论如何想不明白,难道你是位置式的么?

出5入4汤圆

 楼主| 发表于 2014-9-12 15:42:49 | 显示全部楼层
kaisfree 发表于 2014-9-12 15:12
/**********PID参数初始化**********/

void PID_Init(void)

KP,KI,KD和TI,TD都有关系式的,其实一样的啦

出0入0汤圆

发表于 2014-9-13 12:16:03 | 显示全部楼层
多谢分享,学习了。

出0入0汤圆

发表于 2014-9-15 10:08:36 | 显示全部楼层
tim4146 发表于 2014-9-12 15:42
KP,KI,KD和TI,TD都有关系式的,其实一样的啦

恩,谢谢你的回复~~~

出0入0汤圆

发表于 2014-9-15 10:14:42 | 显示全部楼层
tim4146 发表于 2014-9-12 15:41
不累加也行?试想如果连续三次的误差值都是0,也就是error=0,lastrerror=0,prewerror=0,那么你PID计算 ...

是增量式,我还以为只要输出个增加的PWM就行了呢,没累加过,也很奇怪竟然可以

出0入0汤圆

发表于 2014-9-15 10:23:27 | 显示全部楼层
感谢分享,内容比较多,可以好好学习一下

出0入0汤圆

发表于 2014-9-15 16:59:54 | 显示全部楼层
再学习一下!

出0入0汤圆

发表于 2014-9-15 19:45:09 | 显示全部楼层
不错不错,学习了

出0入0汤圆

发表于 2014-9-19 09:03:18 | 显示全部楼层
tim4146 发表于 2014-9-12 15:42
KP,KI,KD和TI,TD都有关系式的,其实一样的啦

另外我还有个问题,就是在整定PID参数时候,用我这个写法来调的话,KP是按照你说的那个,那么KI是不是要跟你跳Ti的方向反着来?,因为你我那个是KI = KP * T/Ti,是这个意思么?

出5入4汤圆

 楼主| 发表于 2014-9-19 11:39:37 | 显示全部楼层
kaisfree 发表于 2014-9-19 09:03
另外我还有个问题,就是在整定PID参数时候,用我这个写法来调的话,KP是按照你说的那个,那么KI是不是要 ...

直接调整KI 试试呢

出0入0汤圆

发表于 2014-9-19 14:22:57 | 显示全部楼层
tim4146 发表于 2014-9-19 11:39
直接调整KI 试试呢

你好,我有些问题想请教你,方不方便加个扣扣联系方式呢?谢谢了

出0入0汤圆

发表于 2014-9-28 14:03:24 | 显示全部楼层
我有个问题啊,PID算法中应该会出现算出来频率值大于1536的情况,程序中是不是应该做下处理,最大只能是1536  !!!

出5入4汤圆

 楼主| 发表于 2014-9-28 14:15:49 | 显示全部楼层
点颗烟取暖 发表于 2014-9-28 14:03
我有个问题啊,PID算法中应该会出现算出来频率值大于1536的情况,程序中是不是应该做下处理,最大只能是153 ...

可以做个上限,比如不大于这个1536

出0入0汤圆

发表于 2014-9-28 14:46:54 | 显示全部楼层
增量式PID的stm32实现~~此贴实用~~

出0入0汤圆

发表于 2014-9-28 15:50:31 | 显示全部楼层
  不错           

出0入0汤圆

发表于 2014-10-21 21:30:50 | 显示全部楼层
正在做利用PWM控制电机驱动风扇,同时利用PID来校正.....看到后面,没有发现setcpmpare(),这个函数。。。楼主,能补充一下吗?现在也是在PWM、D电机、PID 三者联系的中迷糊了

出0入0汤圆

发表于 2014-10-21 22:47:05 | 显示全部楼层
有没有可以推荐的比较好的上位机波形查看与调试软件

出5入4汤圆

 楼主| 发表于 2014-10-22 09:06:57 | 显示全部楼层
music 发表于 2014-10-21 21:30
正在做利用PWM控制电机驱动风扇,同时利用PID来校正.....看到后面,没有发现setcpmpare(),这个函数。。。 ...

setcpmpare()是stm32的库函数啊,你学习一下用定时器输出PWM的那个知识点就行了。
简单的说setcpmpare(a),a就是PWM信号周期中高电平的量,假如pwm周期用的参数是1000,72分频,那么1000代表的就是1000us了,即pwm周期是1000us,好的。下面我setcpmpare(500),那么就会输出正好50%占空比的波形了。

出5入4汤圆

 楼主| 发表于 2014-10-22 09:10:48 | 显示全部楼层
luluxiu 发表于 2014-10-21 22:47
有没有可以推荐的比较好的上位机波形查看与调试软件

我也在注意这个,上位机要绘图的话数据还是从下位机来的。本来我想尝试用matlab的串口接受stm32的数据的,发现matlab这块没学好。后来就用示波器的滚动模式显示实时的波形进行观察的。如果要绘图写文章的话,可以把示波器的数据放进u盘,里面会生出excel表格,然后把数据做成数组用plot()函数绘图就行了。
总结来说,前期调试和查看波形都是示波器实时看的。

出0入0汤圆

发表于 2014-10-23 12:54:10 | 显示全部楼层
tim4146 发表于 2014-10-22 09:06
setcpmpare()是stm32的库函数啊,你学习一下用定时器输出PWM的那个知识点就行了。
简单的说setcpmpare(a) ...

库函数?我在3.5版本的库函数索引里面里没有找到setcpmpare()这函数...不过Lz你解释后我懂了setcpmpare()的意思了。就是设定占空比的吧

出0入0汤圆

发表于 2014-10-23 14:29:03 | 显示全部楼层
zf12862177 发表于 2014-4-10 10:48
好好把控制理论学一遍,世界上根本就没有什么增量式PID,纯粹是只会搞IT的工程师用不来PID,发现PID效果 ...

离散化后的PID就不叫PID了?现在CPU实现PID控制那个不需将其离散化?难道要通过使用模拟运放搭起来运算的才叫PID?
你的理论就好比使用十进制计算1+1和使用二进制计算1+1是不同的。
增量式PID和位置式PID只是PID经过数字离散化的描述,两者只是数学推导过程不一样,最终结果是一样的。
只要数字离散化PID用的采样频率相对控制对象的响应带宽足够高,数字离散化PID的响应特性就可以用传统PID的波特图。

出0入0汤圆

发表于 2014-10-29 22:39:41 | 显示全部楼层
谢谢分享 PID mark再学习!

出0入0汤圆

发表于 2014-10-29 22:43:45 | 显示全部楼层
谢谢分享 mark  

出0入0汤圆

发表于 2014-10-29 22:48:50 | 显示全部楼层
好东西,收藏了

出0入0汤圆

发表于 2014-10-29 22:55:49 | 显示全部楼层
多谢分享,学习了。

出0入0汤圆

发表于 2014-10-30 00:10:44 | 显示全部楼层
这个真详细,得好好看看

出0入0汤圆

发表于 2014-10-30 09:45:33 | 显示全部楼层
PID计算输出值跟PWM如何联系在一起

出5入4汤圆

 楼主| 发表于 2014-10-30 10:05:32 | 显示全部楼层
second_chan 发表于 2014-10-30 09:45
PID计算输出值跟PWM如何联系在一起

正比关系,你自己换算一下呢。

出0入0汤圆

发表于 2014-10-30 10:51:16 | 显示全部楼层
tim4146 发表于 2014-10-30 10:05
正比关系,你自己换算一下呢。

之前想用51单单片机PID做温控控制,一直不知道其中的关系!都挺郁闷的

出0入0汤圆

发表于 2014-10-30 11:15:27 | 显示全部楼层
记录一下,最近也再搞类似的东东。

出5入4汤圆

 楼主| 发表于 2014-10-30 11:34:42 | 显示全部楼层
second_chan 发表于 2014-10-30 10:51
之前想用51单单片机PID做温控控制,一直不知道其中的关系!都挺郁闷的

温度没做过不好说,但是电机之类的控制对象的电压U和转速w在程序里面看成是线性的就行了

出5入10汤圆

发表于 2014-10-30 13:58:38 | 显示全部楼层
先mark一下~~~

出0入0汤圆

发表于 2014-10-31 20:52:16 | 显示全部楼层
谢谢楼主分享。

出0入0汤圆

发表于 2014-11-4 12:25:19 | 显示全部楼层
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
                        {      
                                duty_TIM2    =   TIM_GetCapture1(TIM2);          //采集占空比               
                           if  (TIM_GetCapture2(TIM2)>600)         period_TIM2        =        TIM_GetCapture2(TIM2);
                                CollectFlag_TIM2 = 0;
                        }

楼主,后来我看代码,有一点疑惑。  period_TIM2   =  TIM_GetCapture2(TIM2);   这条语句中,既然是捕获TIM2 输出的PWM周期,为什么不是用TIM_GetCaputer1() 这个函数,而是用TIM_GetCapture2().....我在库函数的文档中找到,TIM_GetCaputer1() 返回的是 TIMx_CCR1 的值;TIM_GetCapture2() 返回的是 TIMx_CCR2 的值。然后在PWM输入中,PWM周期的数值不是储存在TIMx_CCR1,PWM高电平的值储存在TIMx_CCR2 中吗?  

出0入0汤圆

发表于 2014-11-6 13:20:37 | 显示全部楼层
mark,PID直流电机控制

出0入0汤圆

发表于 2014-11-8 22:46:05 | 显示全部楼层
貌似有点意思!

出0入0汤圆

发表于 2014-11-11 11:32:34 | 显示全部楼层
很好,mark。以后也许会碰到这种需要。

出0入0汤圆

发表于 2014-11-19 19:30:17 | 显示全部楼层
学习一下,随意一直用PID

出0入0汤圆

发表于 2014-11-20 11:40:03 | 显示全部楼层
非常谢谢你的无私分享,最近正在搞温控方面的,顺便问一下你采用的是温控传感器啊

出5入4汤圆

 楼主| 发表于 2014-11-20 11:43:03 | 显示全部楼层
xurenhui 发表于 2014-11-20 11:40
非常谢谢你的无私分享,最近正在搞温控方面的,顺便问一下你采用的是温控传感器啊 ...

不是
电机的增量式编码器

出5入4汤圆

 楼主| 发表于 2014-11-20 11:45:16 | 显示全部楼层
music 发表于 2014-11-4 12:25
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
                        {      
...

上次看到你的消息,一直不知道怎么回答,因为这些细节我真心没去研究,代码部分就像是用了库函数一样移植过来的,然后你说的这段代码对着示波器看看没问题就用了
你现在解决了吗?

出0入0汤圆

发表于 2014-11-20 11:47:19 | 显示全部楼层
mark   !!!!

出0入0汤圆

发表于 2014-11-21 08:43:55 | 显示全部楼层
绝世好文章啊!

出0入0汤圆

发表于 2014-11-21 17:20:38 | 显示全部楼层
还是很实用的!

出140入115汤圆

发表于 2014-11-21 20:01:35 | 显示全部楼层
多谢分享!!

出0入0汤圆

发表于 2014-11-24 23:12:54 | 显示全部楼层
tim4146 发表于 2014-11-20 11:45
上次看到你的消息,一直不知道怎么回答,因为这些细节我真心没去研究,代码部分就像是用了库函数一样移植 ...

恩,楼主,搞定了;发现是我弄错了。

  stm32里面,PWM的输入 和 输出 用的是不用的寄存器。后来看 stm32的手册的定时器里描述的PWM的功能时寄存器的使用情况,然后对比库函数里代码的宏定义,一层一层的把库函数剥开,看到寄存器那,发现是我没有看精细,太粗心了

出0入0汤圆

发表于 2014-11-27 09:20:40 | 显示全部楼层
顶一下!!

出0入0汤圆

发表于 2014-11-27 09:35:05 | 显示全部楼层
好文章,路过支持并学习

出0入0汤圆

发表于 2014-11-27 09:55:45 | 显示全部楼层
需要学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 00:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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