#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);
}
STM32用标准库函数的直流电机PID程序
于 2023-06-25 10:31:32 首次发布