博客
关于我
[转]PID算法与直流电机的PWM技术控制()
阅读量:222 次
发布时间:2019-03-01

本文共 1712 字,大约阅读时间需要 5 分钟。

PID控制算法与直流电机的PWM控制

PID控制算法是工业控制领域使用最广泛的算法之一,而嵌入式系统是实现智能控制的最常见手段。在本文中,我们将通过一个实际案例——使用单片机控制两个带编码器的直流电机,使二者转速保持一致——来详细讲解PID算法与直流电机的PWM技术控制。

PID控制算法的基本原理

PID控制算法由三个环节组成:比例、积分和微分控制。其基本工作原理如下:

  • 比例环节:根据系统的偏差e(t)立即产生控制输出,控制效果与偏差成正比。
  • 积分环节:对系统的历史误差进行记忆,消除静差,提高系统的无差度。积分时间常数Ti决定了积分环节的强度。
  • 微分环节:对偏差的变化率进行响应,能够快速调整系统输出,减小调节时间。
  • PID控制器的三个参数Kp、Ki、Kd需要通过实际调试确定。通常情况下,Kp > Kd,Ki的大小根据具体需求调整。参数的确定需要结合实际控制需求和系统输出情况进行优化。

    直流电机控制与编码器反馈

    在本文中,我们使用带编码器的直流减速电机。编码器的作用是将电机的角位移或角速度信号转换为电脉冲信号,通过检测脉冲信号的频率可以准确获取电机的转速。

    直流电机的控制主要通过PWM技术实现。PWM控制的核心是调节占空比,从而改变电机两端电压,进而控制电机转速。控制系统的结构图如上图所示。

    程序实现步骤

    1. 系统初始化

    • 配置全局变量和外设:完成PID参数、定时器、串口等外设的初始化。
    • 初始化延时功能、PWM、编码器以及中断管理。

    2. PID参数设置

    通过串口接收命令,用户可以实时调整PID参数。参数调整的具体实现如下:

    do {    switch(go) {        case 'P': mts.Kp += val; go = 0; break;        case 'I': mts.Ki += val; go = 0; break;        case 'D': mts.Kd += val; go = 0; break;        case 'p': mts.Kp -= val; go = 0; break;        case 'i': mts.Ki -= val; go = 0; break;        case 'd': mts.Kd -= val; go = 0; break;        default: break;    }    delay_ms(10);} while(go != '0');

    3. 主控制循环

    在循环体中,实现PID控制算法的核心逻辑,包括计算控制输出并发送数据。

    while(1) {    detPID_PWM_out(); //计算控制输出    if(sendFlag) {        send_intData(mts.detPWM_out); //发送数据        sendFlag = 0;    }    TIM_SetCompare1(TIM5, BASE_SPEED - mts.detPWM_out); //控制电机转速    TIM_SetCompare2(TIM5, BASE_SPEED + mts.detPWM_out); //控制电机转速    TIM_SetCompare3(TIM5, 0); //通道3、4为0    TIM_SetCompare4(TIM5, 0); //通道3、4为0}

    4. 中断处理

    • 串口中断:用于接收上位机的命令和数据,实现PID参数的实时调整。
    • 定时器中断:用于采集编码器反馈信号,计算偏差值,并触发PID控制算法。

    总结

    本文通过一个实际案例,详细介绍了PID控制算法的基本原理及其在直流电机控制中的应用。PID控制算法的核心在于参数的确定和调节,而直流电机的控制则主要依赖于PWM技术。通过本文的实现,可以清晰地看到PID算法的优势以及其在嵌入式系统中的实际应用价值。

    如果对PID控制算法的改进方法或其他控制算法感兴趣,可以关注公众号“24K纯学渣”,回复关键词“PID电机控制”即可获取相关资源。如有任何疑问或建议,欢迎在评论区留言交流。

    转载地址:http://prwv.baihongyu.com/

    你可能感兴趣的文章
    Python:使用 shell=False 的子进程调用不起作用
    查看>>
    Python:修改 PATH 环境变量的平台无关方式
    查看>>
    Python:假与 0
    查看>>
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>