#include "main.h" #include "headfile.h" unsigned int adc_value[5]; int error[2]; float kp = 1.1; float kd = 0.5; unsigned int left_motor_duty; unsigned int right_motor_duty; unsigned int motor_duty_center = 3000; int main(void) { car_init(); while(1) { adc_value[0] = adc_get(ADC0, ADC_CH_10); adc_value[1] = adc_get(ADC0, ADC_CH_11); adc_value[2] = adc_get(ADC0, ADC_CH_12); adc_value[3] = adc_get(ADC0, ADC_CH_13); adc_value[4] = adc_get(ADC0, ADC_CH_15); car_race(); } } void car_race() { error[0] = adc_value[0] - adc_value[4]; int speed_c = (int)(error[0] * kp + (error[0] + error[1]) * kd); left_motor_duty = motor_duty_center - speed_c; right_motor_duty = motor_duty_center + speed_c; error[1] = error[0]; if(left_motor_duty > 10000) { left_motor_duty = 10000; } else if(left_motor_duty < 0) { left_motor_duty = 0; } if(right_motor_duty > 10000) { right_motor_duty = 10000; } else if(right_motor_duty < 0) { right_motor_duty = 0; } motor_forward(left, left_motor_duty); motor_forward(right, right_motor_duty); }修改为可采集电感值,使用滑动滤波算法,将得到的值进行归一化,并用PID算法控制电机实现转向
时间: 2024-04-17 21:28:25 浏览: 109
UART.h c语言编写
4星 · 用户满意度95%
```
#include "main.h"
#include "headfile.h"
unsigned int adc_value[5];
int error[2];
float kp = 1.1;
float ki = 0.2;
float kd = 0.5;
unsigned int left_motor_duty;
unsigned int right_motor_duty;
unsigned int motor_duty_center = 3000;
int main(void)
{
car_init();
while (1)
{
// Read ADC values
adc_value[0] = adc_get(ADC0, ADC_CH_10);
adc_value[1] = adc_get(ADC0, ADC_CH_11);
adc_value[2] = adc_get(ADC0, ADC_CH_12);
adc_value[3] = adc_get(ADC0, ADC_CH_13);
adc_value[4] = adc_get(ADC0, ADC_CH_15);
// Apply sliding window filter
unsigned int filtered_adc_value[5] = {0};
for (int i = 0; i < 5; i++)
{
filtered_adc_value[i] = (adc_value[i] + adc_value[(i + 1) % 5] + adc_value[(i + 2) % 5]) / 3;
}
// Normalize ADC values to -1 to 1 range
float normalized_adc_value[5] = {0.0};
for (int i = 0; i < 5; i++)
{
normalized_adc_value[i] = (filtered_adc_value[i] - 2000) / 1000.0;
}
// Calculate error and perform PID control for steering
error[0] = normalized_adc_value[0] - normalized_adc_value[4];
int speed_c = (int)(error[0] * kp + (error[0] - error[1]) * kd);
left_motor_duty = motor_duty_center - speed_c;
right_motor_duty = motor_duty_center + speed_c;
error[1] = error[0];
// Clamp motor duty values
if (left_motor_duty > 10000)
{
left_motor_duty = 10000;
}
else if (left_motor_duty < 0)
{
left_motor_duty = 0;
}
if (right_motor_duty > 10000)
{
right_motor_duty = 10000;
}
else if (right_motor_duty < 0)
{
right_motor_duty = 0;
}
// Control the motors for track tracing
motor_forward(left, left_motor_duty);
motor_forward(right, right_motor_duty);
}
}
```
在这个修改后的代码中,我们首先对采集到的ADC值应用了滑动窗口滤波算法,然后将滤波后的值进行归一化处理。接着,我们计算了当前的误差并使用PID算法对电机的转向进行控制。最后,我们对电机的占空比进行了限制,并通过调用motor_forward函数实现了电机的控制。
请注意根据您的具体硬件和需求进行适当的调整和修改。
阅读全文