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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 效果

在这里插入图片描述

<think>嗯,用户问的是如何提高PWM的占空比。首先,我需要确定用户的基本需求是什么。可能他们正在使用PWM控制电机或其他设备,遇到了占空比调整的问题,比如之前的电机不转但有声音的情况,现在想通过调整占空比来解决。 接下来,我需要回顾PWM的基本原理。占空比是指高电平时间占整个周期的比例,提高占空比意味着增加高电平的时间,从而平均电压或电流会上升。这在控制电机转速或LED亮度时很常见。 然后,用户可能的场景是什么?他们可能在使用微控制器(比如Arduino、STM32)或者某些驱动模块来控制PWM。不同的硬件调整占空比的方法不同,所以需要覆盖常见的平台和方法。 还要考虑用户的技术水平。他们可能对编程或硬件有一定了解,但需要具体的步骤指导。比如,如何在代码中修改占空比的值,或者如何通过旋钮等物理方式调整。 另外,需要检查用户之前的问题,他们提到电机发出嗡嗡声但不转动,之前建议提高占空比。现在用户可能是在尝试实施这个建议,但不知道具体怎么做。需要确保回答清晰,分步骤说明,包括软件和硬件的调整方法。 可能还需要考虑占空比调整后的影响,比如过高的占空比可能导致电机过热或驱动电路过载,所以提醒用户注意安全范围和额定参数。 最后,要确保回答结构清晰,步骤明确,涵盖不同方法,比如编程调整、使用电位器、闭环控制等,帮助用户全面了解如何提高占空比,并选择适合他们情况的方法。</think>提高PWM(脉宽调制)的占空比通常涉及硬件配置或软件编程的调整。以下是不同场景下的具体方法,按实现方式分类说明: --- ### **一、通过编程调整占空比** #### **1. 微控制器(如Arduino、STM32)** - **原理**:通过修改PWM控制寄存器中的比较值(Compare Value)或直接调整占空比参数。 - **步骤**: 1. **Arduino示例**: ```cpp int pwmPin = 9; // PWM输出引脚 void setup() { pinMode(pwmPin, OUTPUT); } void loop() { analogWrite(pwmPin, 200); // 占空比=200/255≈78%(0~255范围) } ``` - **关键参数**:`analogWrite()`的第二个参数(0~255)对应占空比。 2. **STM32 HAL库示例**: ```c TIM_HandleTypeDef htim; htim.Instance = TIM1; // 使用定时器TIM1 htim.Init.Prescaler = 83; // 分频系数 htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 999; // 自动重装载值(ARR),决定PWM频率 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, 750); // 占空比=750/1000=75% ``` - **公式**:占空比 = $ \frac{\text{比较值(CCR)}}{\text{自动重装载值(ARR)+1}} \times 100\% $ #### **2. 嵌入式Linux(如树莓派)** - **原理**:通过sysfs接口或Python库控制PWM。 - **步骤**: ```bash # 启用PWM通道(以树莓派GPIO18为例) echo 1 > /sys/class/pwm/pwmchip0/export # 设置周期(单位:ns,例如20ms周期对应20000000ns) echo 20000000 > /sys/class/pwm/pwmchip0/pwm0/period # 设置占空比(例如1.5ms高电平对应1500000ns) echo 1500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 启用PWM输出 echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable ``` --- ### **二、通过硬件电路调整占空比** #### **1. 使用电位器模拟控制** - **原理**:通过电压比较器或专用PWM芯片(如555定时器),用模拟电压调节占空比。 - **电路示例(555定时器)**: - 调节电位器$R_1$可改变充电时间,调节$R_2$可改变放电时间。 - **占空比公式**:$ D = \frac{R_1}{R_1 + R_2} \times 100\% $ (需满足$R_1 + R_2 \ll$ 定时电容充放电时间常数) #### **2. 专用PWM驱动芯片** - **示例**:使用TL494、SG3525等芯片,通过调整反馈电压或外接电阻分压。 - **方法**:修改芯片的误差放大器输入电压(如通过电位器分压),直接改变输出占空比。 --- ### **三、通过闭环控制动态调整** #### **1. 基于反馈的PID控制** - **场景**:需要根据实际输出(如电机转速、温度)自动调节占空比。 - **实现步骤**: 1. 采集传感器数据(如编码器脉冲、温度探头)。 2. 计算目标值与实际值的误差。 3. 通过PID算法更新占空比: $$ \text{PWM}_{\text{new}} = K_p \cdot e(t) + K_i \cdot \int e(t) dt + K_d \cdot \frac{de(t)}{dt} $$ 4. 将计算结果限制在PWM有效范围内(如0~100%)。 --- ### **四、注意事项** 1. **硬件限制**: - 确保PWM频率不超过驱动电路或负载的允许范围(如MOSFET开关损耗)。 - 避免占空比接近100%时因死区时间导致控制失效。 2. **软件约束**: - 微控制器的PWM分辨率有限(如8位分辨率下最小步进为$ \frac{1}{256} \approx 0.4\% $)。 3. **安全保护**: - 对电机或LED等负载,需确保占空比不超过额定参数(如最大电流/电压)。 --- ### **五、调试工具** - **示波器**:直接观察PWM波形,验证占空比是否准确。 - **逻辑分析仪**:捕获多路PWM信号时序。 - **万用表**:测量平均输出电压(验证公式:$ V_{\text{avg}} = D \cdot V_{\text{in}} $)。 通过以上方法,可灵活调整PWM占空比以满足不同应用需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值