【STM32 HAL】用旋钮电位器进行PID调参

本文介绍了一种用于简化PID参数调整的硬件设计,通过电位器采集电压并转换为PID参数。在软件部分,使用STM32HAL库实现了ADC和DMA的配置,以及外部中断处理,实现在按钮触发时快速读取PID参数。这种方法避免了反复烧录程序的麻烦,提高了调试效率。

pid调参很麻烦是怎么回事呢?pid相信大家都很熟悉,但是pid调参很麻烦是怎么回事呢,下面就让小编带大家一起了解吧。
pid调参很麻烦,其实就是因为每改一次就要重新烧录程序,大家可能会很惊讶pid怎么会调参很麻烦呢?但事实就是这样,小编也感到非常惊讶。
这就是关于pid调参很麻烦的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!

所以小编做了一个简单的小工具——

1 硬件设计

思路就是采集三个电位器分得的电压值,经过换算后作为PID的参数值。当然你也可以把它用来调节其他参数
原理图
PCB
3D预览
设计很简单,转动三个旋钮电位器到合适位置,按下按键,SW被拉高,上升沿触发ADC采样,此时获得的三个电压值经过换算就可以作为PID的参数。

2 软件设计

这里给出STM32 HAL库的示例

2.1 CubeMX设置

基本配置

RCC、SYS、串口、时钟树之类的,略过不表

ADC+DMA

在这里插入图片描述
这里不开连续转换模式,每次开启转换后只采样一次就停止,和我们的要求相符

在这里插入图片描述
这里采样时间设置得稍微大一点就行

在这里插入图片描述

外部中断

在这里插入图片描述
根据电路,这里要配置成上升沿触发中断、下拉

在这里插入图片描述
中断一定要记得使能!
因为我们要在回调函数里用delay进行按键消抖,所以一定要把外部中断的优先级调得比系统时钟低,否则程序会卡在回调函数里

2.2 代码

魔术棒里勾选Use MicroLlB和Reset and Run

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

/* USER CODE BEGIN PV */
uint16_t AD_Value[3];
/* USER CODE END PV */
/* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == SW_Pin)
	{
		HAL_Delay(20);
		if(HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin) == GPIO_PIN_SET)
		{
			//HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
			printf("Button triggered!\r\n");
      		HAL_ADC_Start_DMA(&hadc1,(uint32_t *)AD_Value,3);
		}
	}
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  HAL_ADC_Stop_DMA(&hadc1);
  printf("P:%d I:%d D:%d\r\n", AD_Value[0], AD_Value[1], AD_Value[2]);
}
/* USER CODE END 4 */

进入中断回调函数后,先delay消抖,然后开启ADC DMA传输,DMA传输完成后在回调函数里关闭DMA,这一次读取就完成了。AD_Value里的数据经过换算后就可以作为PID的参数

3 效果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值