STM32用标准库函数的直流电机PID程序

#include "stm32f10x.h"

// 定义电机控制引脚
#define MOTOR_PIN1 GPIO_Pin_0
#define MOTOR_PIN2 GPIO_Pin_1

// PID参数
float Kp = 1.0;
float Ki = 0.5;
float Kd = 0.2;

// 目标速度和当前速度
int targetSpeed = 1000;
int currentSpeed = 0;

// PID变量
float error = 0;
float previousError = 0;
float integral = 0;
float derivative = 0;

void GPIO_Configuration(void);
void TIM_Configuration(void);

int main(void)
{
    GPIO_Configuration();
    TIM_Configuration();

    while (1)
    {
        // 读取编码器计数值并计算当前速度
        int encoderCount = TIM_GetCounter(TIM2);
        currentSpeed = encoderCount * 10; // 假设每个计数对应10个脉冲

        // 计算PID控制量
        error = targetSpeed - currentSpeed;
        integral += error;
        derivative = error - previousError;

        float control = Kp * error + Ki * integral + Kd * derivative;

        // 限制控制量在PWM范围内
        if (control > TIM2->ARR)
            control = TIM2->ARR;
        else if (control < 0)
            control = 0;

        // 设置PWM输出占空比
        TIM_SetCompare1(TIM2, control);

        previousError = error;
    }
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置GPIOA引脚为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = MOTOR_PIN1 | MOTOR_PIN2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能TIM2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    // 配置TIM2基本参数
    TIM_TimeBaseStructure.TIM_Period = 999; // PWM周期为1000个计数,对应1ms
    TIM_TimeBaseStructure.TIM_Prescaler = 71; // APB1时钟频率为72MHz,预分频系数为72-1,得到1MHz的计数频率
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    // 配置TIM2通道1为PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);

    // 使能TIM2预装载寄存器
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    // 使能TIM2
    TIM_Cmd(TIM2, ENABLE);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值