返回

STM32-PI 调节直流电机速度

人工智能

前言

直流电机是一种非常常用的电机,在许多领域都有着广泛的应用。为了能够更精确地控制直流电机的速度,人们发明了 PI 调节器。PI 调节器是一种常用的控制算法,它能够通过不断地调整电机的输入电压来使电机的速度保持在一个设定值附近。

PI 调节器的基本原理

PI 调节器是一种线性的、反馈的控制系统。它通过测量系统的输出与期望值之间的误差,然后将误差作为输入,来计算出需要施加到系统上的控制量。PI 调节器的基本结构如下图所示:

[图片]

其中,

  • r(t) 是期望值
  • y(t) 是实际值
  • e(t) = r(t) - y(t) 是误差
  • u(t) 是控制量
  • K_p 是比例增益
  • K_i 是积分增益

PI 调节器的控制律为:

u(t) = K_p e(t) + K_i \int_{0}^{t} e(\tau) d\tau

比例增益 K_p 控制着系统对误差的反应速度。积分增益 K_i 控制着系统消除误差的能力。

使用 STM32 实现 PI 调节器

为了使用 STM32 来实现 PI 调节器,我们需要用到 STM32 的定时器和 ADC。定时器用于产生 PWM 波形,ADC 用于测量电机的速度。

硬件连接

硬件连接如下图所示:

[图片]

其中,

  • STM32 的 PA0 引脚连接到 L298N 的 IN1 引脚
  • STM32 的 PA1 引脚连接到 L298N 的 IN2 引脚
  • STM32 的 PA4 引脚连接到直流电机的编码器的 A 相
  • STM32 的 PA5 引脚连接到直流电机的编码器的 B 相

软件实现

软件实现主要包括以下几个部分:

  • 初始化定时器和 ADC
  • 配置 PWM 波形
  • 测量电机的速度
  • 计算 PI 调节器的控制量
  • 输出 PWM 波形

代码示例

以下是一个完整的代码示例,您可以将其用在自己的项目中:

#include "stm32f10x.h"

/*
 * 函数名:main
 * 主函数
 * 参数:无
 * 返回值:无
 */
int main(void)
{
    // 初始化定时器和 ADC
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    ADC_InitTypeDef ADC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM2, ENABLE);
    TIM_Cmd(TIM2, ENABLE);

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1) != ADC_CALIB_OK);
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1) != ADC_CALIB_OK);

    // 配置 PWM 波形
    TIM_SetCompare1(TIM2, 0);

    // 测量电机的速度
    uint16_t adc_value = 0;

    // 计算 PI 调节器的控制量
    float error = 0;
    float integral = 0;
    float control_value = 0;

    // 输出 PWM 波形
    while (1)
    {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
        adc_value = ADC_GetConversionValue(ADC1);

        error = 1000 - adc_value;
        integral += error;

        control_value = 0.5 * error + 0.05 * integral;

        if (control_value > 100)
        {
            control_value = 100;
        }
        else if (control_value < 0)
        {
            control_value = 0;
        }

        TIM_SetCompare1(TIM2, control_value);
    }

    return 0;
}

结语

通过使用 STM32 和 PI 调节器,我们可以非常精确地控制直流电机的速度。这在许多领域都有着广泛的应用,例如机器人、数控机床和医疗设备等。