📄 bldcmotorcontrol-avr447控制器源程序.txt
字号:
/* This file has been prepared for Doxygen automatic documentation generation.*/
/*! \file *********************************************************************
*
* \brief
* PID controller.
*
* This file contains the PID controller, based on the AVR221 application
* note.
*
* \par Application note:
* AVR447: Sinusoidal driving of three-phase permanent motor using
* ATmega48/88/168
*
* \par Documentation
* For comprehensive code documentation, supported compilers, compiler
* settings and supported devices see readme.html
*
* \author
* Atmel Corporation: http://www.atmel.com \n
* Support email: avr@atmel.com
*
* $Name: RELEASE_1_0 $
* $Revision: 1.2 $
* $RCSfile: pid.c,v $
* $Date: 2006/03/16 08:00:21 $ \n
******************************************************************************/
#include <ioavr.h>
#include "stdint.h"
#include "pid.h"
/*! \brief Initialisation of PID controller parameters.
*
* Initialise the variables used by the PID algorithm.
*
* \param p_factor Proportional term.
* \param i_factor Integral term.
* \param d_factor Derivate term.
* \param pid Struct with PID status.
*/
void PID_Init(int16_t p_factor, int16_t i_factor, int16_t d_factor, pidData_t *pid)
// Set up PID controller parameters
{
// Start values for PID controller
pid->sumError = 0;
pid->lastProcessValue = 0;
// Tuning constants for PID loop
pid->P_Factor = p_factor;
pid->I_Factor = i_factor;
pid->D_Factor = d_factor;
// Limits to avoid overflow
pid->maxError = MAX_INT / pid->P_Factor;
pid->maxSumError = MAX_I_TERM / pid->I_Factor;
}
/*! \brief PID control algorithm.
*
* Calculates output from setpoint, process value and PID status.
*
* \param setPoint Desired value.
* \param processValue Measured value.
* \param pid_st PID status struct.
*/
int16_t PID_Controller(int16_t setPoint, int16_t processValue, pidData_t *pid_st)
{
int16_t error, p_term, d_term;
int32_t i_term;
int32_t ret;
int32_t temp;
error = setPoint - processValue;
// Calculate Pterm and limit error overflow
if (error > pid_st->maxError)
{
p_term = MAX_INT;
}
else if (error < -pid_st->maxError)
{
p_term = -MAX_INT;
}
else
{
p_term = pid_st->P_Factor * error;
}
// Calculate Iterm and limit integral runaway
temp = pid_st->sumError + error;
if(temp > pid_st->maxSumError)
{
i_term = MAX_I_TERM;
pid_st->sumError = pid_st->maxSumError;
}
else if(temp < -pid_st->maxSumError)
{
i_term = -MAX_I_TERM;
pid_st->sumError = -pid_st->maxSumError;
}
else
{
pid_st->sumError = temp;
i_term = pid_st->I_Factor * pid_st->sumError;
}
// Calculate Dterm
d_term = pid_st->D_Factor * (pid_st->lastProcessValue - processValue);
pid_st->lastProcessValue = processValue;
ret = (p_term + i_term + d_term) / SCALING_FACTOR;
if(ret > MAX_INT)
{
ret = MAX_INT;
}
else if(ret < -MAX_INT)
{
ret = -MAX_INT;
}
return((int16_t)ret);
}
/*! \brief Resets the integrator.
*
* Calling this function will reset the integrator in the PID regulator.
*/
void PID_Reset_Integrator(pidData_t *pid_st)
{
pid_st->sumError = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -