运动控制--小车的启动和停止算法

一、现实问题

小车在启动时由于受到惯性,后轮和前轮速度不一致,会引起车身不稳。

如小车上面装的是水,会出现倾洒,体验差。

二、数学研究

启动时       V(t)=\frac{V_max}{(1+exp(-k*(t-t0)))}

停止时      V(t)=\frac{V0}{(1+exp(k*(t-t0)))}

急动度(jerk)

三、BLDC控制与S型曲线的融合逻辑​

BLDC电机的速度控制通常采用​​双闭环结构​​:外层为速度环(PID控制),内层为电流环(或直接转矩控制)。S型曲线的核心是为速度环提供​​平滑的目标速度参考​​,确保电机启动/停止时加速度渐变,避免转矩突变(导致机械冲击或电流过冲)。

​关键步骤​​:
  1. ​S型曲线生成​​:根据目标速度(如用户设定的车速)、最大允许加速度/急动度,生成连续的速度参考曲线(如前所述的Sigmoid模型)。
  2. ​速度环PID控制​​:实时计算当前速度与S型曲线参考速度的误差,通过PID调节器输出转矩参考(或电流参考)。
  3. ​电流环控制​​:将转矩参考转换为三相电流参考,通过PWM调制驱动电机,确保电流平滑跟随,避免转矩脉动。

四、BLDC系统的S型曲线控制架构​

典型的BLDC控制系统(结合S型曲线)架构如下:

输入:

目标速度(用户设定)→ S型曲线生成器 → 速度参考v_ref(t)↑当前速度v_measured(编码器/Hall传感器反馈)→ 速度环PID → 转矩参考T_ref↑电流环控制器(FOC/PWM)→ 三相PWM驱动 → BLDC电机

五、代码实现(基于STM32的BLDC S型曲线控制)​

以下代码基于STM32F4系列微控制器(支持硬件浮点运算),实现S型曲线生成、速度环PID控制及BLDC换相逻辑。代码包含关键模块的伪代码和实际寄存器操作。

​1. 系统参数定义​
#include "stm32f4xx_hal.h"
#include <math.h>// BLDC电机参数
#define POLE_PAIRS       4       // 极对数(影响转速计算)
#define ROTOR_RES        0.5f    // 转子电阻(Ohm)
#define L                0.001f  // 电感(H)
#define MAX_TORQUE       2.5f    // 最大转矩(Nm)
#define MAX_CURRENT      10.0f   // 最大相电流(A)// S型曲线参数
#define V_MAX            10.0f   // 目标最大速度(m/s)
#define K_S              0.3f    // S型曲线陡峭系数
#define TOTAL_TIME       10.0f   // 总加速时间(s)
#define T0               (TOTAL_TIME/2.0f)  // S型曲线中心点时间// 控制周期(PWM频率10kHz → 周期100μs)
#define CONTROL_PERIOD   0.0001f  // 秒// 全局变量
float current_time = 0.0f;       // 当前时间(s)
float ref_speed = 0.0f;          // S型曲线参考速度(m/s)
float measured_speed = 0.0f;     // 编码器测量速度(m/s)
float pid_output = 0.0f;         // PID输出转矩参考(Nm)
 
​2. S型曲线参考速度生成​

在每个控制周期更新参考速度,确保平滑过渡。

// S型曲线速度计算函数(与Python/C版本逻辑一致)
float sigmoid_ref_speed(float t) {return V_MAX / (1.0f + expf(-K_S * (t - T0)));
}// 每个控制周期调用(更新参考速度)
void update_ref_speed(void) {current_time += CONTROL_PERIOD;  // 累加控制周期时间if (current_time > TOTAL_TIME) {current_time = TOTAL_TIME;   // 限制最大时间(避免超调)}ref_speed = sigmoid_ref_speed(current_time);  // 计算S型曲线速度
}
​3. 速度环PID控制器​

通过PID调节将当前速度误差转换为转矩参考,需考虑电机动力学特性(如转动惯量)。

// PID参数(需现场调试)
#define KP 2.5f   // 比例系数
#define KI 0.1f   // 积分系数
#define KD 0.5f   // 微分系数float pid_error = 0.0f;      // 速度误差
float pid_integral = 0.0f;   // 积分项
float prev_pid_error = 0.0f; // 上一周期误差// 速度环PID计算
void speed_pid_controller(void) {pid_error = ref_speed - measured_speed;  // 计算误差// 积分项(抗饱和)pid_integral += pid_error * CONTROL_PERIOD;if (pid_integral > 10.0f) pid_integral = 10.0f;  // 积分限幅if (pid_integral < -10.0f) pid_integral = -10.0f;// 微分项(误差变化率)float error_deriv = (pid_error - prev_pid_error) / CONTROL_PERIOD;prev_pid_error = pid_error;// PID输出(转矩参考)pid_output = KP * pid_error + KI * pid_integral + KD * error_deriv;// 转矩限幅(避免过流)if (pid_output > MAX_TORQUE) pid_output = MAX_TORQUE;if (pid_output < -MAX_TORQUE) pid_output = -MAX_TORQUE;
}
​4. FOC电流控制(将转矩转换为PWM)​

FOC(磁场定向控制)通过坐标变换将三相电流转换为d-q轴电流,直接控制转矩和磁链。此处简化为电流环输出PWM占空比。

// 简化的FOC电流控制(示例)
void foc_current_control(float torque_ref) {// 1. 转矩与d-q轴电流的关系(简化模型)float i_q_ref = torque_ref / (POLE_PAIRS * L * 0.1f);  // 近似计算q轴电流// 2. 电流环PI控制(假设已采样三相电流并转换为i_d, i_q)float i_q_error = i_q_ref - current_i_q;  // 实际i_q与参考的误差float v_q = Kp_current * i_q_error + Ki_current * integral_i_q;  // q轴电压// 3. 逆Park变换(d-q → α-β)float v_alpha = v_d * cos_theta - v_q * sin_theta;float v_beta = v_d * sin_theta + v_q * cos_theta;// 4. 空间矢量PWM(SVPWM)生成svpwm_generate(v_alpha, v_beta);  // 硬件实现SVPWM调制
}

​5. BLDC换相逻辑(六步换相模式)​

对于低成本BLDC电机,也可采用六步换相控制(无需霍尔传感器时需反电动势检测)。S型曲线的加速度变化需匹配换相频率,避免转矩脉动。

// 六步换相状态机(示例)
typedef enum {STEP_1, STEP_2, STEP_3, STEP_4, STEP_5, STEP_6
} commutation_step_t;commutation_step_t current_step = STEP_1;
uint8_t hall_sensor = 0;  // 霍尔传感器输入(3位)// 根据霍尔信号更新换相状态
void update_commutation(void) {hall_sensor = HAL_GPIO_ReadPin(HALL_PORT, HALL_PINS);  // 读取霍尔信号switch (hall_sensor) {case 0b001: current_step = STEP_1; break;case 0b011: current_step = STEP_2; break;case 0b010: current_step = STEP_3; break;case 0b110: current_step = STEP_4; break;case 0b100: current_step = STEP_5; break;case 0b101: current_step = STEP_6; break;default: current_step = STEP_1;}// 根据当前步设置三相PWM导通(示例:高电平有效)switch (current_step) {case STEP_1: HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2); break;  // 相A导通case STEP_2: HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3); break;  // 相B导通// ... 其他步骤类似}
}
​6. 主控制循环​
int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM1_Init();   // PWM定时器(驱动BLDC)MX_ADC_Init();    // 电流/速度采样ADCwhile (1) {// 1. 采样传感器数据(霍尔/编码器/电流)measured_speed = read_encoder_speed();  // 编码器测速(rpm→m/s)measured_current = read_phase_current();// ADC采样相电流// 2. 更新S型曲线参考速度update_ref_speed();// 3. 速度环PID控制speed_pid_controller();// 4. FOC电流控制(或六步换相)#ifdef USE_FOCfoc_current_control(pid_output);#elseupdate_commutation();  // 六步换相模式#endif// 5. 周期延时(匹配控制周期)HAL_Delay(CONTROL_PERIOD * 1000);  // 转换为ms}
}

