微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > 利用DSP2812编写直流电机PID调速程序(C语言)

利用DSP2812编写直流电机PID调速程序(C语言)

时间:10-02 整理:3721RD 点击:
本人现在已经通过DSP2812中SCIA接收上位机发送的数据来控制电机的转速,采用CAP3来捕获光电编码器来测量电机的转速,现在想在程序里面添加PID调节电机的转速,主要通过PID输出调整PWM波形的占空比来调节电机的转速,请各位大神赐教

赞赞赞赞赞赞赞赞赞赞

回帖是美德!

看小编所说,现在是由上位机来控制电机转速,现在是想加入PID来实现电机转速的调速。小编可以先将上位机发送给DSP的数据作为电机转速的目标值,由CAP采集回来的编码器的值作为当前的电机转速值,然后通过标准PID公式进行控制即可(PID这一块可以在网上查点资料了解一下)。祝小编能够顺利实现串口+PID电机控制!

请联系我,数字增量式PID调节,PWM输出

你好,我已经实现了上位机发送数据控制电机转速,并CAP捕获光电编码器的值计算电机转速,但是我不晓得该把PID程序放在什么位置,什么时候进行调速,可否指导一下

你可以单独建一个PID源文件,PID主要用于反馈回来的电机实际转速的参数进行矫正,比如在这里,DSP从上位机接收到了电机转速的目标值,而实际的转速值与设定的目标值不一致,就可以通过PID控制让实际转速达到目标值。PID程序放在哪里不重要,重要的是你要调用PID的子程序来实现参数的控制,将PID处理过的数据,转变为控制电机的实际转速值,去主程序执行就可以了。

可以加我QQ:1159461528,跟你请教一下嘛?

你好,想向你请教一下,PID的输出与PWM占空比的关系,如果用PID的输出调节PWM占空比是不是就把PID的输出直接加到PWM占空比上,还是要经过一定的比例关系再加到PWM占空比上?

你好,由于白天上班,所以QQ不好回复,请谅解。
PID和PWM的关系是这样的:PID和PWM是独立的,但是PID可以影响PWM占空比的输出,也就是说,PID调整后会产生一个值,那么这个值是一个参考值,你在程序用的时候是需要判断这个参考值在什么范围内,然后在相应的范围内再给出对应的PWM占空比,这是一种PID与PWM的处理方式。
PID就是(比例+积分+微分)P+I+D,实际使用中可以是PI控制,也可以是PD控制,也可以是PID控制,需要根据实际情况做相应的调整。
小编现在应该分清楚PID只是一种算法,它服务于其他控制类函数,比如就是PWM控制。
给小编总结一下:1、PID和PWM是独立的个体,不是把PID的处理后的调整值直接作为PWM的占空比,除非你用PID处理后的值是整数并且在PWM占空比精度范围内,那就直接作为PWM占空比是可以的。2、PID处理就包括了比例、积分、微分,是将实际值进行比例积分微分运算后去快速地尽可能地稳定在设定值附近。

这应该挺简单的吧。PID主要是在固定的时间内,通过负反馈调节当前输出,即目标速度=当前速度+增量;即可达到直流电机线性输出的效果。光编当前速度你已经有了,目标速度有了,解决增量问题需要调节比例、积分、微分值就可以实现了。附上贴,原理一样的,如果适用,麻烦点一下标准答案,谢谢【教程】如何在STM32上实现增量式PID转
http://bbs.elecfans.com/jishu_484125_1_1.html
(出处: 中国电子技术论坛)

对了,关于什么时候调节的问题,可以做一个100MS的定时器,定时器去读出速度,然后进行PID调节,编码器测速也很好做,用M/T法测速直接就可以用了

//主函数
void main(void)
{
        InitSysCtrl();
        DINT;
        IER=0x0000;
        IFR=0x0000;
        InitPieCtrl();
        InitPieVectTable();
        InitCpuTimers();
        InitGpio();
        InitEv();
        InitSci();
        InitPeripherals();
        //变量初始化
        Speedlimit=10;
        OutMax=Speedlimit;
        OutMin=-Speedlimit;
        n1=0;
        for(i=0;i 1500)
     {
             t1cmpr=1500;
     }
     else
     {
             t1cmpr=duty;
     }
     EvaRegs.T1CMPR=t1cmpr;
            Out_1=Out;
            Err_2=Err_1;
            Err_1=Err;
            }
    EvaRegs.EVAIFRA.bit.T1PINT=1;
    EvaRegs.EVAIMRA.bit.T1PINT=1;
    PieCtrl.PIEACK.bit.ACK2=1;
    EINT;
}
上面是我自己编写的程序,测速采用的T法测速,请你帮忙看一下,谢谢

看看吧!看看吧!

小编解决问题了嘛?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top