输出pwm维持adc采集,自适应pid算法

文章介绍了使用PID控制器进行电机速度控制的示例,涉及自适应算法调整PID参数,以实现加速度变化平滑且响应快速的电机控制。算法通过计算误差、积分和微分来调整PWM输出,确保电机达到目标ADC值。
摘要由CSDN通过智能技术生成
/*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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌风_lwp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值