六、关键注意事项​

  1. ​动态响应匹配​​:S型曲线的k参数需与电机的转动惯量(J)匹配。转动惯量大时,需减小k以避免加速度突变导致的超调。
    公式:kopt​≈Tsample​4ζ2J​​(ζ为阻尼比,Tsample​为控制周期)。

  2. ​电流限制​​:S型曲线的最大加速度对应最大转矩,需确保电机相电流不超过额定值(通过PID限幅实现)。

  3. ​无传感器优化​​:若使用霍尔传感器或无传感器算法(如反电动势观测器),需在S型曲线启动阶段抑制初始转矩脉动(可通过调整初始k值实现)。

七、总结​

将S型曲线应用于BLDC控制的核心是​​通过速度环生成平滑的参考速度​​,并通过PID和电流环确保电机平稳跟随。实际工程中需结合电机参数(极对数、电感、电阻)和控制周期,调整S型曲线的kV_max等参数,并通过实验优化PID系数,最终实现舒适、安全的启动/停止控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤

方法一&#xff1a;使用官方二进制包安装 下载.NET Core 8 SDK 二进制包&#xff1a;访问 .NET Core 8 SDK 官方下载页面&#xff0c;根据你的系统架构选择对应的 Linux x64 版本等下载链接&#xff0c;将其下载到本地4. 创建安装目录&#xff1a;在终端中执行以下命令创建用于…

可视化预警系统:如何实现生产风险的实时监控?

在生产环境中&#xff0c;风险无处不在&#xff0c;而传统的监控方式往往只能事后补救&#xff0c;难以做到提前预警。但如今&#xff0c;可视化预警系统正在改变这一切&#xff01;它能够实时收集和分析生产数据&#xff0c;通过直观的图表和警报&#xff0c;让管理者第一时间…

深度解析 Linux 内核参数 net.ipv4.tcp_rmem:优化网络性能的关键

文章目录 引言一、认识 net.ipv4.tcp_rmem1. 最小值&#xff08;min&#xff09;2. 默认值&#xff08;default&#xff09;3. 最大值&#xff08;max&#xff09; 二、net.ipv4.tcp_rmem 的工作原理三、net.ipv4.tcp_rmem 的实际应用场景1. 高并发 Web 服务器2. 文件传输服务3…

Windmill:开源开发者基础设施的革命者

前言 在企业内部,开发者经常需要构建各种内部工具来支持业务运营、数据分析和系统管理。这些工具通常需要前端界面、后端逻辑和工作流编排,开发过程繁琐且耗时。今天要介绍的Windmill项目,正是为解决这一痛点而生,它让构建内部工具变得简单高效,堪称开发者的得力助手。 …

国产化Excel处理组件Spire.XLS教程:用 Java 获取所有 Excel 工作表名称(图文详解)

在 Excel 中&#xff0c;工作表名称通常能够反映其用途或所含内容&#xff0c;提取这些名称有助于理清整个工作簿的结构。对于新用户或协作者来说&#xff0c;仅凭这些名称就能快速掌握各表中的数据类型。本文将演示如何使用 Java 获取 Excel 文件中的所有工作表名称&#xff0…

day49python打卡

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 最近临近毕业&#xff0c;事情有点多。如果有之前的基础的话&#xff0c;今天的难度相对较低。 后面说完几种模块提取特征的组合方式后&#xff0c;会提供整理的开源模块的文件。 现在大家已近可以去读这类…

day27-shell编程(自动化)

