注册 登录
查看: 360|回复: 1

[平衡组] 关于速度PID控制实验上位机显示的疑问,求解!!!

[复制链接]
发表于 2014-4-1 20:29:52 | 显示全部楼层 |阅读模式
在做一个速度PID闭环控制的实验,想通过上位机(虚拟示波器)显示【预设速度】和【车子的实际速度】的曲线,以便观察。程序如下:
void main(void)
{
    printf("\n*****速度PID控制实验*****\n");


    FTM_QUAD_Init(FTM1);                        //FTM1 正交解码初始化
    FTM_QUAD_Init(FTM2);                        //FTM2 正交解码初始化

    PID_Init();                                  //初始化PID
    uart_init (UART4, 9600);
    FTM_PWM_init(FTM0, FTM_CH3,10000,MOTOR_DUTY);
    FTM_PWM_init(FTM0, FTM_CH4,10000,MOTOR_DUTY);
    FTM_PWM_init(FTM0, FTM_CH5,10000,MOTOR_DUTY);
    FTM_PWM_init(FTM0, FTM_CH6,10000,MOTOR_DUTY);

        //IO管脚配置
    gpio_init(MOTOR1_IO,GPO,LOW);
    gpio_init(MOTOR2_IO,GPO,LOW);
    gpio_init(MOTOR3_IO,GPO,LOW);
    gpio_init(MOTOR4_IO,GPO,LOW);


    pit_init_ms(PIT0, 100);         //初始化PIT0,定时时间为: 100ms
    set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);      //设置PIT0的中断复位函数为 PIT0_IRQHandler
    enable_irq (PIT0_IRQn);        //使能PIT0中断

    while(1)
    {

      CAR_speed=(val1+val2)/2;
      CAR_speed=CAR_speed/20;          //将脉冲数转成r/s.因为200线的编码器每转产生200个脉冲,这里定时100ms采集脉冲数

      PWM_Value=IncPIDCalc(CAR_speed);      //PID运算根据当前的脉冲数目得到偏差
      MotorPWMDuty += PWM_Value;             //调整PWM占空比输出

      #if 1
      if(MotorPWMDuty >= MAXDUTY)  MotorPWMDuty = MAXDUTY;          //限幅
      else if (MotorPWMDuty <= MINDUTY)  MotorPWMDuty = MINDUTY;
      else;
      #endif
      CAR_speedOut(MotorPWMDuty);      //电机PWM占空比输出,MotorPWMDuty大于0则前进,MotorPWMDuty小于0则后退


        #if 1
        OutData[0] = SETPOINT;         //速度预设值, 单位 r/s
        OutData[1] = CAR_speed;       //车子速度,即两轮的平均速度
        OutData[2] = MotorPWMDuty ; //电机当前占空比
       OutData[3] = PWM_Value;       //当前速度与预设速度的偏差

        OutPut_Data();
        #endif


    }
}

/*!
*  @brief      PIT0中断服务函数
*  @since      v5.0
*/
void PIT0_IRQHandler(void)
{


    val1 = FTM_QUAD_get(FTM1);          //获取FTM 正交解码 的脉冲数(负数表示反方向)
    val2 = FTM_QUAD_get(FTM2);          //获取FTM 正交解码 的脉冲数(负数表示反方向)


   FTM_QUAD_clean(FTM1);
   FTM_QUAD_clean(FTM2);

    PIT_Flag_Clear(PIT0);       //清中断标志位
}
问题是:上位机上走的非常慢,而且非常粗糙,精度非常差(没法观察),如动画所示:

而当我把while循环中的【CAR_speedOut(MotorPWMDuty);】注释掉后,曲线走得就比较快比较正常了,求解!!!

我应该怎么做才能在电机转动的情况下得到正常的可观察的曲线?

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-4-1 22:03:06 | 显示全部楼层
CAR_speedOut(MotorPWMDuty);

你测一下为啥这个用的时间比较久啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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