1,040
社区成员




这是我参加朝闻道知识分享大赛的第七篇文章
目录
上期我们讲解了通过逻辑语句完成循迹,本次我们将通过pid控制完成循迹,通过七路灰度传感进行循迹并且用HAL函数进行编写。并且本次使用stm32c8t6单片机进行配置。
七路传感器配置
电机配置
时钟配置
随后点击生成project即可
循迹代码
uint16_t check1,check2,check3,check4,check5,check6,check7;
void JK_XJ7()
{
check1=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)*15;
check2=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)*5;
//check3=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2);
check4=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3);
// check5=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);
check6=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)*5;
check7=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)*15;
}
void Grayscale_Tracking()
{
float Kp = 1.0;
//float Ki = 0.5;
float Kd = 0.2;
float error1 = 0.0;
float error2 = 0.0;
float last_error1 = 0.0;
float last_error2 = 0.0;
//float integral = 0.0;
JK_XJ7();
// 读取循迹传感器的值
float sensor_value1 = check1;
float sensor_value2 = check2;
float sensor_value6 = check6;
float sensor_value7 = check7;
// 计算误差
error1 = sensor_value1+sensor_value2;
error2 = sensor_value6+sensor_value7;
// 计算误差累积项
//integral += error;
// 计算误差变化项
float derivative1 = error1 - last_error1;
float derivative2 = error2 - last_error2;
// 计算PID输出
float output1 = Kp * error1 + Kd * derivative1;
float output2 = Kp * error2 + Kd * derivative2;
// 输出控制信号到电机
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,output1+10);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,output2+10);
// 更新误差变量
last_error1 = error1;
last_error2 = error2;
}
主函数中对所需端口初始化并且调试到前进运动即可
SystemClock_Config();
HAL_Init();
MX_GPIO_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);
注:每个电机的速度需要进行调试,故pid的值也有所变化。
通过pid调试的小车运行可以更加灵活,不受上一期程序未知逻辑的影响。
小车循迹的两种程序就介绍到这里了