m0_74537145 2023-10-05 14:13 采纳率: 84.6%
浏览 17
已结题

如何用编码器测得真实速度和电机形成闭环处理有增量式pid

使用mounriver调用的逐飞库encoder_get_count如何显示真实速度和电机形成闭环处理会pid增量式算法有两个电机

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-05 23:35
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    要使用编码器测量真实速度并实现电机的闭环控制,您可以按照以下步骤进行操作:

    1. 获取编码器的脉冲计数:使用逐飞库提供的函数encoder_get_count()来获取编码器的脉冲计数。这个函数可以返回编码器的计数值,您可以根据实际情况设置定时器或中断来定期获取脉冲计数值。

    2. 计算速度:通过定期获取编码器的脉冲计数,您可以计算出时间间隔内的脉冲数。然后,将脉冲数转换为速度值,如每秒脉冲数或每秒转数,根据您的需求来选择合适的单位。

    3. 形成闭环控制:使用获取到的速度值和设定的目标速度作为反馈信号,您可以实现电机的闭环控制。可以通过调节电机的PWM信号或其他电机控制参数来控制电机的转速。

    4. 实现增量式PID算法:在闭环控制的基础上,您可以使用增量式PID算法来进一步优化控制效果。增量式PID算法的特点是不需要存储过去的误差和积分项,只需存储增量值。您可以根据经验和实际需求调整PID参数,然后使用增量式PID算法来调节电机控制量。

    在C语言中实现以上功能,您可以按照以下代码示例进行操作:

    #include <stdio.h>
    #include <stdlib.h>
    
    // Encoder count variable
    int encoder_count = 0;
    
    // Encoder count update function
    void encoder_update()
    {
        // Get encoder count using encoder_get_count() function from library
        encoder_count = encoder_get_count();
    }
    
    // Calculate speed function
    float calculate_speed(int prev_count, int cur_count, float time_interval)
    {
        int pulse_count = cur_count - prev_count;
        float speed = pulse_count / time_interval;
        return speed;
    }
    
    // Incremental PID control function
    float incremental_pid_control(float target_speed, float current_speed, float prev_control, float kp, float ki, float kd)
    {
        float error = target_speed - current_speed;
        float increment = kp * (error - prev_control) + ki * error + kd * (error - 2 * prev_control + increment);
        float control = prev_control + increment;
        return control;
    }
    
    int main()
    {
        // Define variables
        int prev_encoder_count = 0;
        float prev_control = 0.0;
        float target_speed = 100.0; // Set target speed
        float kp = 0.1; // PID parameters
        float ki = 0.05;
        float kd = 0.05;
        float time_interval = 0.1; // Time interval for speed calculation
    
        // Main loop
        while (1)
        {
            // Update encoder count
            encoder_update();
    
            // Calculate speed
            float current_speed = calculate_speed(prev_encoder_count, encoder_count, time_interval);
            prev_encoder_count = encoder_count;
    
            // Perform PID control
            float control = incremental_pid_control(target_speed, current_speed, prev_control, kp, ki, kd);
            prev_control = control;
    
            // Update motor control based on control value
    
            // Print current speed and control value
            printf("Current Speed: %f\r\n", current_speed);
            printf("Control value: %f\r\n", control);
    
            // Delay for next iteration
            // Add your delay function here
        }
    
        return 0;
    }
    

    以上代码示例是一个简单的框架,您可以根据具体实际情况进行适当的修改和优化。在代码中,encoder_update()函数用于更新编码器计数值,calculate_speed()函数用于计算速度,incremental_pid_control()函数用于实现增量式PID控制算法。您需要根据实际情况添加相应的库函数和具体的电机控制逻辑。

    请注意,以上代码示例仅作为参考,具体实现可能会依赖于您使用的单片机和逐飞库的具体情况。因此,您可能需要参考逐飞库的文档以获取更详细的信息和示例代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月14日
  • 已采纳回答 10月6日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表