pid调参很麻烦是怎么回事呢?pid相信大家都很熟悉,但是pid调参很麻烦是怎么回事呢,下面就让小编带大家一起了解吧。
pid调参很麻烦,其实就是因为每改一次就要重新烧录程序,大家可能会很惊讶pid怎么会调参很麻烦呢?但事实就是这样,小编也感到非常惊讶。
这就是关于pid调参很麻烦的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!
所以小编做了一个简单的小工具——
1 硬件设计
思路就是采集三个电位器分得的电压值,经过换算后作为PID的参数值。当然你也可以把它用来调节其他参数
设计很简单,转动三个旋钮电位器到合适位置,按下按键,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的参数