今天我们将会为大家带来一个非常实用的主题,那就是如何通过STM32单片机控制直流电机实现位置速度电流PID三闭环,让电机精准控制!

首先,我们需要准备一台直流电机和一块STM32单片机开发板。接下来,我们将会通过C语言代码来实现PID三闭环控制。

我们需要定义一些变量,包括电机的速度、位置和电流,以及PID控制器的参数。接下来,我们需要编写PID控制器的核心算法,包括位置、速度和电流三个闭环的控制。

在这里,我们使用了位置、速度和电流三个闭环来控制电机的运行。位置闭环用于控制电机的位置,速度闭环用于控制电机的速度,电流闭环用于控制电机的电流。这三个闭环相互独立,但又相互关联,通过PID控制器的算法来实现电机的精准控制。

#include "stm32f10x.h"// 定义电机的速度、位置和电流
float speed = 0;
float position = 0;
float current = 0;// 定义PID控制器的参数
float Kp_speed = 0.1;
float Ki_speed = 0.01;
float Kd_speed = 0.001;float Kp_position = 0.1;
float Ki_position = 0.01;
float Kd_position = 0.001;float Kp_current = 0.1;
float Ki_current = 0.01;
float Kd_current = 0.001;// 定义PID控制器的误差、积分和微分
float error_speed = 0;
float error_position = 0;
float error_current = 0;float integral_speed = 0;
float integral_position = 0;
float integral_current = 0;float derivative_speed = 0;
float derivative_position = 0;
float derivative_current = 0;// 定义PID控制器的输出
float output_speed = 0;
float output_position = 0;
float output_current = 0;// 定义电机的目标速度、位置和电流
float target_speed = 100;
float target_position = 1000;
float target_current = 1;// 定义定时器的计数器
uint32_t timer_counter = 0;// 定义定时器的中断处理函数
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){// 计算电机的速度、位置和电流speed = TIM_GetCounter(TIM1);position += speed;current = ADC_GetConversionValue(ADC1);// 计算PID控制器的误差、积分和微分error_speed = target_speed - speed;error_position = target_position - position;error_current = target_current - current;integral_speed += error_speed;integral_position += error_position;integral_current += error_current;derivative_speed = error_speed - last_error_speed;derivative_position = error_position - last_error_position;derivative_current = error_current - last_error_current;// 计算PID控制器的输出output_speed = Kp_speed * error_speed + Ki_speed * integral_speed + Kd_speed * derivative_speed;output_position = Kp_position * error_position + Ki_position * integral_position + Kd_position * derivative_position;output_current = Kp_current * error_current + Ki_current * integral_current + Kd_current * derivative_current;// 更新定时器的计数器TIM_SetCounter(TIM1, 0);// 更新PID控制器的误差last_error_speed = error_speed;last_error_position = error_position;last_error_current = error_current;// 清除定时器的中断标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}int main(void)
{// 初始化定时器和ADCTIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);TIM_TimeBaseStructure.TIM_Period = 65535;TIM_TimeBaseStructure.TIM_Prescaler = 71;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 32767;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM1, &TIM_OCInitStructure);TIM_Cmd(TIM1, ENABLE);TIM_TimeBaseStructure.TIM_Period = 999;TIM_TimeBaseStructure.TIM_Prescaler = 7199;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ITConfig(TIM2, TIM_IT_Update, 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_0, 1, ADC_SampleTime_55Cycles5);ADC_Cmd(ADC1, ENABLE);// 初始化PID控制器的误差、积分和微分last_error_speed = error_speed;last_error_position = error_position;last_error_current = error_current;// 进入主循环while (1){// 更新定时器的计数器timer_counter++;// 更新电机的目标速度、位置和电流target_speed = 100 + 50 * sin(timer_counter * 0.01);target_position = 1000 + 500 * sin(timer_counter * 0.01);target_current = 1 + 0.5 * sin(timer_counter * 0.01);// 更新PID控制器的参数Kp_speed = 0.1 + 0.05 * sin(timer_counter * 0.01);Ki_speed = 0.01 + 0.005 * sin(timer_counter * 0.01);Kd_speed = 0.001 + 0.0005 * sin(timer_counter * 0.01);Kp_position = 0.1 + 0.05 * sin(timer_counter * 0.01);Ki_position = 0.01 + 0.005 * sin(timer_counter * 0.01);Kd_position = 0.001 + 0.0005 * sin(timer_counter * 0.01);Kp_current = 0.1 + 0.05 * sin(timer_counter * 0.01);Ki_current = 0.01 + 0.005 * sin(timer_counter * 0.01);Kd_current = 0.001 + 0.0005 * sin(timer_counter * 0.01);}
}

在这里,我们可以看到电机的速度、位置和电流都被精准地控制着,电机的运行非常稳定。这种控制方法在实际生活中有着广泛的应用,比如机器人、自动化生产线等领域。

通过STM32单片机控制直流电机实现位置速度电流PID三闭环,让电机精准控制!相关推荐

  1. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)

    编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...

  2. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  3. 基于STM32单片机的直流电机控制系统加减速正反转设计方案原理图程序

    硬件电路的设计 3.1系统的功能分析及体系结构设计 3.1.1系统功能分析 本设计由STM32F103C8T6单片机核心板电路+L298N电机驱动电路+按键电路+电源电路组成. 1.通过按键可以控制电 ...

  4. arduino控制直流电机_Arduino的高电流直流电机控制板

    arduino控制直流电机 任何在微型计算机上度过的人都知道电的重要性. 带有XMC1202的Arduino 直流电动机控制罩是一种功率控制器,用于伺服器,电动机,机器人执行器和其他需要通过大功率进行 ...

  5. STM32单片机直流电机PID速度控制正反转控制(霍尔磁铁测速)LCD1602

    实践制作DIY- GC0116-直流电机PID速度控制 一.功能说明: 基于STM32单片机设计-直流电机PID速度控制 功能介绍: STM32F103C系列最小系统+LCD1602+直流电机+磁铁+ ...

  6. PLC电机服务器原理,各种用途电机PLC控制原理图、二次接线图

    各种用途电机PLC控制原理图.二次接线图-图一 各种用途电机PLC控制原理图.二次接线图-图二 各种用途电机PLC控制原理图.二次接线图-图三 各种用途电机PLC控制原理图.二次接线图-图四 各种用途 ...

  7. K_A08_004 基于 STM32等单片机驱动MX1919模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 1.MX1919模块驱动时序 2.对应程序: 3.PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+MX1919 ...

  8. K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停

    目录 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 大功率MOS模块驱动 对应程序: 四.部分代码说明 接线说明 STC89C52RC+大功率MOS模块 STM32F103C8T6+大功率 ...

  9. K_A08_003 基于 STM32等单片机驱动L9110模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 L9110模块驱动时序 对应程序: PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+L9110模块 2.STM ...

