PWM模拟DAC电压输出-PID仿真贴

2020-02-10 08:56发布

为了学习PID是怎么回事,特别做了此仿真,呵呵, 也可以说是<如何让PID的值转换成PWM的占空比>!

本人之前对PID一点都不懂,此贴主要是和大家分享学习经验!呵呵, 菜鸟贴, 不对的地方请大家拍砖!

此仿真采用的是PIC单片机, 由P1A引脚输出PWM,经过RC滤波后输出电压,AN0  ADC采样


先贴图吧!
PID算法是用的AVR: AVR221: Discrete PID controller 中的源码
//VFER = 2.048v, 10位分辨率(1024),设定稳压电压是1.024v
atmel_1.PNG (29.39 KB, 下载次数: 1) 下载附件 2013-10-26 10:56 上传

最后........
上源码:
ATMEL_ PWM_adc_pid_4.rar (2.24 MB, 下载次数: 348) 2013-10-26 10:58 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
56条回答
skype
2020-02-10 09:05
下面是两种常见算法的PID仿真图表:
#ifndef __PID_1_H
#define __PID_1_H

typedef struct PID
{   
        double  SetPoint;           //  设定目标 Desired Value   
       
        double  Proportion;         //  比例常数 Proportional Const   
        double  Integral;           //  积分常数 Integral Const   
        double  Derivative;         //  微分常数 Derivative Const   
       
        double  LastError;          //  Error[-1]   
        double  PrevError;          //  Error[-2]   
        double  SumError;           //  Sums of Errors   

}PID;   

extern void PIDInit(PID *pp);
extern double PIDCalc(PID *pp, double NextPoint);
#endif


#include "pid_1.h"
#include <string.h>

void PIDInit(PID *pp)
{   
    memset(pp, 0, sizeof(PID));   
}   

double PIDCalc(PID *pp, double NextPoint)//这里是位置式算法   
{   
    double  dError, Error;   
   
    Error = pp->SetPoint -  NextPoint;          // 偏差,   偏差=设定值-返回值
    pp->SumError += Error;                      // 积分项, 偏差和   
    dError = pp->LastError - pp->PrevError;     // 微分项  上一次误差-上上一次误差   
    pp->PrevError = pp->LastError;   
    pp->LastError = Error;   
    return (pp->Proportion * Error              // 比例项   
        +   pp->Integral * pp->SumError         // 积分项   
        +   pp->Derivative * dError             // 微分项   
    );   
}   

3.PNG (17.69 KB, 下载次数: 1)

下载附件

2013-10-26 11:30 上传



一周热门 更多>