1. 准备工具 添加到/etc/vimrc autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash,Dockerfile,docker-compose.yml exec ":call SetTitle()"func SetTitle() if expand("%:e") ~ sh\|bash call setline(1,"#!/bin/bash")call setline(2, &quo…

【免杀】C2免杀技术(十五)shellcode混淆uuid/ipv6/mac

针对 shellcode 混淆(Shellcode Obfuscation) 的实战手段还有很多,如下表所示: 类型举例目的编码 / 加密XOR、AES、RC4、Base64、Poly1305、UUID、IP/MAC改变字节特征,避开静态签名或 YARA结构伪装PE Stub、GIF/PNG 嵌入、RTF OLE、UUID、IP/MAC看起来像合法文件/数据,弱…

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…

记录一次opengl显示不出物体的错误原因

是这样的&#xff0c;我打算学PBR中的IBL章节&#xff0c;即基于图像的渲染&#xff0c;它的观点是创建一个大的外景图片&#xff0c;可以根据图像中的信息来将环境中的漫反射光和镜面反射光打在物体上。 但是我在我的程序中创建了一个立方体作为天空盒&#xff0c;我是有两套…

国产录播一体机:科技赋能智慧教育信息化

在数字化时代&#xff0c;教育正经历着前所未有的变革。国产工控机作为信息化教育的核心载体&#xff0c;正在重新定义学习方式&#xff0c;赋能教师与学生&#xff0c;打造高效、互动、智能的教学环境&#xff0c;让我们一起感受科技与教育的深度融合&#xff01;高能计算机推…

Android Native 之 lmkd进程和kernel kswapd的关联

lwkd进程属于native层启动的一个守护进程&#xff0c;他的作用贯穿android世界的始终。他的另外一个大家都属于的名字lowmemorykiller。 根据readme的介绍lmkd是用来对android系统内存检查的守护进程&#xff0c;它通过终止不重要的进程来达到系统稳定运行的状态。在Linux Kern…

【生活】程序员防猝si指南

note 一、定期体检二、均衡饮食&#xff0c;多食用对心脏有保护作用的食物三、每周运动四、减压五、保证睡眠六、戒烟限酒7、控制血压8、警惕流感攻击心脏9、关注牙齿健康10、不要抵触吃药 文章目录 note一、定期体检二、均衡饮食&#xff0c;多食用对心脏有保护作用的食物三、…

245. 2019年蓝桥杯国赛 - 数正方形(困难)- 递推

245. 数正方形&#xff08;困难&#xff09; 2019年蓝桥杯国赛 - 数正方形&#xff08;困难&#xff09; 标签&#xff1a;2019 国赛 递推 题目描述 在一个 N N N N N N 的点阵上&#xff0c;取其中 4 个点恰好组成一个正方形的 4 个顶点&#xff0c;一共有多少种不同的取…

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…

SpringBoot EhCache 缓存

一、EhCache核心原理 层级存储 堆内缓存&#xff08;Heap&#xff09;&#xff1a;高速访问&#xff0c;受JVM内存限制堆外缓存&#xff08;Off-Heap&#xff09;&#xff1a;突破JVM堆大小限制&#xff08;直接内存&#xff09;磁盘存储&#xff08;Disk&#xff09;&#xff…

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…

数据通信与计算机网络——数据与信号

主要内容 模拟与数字 周期模拟信号 数字信号 传输减损 数据速率限制 性能 注&#xff1a;数据必须被转换成电磁信号才能进行传输。 一、模拟与数字 数据以及表示数据的信号可以使用模拟或者数字的形式。数据可以是模拟的也可以是数字的&#xff0c;模拟数据是连续的采用…

循环语句之while

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断 循环执行代码块。 1 2 3 while (条件) { 语句 ; } var i 0; while (i < 100) {console.log(i 当前为&#xff1a; i); i i 1; } 下面的例子是一个无限循环&#xff0c;因…