最新文章

  1. 让人“眼前一亮、不明觉厉”的互联网技术PPT
  2. pycharm连接到gitee的操作
  3. [register]-TCR(Translation Control Register)寄存器详解
  4. 12v电量显示制作方法_如何制作老式12v充电器(四款12v充电器设计制作详解)
  5. 微课|中学生可以这样学Python(例11.2):tkinter猜数游戏(1)
  6. linux shell下除了某个文件外的其他文件全部删除的命令
  7. matlab中{} ()和[] 的区别 -
  8. inode对接微软服务器,H3C iNode智能客户端安装指导(Windows)-7.3-5PW102
  9. 前端实现Word在线预览
  10. AspectJ+AJDT+用Ant管理AspectJ项目+AspectJ教程
  11. 计算机与仪表通讯实例,MODBUS称重仪表与西门子PLC通讯实例
  12. word怎么画图,如何用word制作流程图
  13. 路由实验7777777
  14. 暂停更新公告—行走的皮卡丘
  15. U盘量产之更改U盘容量大小
  16. GNP/CMC(纳米石墨片/羧甲基纤维素钠)和GNP/rGO(纳米石墨片/还原氧化石墨烯)复合石墨膜-供应硫化锗玻璃/ 硒化镓GaSe/硫化镓GaS/碘化铬CrI3/鈣鈦礦/二硫化钛TiS2薄膜定制
  17. Dragon之LoginServer
  18. 小程序空格解决文字分散对齐
  19. Rasa 3.x 学习系列- Rasa - Issues 4873 dispatcher.utter_message 学习笔记
  20. [附源码]计算机毕业设计Python+uniapp智慧校园平台APP06l79(程序+lw+APP+远程部署)

热门文章

  1. 高等院校人事信息管理系统
  2. 如何屏蔽SIGPIPE信号
  3. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇二
  4. 【搜集】关于构图设计
  5. 谈一谈,Web3D!
  6. SequoiaDB Spark Yarn部署及案例演示
  7. mkisofs 制作iso镜像文件
  8. source tree各历史版本
  9. 3d透视perspective
  10. ORACLE - ORA-38104:Columns referenced in the ON Clause connot be updated:“a“.“id“