/*double kp = 0.1;
double ki = 0.01;
double kd = 0.001;*/
//改变系数,调整加减速度
double kp = 0.2;
double ki = 0.01;
double kd = 0.01;
uint16_t target_adc_value = 260;
uint16_t min_pwm_output = 0;
uint16_t max_pwm_output = 1000;
double integral = 0.00;
double previous_error = 0.00;
uint16_t current_pwm_output = 500;
double derivative=0.00;
double output=0.00;
uint16_t adc_value=0;
double error=0.00;
void pid_init(void)
{
min_pwm_output=0;
max_pwm_output = 1000;
integral=0;
previous_error=0;
}
double alpha = 0.5;
double threshold = 0.1;
double adaptive_kp = 0.00;
double adaptive_ki = 0.00;
double adaptive_kd = 0.00;
double pid_output = 0.00;
double error_change = 0.00;
void adaptive_algorithm(void)
{
pid_output=0.00;
error_change=0.00;
error_change = fabs(error - previous_error);
if (error_change > threshold) {
adaptive_kp = adaptive_kp * (1 - alpha) + alpha * kp;
adaptive_ki = adaptive_ki * (1 - alpha) + alpha * ki;
adaptive_kd = adaptive_kd * (1 - alpha) + alpha * kd;
}
pid_output = adaptive_kp * error + adaptive_ki + adaptive_kd * (error - previous_error);
#if defined(PRINTF_ON)
printf("pid_output:%0.2f\r\n",pid_output);
#endif
}
//自适应算法,加减速度比较慢的,非常平衡
void pid_algorithm(uint16_t adcc)
{
derivative=0.00;
output=0.00;
adc_value=0;
error=0.00;
adc_value = adcc;
error = target_adc_value - adc_value;
integral += error;
derivative = error - previous_error;
output = kp * error + ki * integral + kd * derivative;
printf("error:%d integral:%0.2f derivative:%0.2f\r\n",error,integral,derivative);
printf("Proportional: %.2f, Integral: %.2f, Derivative: %.2f\n", kp * error, ki *integral, kd * derivative);
printf("output:%0.2f\r\n",output);
adaptive_algorithm();
current_pwm_output += (int)(pid_output);
if (current_pwm_output < min_pwm_output) {
current_pwm_output = min_pwm_output;
} else if (current_pwm_output > max_pwm_output) {
current_pwm_output = max_pwm_output;
}
printf("current_pwm_output:%d\r\n",current_pwm_output);
//set_pwm_output(current_pwm_output);
if(!light_Param_t.light_status)set_Param_L.set_lrgbcw=0;
else {set_Param_L.set_lrgbcw=current_pwm_output;}
set_run_param(&set_Param_L,DELAY_TIME_L);
previous_error = error;
}
输出pwm维持adc采集,自适应pid算法
于 2024-03-23 12:03:37 首次发布
文章介绍了使用PID控制器进行电机速度控制的示例,涉及自适应算法调整PID参数,以实现加速度变化平滑且响应快速的电机控制。算法通过计算误差、积分和微分来调整PWM输出,确保电机达到目标ADC值。
摘要由CSDN通过智能技术生成