⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bldcmotorcontrol-avr447控制器源程序.txt

📁 这个包括PIC控制器
💻 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 + -