基于stm32通过pid控制循迹| “朝闻道”知识分享大赛

LightingJJ 2024-12-04 19:22:45

 这是我参加朝闻道知识分享大赛的第七篇文章

目录

一.说明

二.stm32cubeMX配置

三.程序

四.总结


一.说明

上期我们讲解了通过逻辑语句完成循迹,本次我们将通过pid控制完成循迹,通过七路灰度传感进行循迹并且用HAL函数进行编写。并且本次使用stm32c8t6单片机进行配置。

二.stm32cubeMX配置

七路传感器配置

电机配置

时钟配置

 随后点击生成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调试的小车运行可以更加灵活,不受上一期程序未知逻辑的影响。

小车循迹的两种程序就介绍到这里了

...全文
98 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,040

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