直流有刷电机闭环调速基于STM32F302R8+X-NUCLEO-IHM07M1
文章目录
- 前言
- 一、PID算法
- 二、STM32F302R8+X-NUCLEO-IHM07M1直流电机的闭环调速
- 2.1.功能需求
- 2.2.硬件设计
- 2.3.软件设计
- 2.3.1.底层配置
- 2.3.2.应用层开发
- 2.4.下载验证
- 总结
前言
主控板STM32F302R8+驱动板X-NUCLEO-IHM07M1+直流减速电机37GB3530,实现电机的转速闭环调速控制。直流电机的调速原理请阅读此章节:
直流有刷电机调速原理及Matlab/Simulink仿真
直流电机闭环控制原理请阅读此章节:
直流有刷电机H桥正反转调速原理及Matlab/Simulink仿真
有关驱动板X-NUCLEO-IHM07M1相关知识请阅读此章节:
直流有刷电机驱动基于STM32F302R8+X-NUCLEO-IHM07M1(一)
直流有刷电机编码器测速请阅读此章节:
直流有刷电机编码器测速基于STM32F302R8+X-NUCLEO-IHM07M1
一、PID算法
要实现速度闭环调速,需要用到PID控制
二、STM32F302R8+X-NUCLEO-IHM07M1直流电机的闭环调速
2.1.功能需求
直流电机的转速闭环控制
2.2.硬件设计
控制板:STM32F302R8
驱动板:X-NUCLEO-IHM07M1
直流电机:37GB3530,额定功率10W,额定电压12V,额定电流0.3A
2.3.软件设计
2.3.1.底层配置
底层配置同上一章直流有刷电机编码器测速基于STM32F302R8+X-NUCLEO-IHM07M1
2.3.2.应用层开发
按键扫描函数:
/* USER CODE BEGIN 2 */
uint8_t KEY_Scany(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==0){while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==0);return 1;}elsereturn 0;
}
/* USER CODE END 2 */
主函数:
int main(void)
{/* USER CODE BEGIN 1 */uint8_t count=0;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_TIM2_Init();MX_TIM6_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *///使能桥臂1和桥臂2HAL_GPIO_WritePin(GPIOC, EN1_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC, EN2_Pin, GPIO_PIN_SET);//使能TIM1_CH1和TIM1_CH2两通道PWM输出,输出占空比默认为0//PWM2输出0,控制PWM1输出的占空比,即可实现开环调速HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);//使能TIM2_CH1和TIM2_CH2编码器HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);//使能更新中断,清除中断标志位__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);__HAL_TIM_CLEAR_FLAG(&htim2,TIM_IT_UPDATE);//使能TIM6中断,清除中断标志位HAL_TIM_Base_Start_IT(&htim6);__HAL_TIM_CLEAR_IT(&htim6,TIM_IT_UPDATE);debug_init(); //上位机函数初始化pid_init(); //PID函数初始化/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(KEY_Scany(KEY_GPIO_Port,KEY_Pin)==1){Motor_Run=1;g_speed_pid.SetPoint+=50; //设定目标转速if(g_speed_pid.SetPoint>=350)g_speed_pid.SetPoint=350; }HAL_Delay(10);if(count%50==0) {HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //0.5s程序运行指示灯 count=0;}count++;}/* USER CODE END 3 */
}
中断函数:
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{int Encode_now;static uint8_t count=0;if(htim->Instance==TIM2) //TIM2更新中断{if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2)) //记录溢出次数,向下计数减1,向上计数加1{Encode_Count--;}else{Encode_Count++;} }else if(htim->Instance==TIM6){Motor_Direction=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2); //电机方向Encode_now=Get_Encode(); //获取当前脉冲计数总值Speed_Computer(Encode_now,5); //5ms更新一次速度if(count%SMAPLSE_PID_SPEED==0) //50ms更新一次PID,进行速度闭环控制{if(Motor_Run==1){Duty=increment_pid_ctrl(&g_speed_pid,Motor_Speed); //测量速度反馈,实现闭环控制 if(Duty>=100) //占空比限制Duty=100;else if(Duty<=0)Duty=0;TIM1->CCR1=Duty; //PID输出占空比,用于控制PWM的输出,实现速度调节debug_send_wave_data(1,Motor_Speed); //发送数据到上位机debug_send_wave_data(2,g_speed_pid.SetPoint);debug_send_wave_data(3,Duty);}count=0;}count++;}
}
/* USER CODE END 1 */
Get_Encode函数:
int Get_Encode(void)
{return (int32_t) __HAL_TIM_GET_COUNTER(&htim2)+Encode_Count*65536; //计数总值=当前计数值+溢出次数*65536
}
速度计算函数Speed_Computer,采用M法测速:
注:此处借鉴正点原子参考程序,引入冒泡排序及一阶滤波
void Speed_Computer(int32_t Encode_now,uint8_t time) //采用M法测速
{uint8_t i=0,j=0;float temp=0.0;static uint8_t sp_count=0,k=0;static float speed_arr[10]={0.0};if(sp_count==time) //5ms计算一次速度{g_encode.encode_now=Encode_now; //获取当前编码器计数总值g_encode.speed=(g_encode.encode_now-g_encode.encode_old); //计算5ms内编码器计数的变化量speed_arr[k++]=(float)(g_encode.speed*((1000/time)*60)/(uint16_t)(16*4*30)); //M法测速计算电机转速,累计10次转速g_encode.encode_old=g_encode.encode_now; //保存当前计数值if(k>=10) //冒泡排序{for(i=10;i>=1;i--){for(j=0;j<(i-1);j++){if(speed_arr[j]>speed_arr[j+1]){temp=speed_arr[j];speed_arr[j]=speed_arr[j+1];speed_arr[j+1]=temp;}}}temp=0.0;for(i=2;i<8;i++) //去掉一个最大和最小值,去平均{temp+=speed_arr[i];}temp=(float)temp/6;Motor_Speed=(float)((Motor_Speed*(float)0.52)+((float)0.48*temp)); //一阶滤波k=0;}sp_count=0;}sp_count++;
}
PID函数increment_pid_ctrl:
注:此处借鉴正点原子参考程序,程序中用的是位置式PID
int32_t increment_pid_ctrl(PID_TypeDef *PID,float Feedback_value)
{PID->Error = (float)(PID->SetPoint - Feedback_value); /* 计算偏差 */#if INCR_LOCT_SELECT /* 增量式PID */PID->ActualValue += (PID->Proportion * (PID->Error - PID->LastError)) /* 比例环节 */+ (PID->Integral * PID->Error) /* 积分环节 */+ (PID->Derivative * (PID->Error - 2 * PID->LastError + PID->PrevError)); /* 微分环节 */PID->PrevError = PID->LastError; /* 存储偏差,用于下次计算 */PID->LastError = PID->Error;#else /* 位置式PID */PID->SumError += PID->Error;PID->ActualValue = (PID->Proportion * PID->Error) /* 比例环节 */+ (PID->Integral * PID->SumError) /* 积分环节 */+ (PID->Derivative * (PID->Error - PID->LastError)); /* 微分环节 */PID->LastError = PID->Error;#endifreturn ((int32_t)(PID->ActualValue)); /* 返回计算后输出的数值 */
}
PID值设置:
/* 位置式PID参数相关宏 */
#define KP 0.35f /* P参数*/
#define KI 0.08f /* I参数*/
#define KD 0.05f /* D参数*/
#define SMAPLSE_PID_SPEED 50 /* 采样周期 单位ms*/
上位机采用正点原子上位机,用于波形观察
2.4.下载验证
编译下载到控制器,观察实验现象
目标速度与实际速度
占空比
总结
主控板STM32F302R8+驱动板X-NUCLEO-IHM07M1+直流减速电机37GB3530,实现了直流电机的闭环调速,为后续章节的分析奠定基础
直流有刷电机闭环调速基于STM32F302R8+X-NUCLEO-IHM07M1相关推荐
- 直流有刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.STM32F302R8+X-NUCLEO-IHM07M1直流电机的开环调速 1.1.功能需求 1.2.硬件设计 1 ...
- 直流有刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(二)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.STM32F302R8+X-NUCLEO-IHM07M1直流电机的开环调速 1.1.功能需求 1.2.硬件设计 1 ...
- 直流无刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)
文章目录 前言 一.直流无刷电机开环调速原理 二.STM32F302R8+X-NUCLEO-IHM07M1直流无刷电机的开环调速 2.1.功能需求 2.2.硬件设计 2.3.软件设计 2.3.1.ST ...
- 直流有刷电机编码器测速基于STM32F302R8+X-NUCLEO-IHM07M1
文章目录 前言 一.编码器测速原理 二.STM32F302R8+X-NUCLEO-IHM07M1直流电机编码器测速 2.1.功能需求 2.2.硬件设计 2.3.软件设计 2.3.1.底层配置 2.3. ...
- 直流双闭环调速系统的计算机仿真,直流电动机双闭环调速系统的动态特性研究与仿真.doc...
直流电动机双闭环调速系统的动态特性研究与仿真.doc I直流电动机双闭环调速系统的动态特性仿真研究摘要直流电动机具有良好的起.制动性能,宜于在大范围内实现平滑调速,并且直流调速系统在理论和实践上都比较 ...
- 直流无刷电机(BLDC)转速闭环调速系统及Matlab/Simulink仿真分析(二)
文章目录 前言 一.转速闭环直流调速系统 二.Matlab/Simulink仿真 2.1.仿真电路分析 2.2.仿真结果分析 总结 前言 变压调速是直流调速系统的主要调速方法,因此系统的硬件至少包含: ...
- matlab直流电机双闭环控制系统设计,基于MATLAB的直流电机双闭环调速系统设计毕业论文.doc...
摘 要 直流电机双闭环调速系统是一个复杂的自动控制系统,是目前直流调速系统中的主流设备,具有调速范围宽.平稳性好.稳速精度高等优点,在理论和实践方面都是比较成熟的系统,在拖动领域中发挥着极其重要的作用 ...
- 计算机控制直流电机闭环调速实验,最小拍控制系统及直流电机闭环调速控制系统设计和实现实验报告...
最小拍控制系统及直流电机闭环调速控制系统设计和实现实验报告 最小拍控制系统及 直流电机闭环调速控制系统设计和实现 实验报告班级: xx 姓名: xx 学号: xx 时间: 第16周周日9-12节 指导 ...
- matlab限幅器无饱和怎么设置,基于MATLAB 的直流电动机双闭环调速系统的仿真研究...
基于MATLAB 的直流电动机双闭环调速系统 的仿真研究 摘要:本文介绍了利用MATLAB 软件中的Simulink 组件对直流电动机双闭环调速系统进行仿真,获得了反映系统性能的曲线,并对仿真 结果进 ...
最新文章
- 使用Vue.js进行数据绑定以及父子组件传值
- linux编译blas,Linux下安装BLAS,CBLAS,LAPACK
- 使用和执行SQL Server Integration Services包的方法
- img 标签的 src 属性
- 不知道怎么办了,犹豫中……
- android linkedin 登陆授权及分享
- 轻松实现页面提交时,显示“提交中..” (转帖)
- 谷歌浏览器chorme,wap浏览器,字…
- word方框(□)中打钩(√)的3种方法
- undefined == null的正确解释
- vue2.x进阶知识点总结
- 快捷餐饮之店家后台评论管理及餐桌管理实现
- c语言若输入错误的是,C语言新人常见问题与错误
- Unity材质快速复制
- 【Java基础】使用swing对话框编写一个程序:输入长和宽,计算矩形的周长和面积
- SAP - 表、业务流程
- 21级 pta 《图论》
- Python【入门】(1) —— Numpy库
- 详解景联文科技数据采集标注平台
- 文储研习社第21期 | NFT+Finance项目介绍