SimpleFOC移植STM32(四)—— 闭环控制


SimpleFOC的教程比较多,做了一个总链接,欢迎点击阅读:SimpleFOC教程链接汇总

一、电机的三种控制模式

(为保证本文可读性,把之前写过的搬运到此。)

1.1、力矩控制模式

  ◎电机在运行过程的电流,始终等于给定的值。
  ◎比如使用电机来拉伸弹簧,设定电流值越大,弹簧被拉伸的长度越长。设定电流越小,弹簧被拉伸的长度越短。设定电流为零,弹簧不被拉伸。
  ◎在SimpleFOC项目中,受限于Arduino UNO的运行速度,大部分例程没有使用电流采样,所以设定电压值代替设定电流值。

1.2、速度控制模式

  ◎让电机始终按照设定的速度运转,不因负载的变化而变化。
  ◎速度控制一般会采用内环电流环,外环速度环的方式,所以可以限制转动过程中的电流不超过设定值。
  ◎比如传送带传送物品,给定的速度不会因为传送带上是空载或者带载发生变化,但是当负载过大,电流超过设定值的时候会报警或自动停止。

1.3、位置控制模式

  ◎精确控制电机转动到指定角度,
  ◎位置控制一般会采用内环电流环,外环速度环,最外环位置环的方式,所以可以限制转动过程中的最大速度,和最大电流。
  ◎比如机械臂从A点运动到B点,并限制挥舞过程中的最大速度和最大力矩。

二、硬件介绍

  本节实验适合运行在SimpleMotor和STM32最小系统板上(Bluepill)。

2.1、原理图

在这里插入图片描述

2.2、SimpleMotor方案

2.2.1、准备清单

序号名称数量
1SimpleMotor1
2带编码器云台电机1
3USB转串口1
412V电源1

在这里插入图片描述

2.2.2、接线

在这里插入图片描述
只展示M1的接线,M2的接线根据原理图自行连接。

2.3、STM32方案

2.3.1、准备清单

序号名称数量
1STM32核心板1
2SimpleFOCShield V2.0.31
3带编码器的云台电机1
4USB转串口1
55V电源1
612V电源1
7杜邦线若干

在这里插入图片描述

2.3.2、接线

在这里插入图片描述
对照 Shield V2.0.3 的原理图:

STM32核心板V2.0.3
PA05
PA19
PA26
PB98
GNDGND
如果是AS5600编码器,如下
STM32核心板AS5600电机
--------
PB6SCL
PB7SDA
3V3VCC
GNDGND
如果是TLE5012B编码器,如下
STM32核心板TLE5012电机
--------
PB15MOSI
PB14MISO
PB13SCK
PB8CSQ
GNDGND
3V3VCC

在这里插入图片描述
只展示M1的接线,M2的接线根据原理图自行连接。

三、控制原理

3.1、闭环控制原理

1、力矩模式
在这里插入图片描述
  ◎串口设定值为Uq,Ud固定为0;
  ◎控制原理与开环控制很像,核心代码是SVPWM;
  ◎开环的θ是人为设定的,而闭环的θ来自编码器。

2、速度模式
速度模式
  ◎力矩闭环外增加了速度环;
  ◎串口设定值为期望速度(Vd);
  ◎实际速度和期望速度的差作为PID输入,输出值为SVPWM的输入(Uq),Ud固定为0;
  ◎编码器读到的角度为机械角度,先转为电角度供SVPWM使用(θ);
  ◎根据最近两次的角度差和时间差计算出当前速度(v),速度做滤波处理(Vf),因为速度要保持平滑不能突变;

3、位置模式
位置模式
  ◎与速度环相比多了一个位置环,相应的要调试位置环PID,创作者的代码中只使用了P参数,实际应用中一般会用PD参数。

3.2、零点检测

  一般的无刷电机驱动器会有个学习模式,用拨码开关切换,第一次使用先拨到学习模式,检测电机参数后保存到内部flash。然后切换到工作模式,驱动器每次上电都会导入存储的参数,执行控制。
  SimpleFOC上电后也会检测电机参数,但是没有保存的动作,所以每次上电都要检测,对于带磁编码器的电机,需要检测机械角度和电角度的偏差(zero_electric_angle),和电机极对数(pole_pairs)。
  机械角度零点和电角度的零点,在实际操作中基本是不可能对齐的,所以同学们不要有通过调整编码器角度,把零点对齐的这个想法。
在这里插入图片描述
在这里插入图片描述
代码位置在:BLDCMotor.c,
在这里插入图片描述
在这里插入图片描述

3.3、零点检测代码简单说明

本小节20220814更新

关于代码中为什么要加 _3PI_2 的原因:
在这里插入图片描述
磁场方向为d轴,垂直于转子磁场方向为q轴,d轴建立磁场,q轴做功,
因为q轴是垂直磁场的,假如设置 θ=0°,电机最终停留在90°位置,所以要想让电机停留在0°,需设置 θ=270°。
而d轴是磁场方向,设置θ=0°,电机就停留在0°。
所以设置Uq=x,θ=270°,其效果等同于Ud=x,θ=0°。
在这里插入图片描述

以开环的方式实际测试,证明了确实是这样。

3.4、跳过零点检测说明

  • 1、设置(0,UNKNOWN),烧写代码,
    在这里插入图片描述

  • 2、运行后电机会进行零点校准,获取两个参数,
    在这里插入图片描述

  • 3、把获取的两个参数写入代码,编译后重新烧写,
    在这里插入图片描述

  • 4、运行后电机将跳过零点检测。
    在这里插入图片描述

  • 不同电机的零点参数不同,所以每个电机都要校准;

  • 电机三相线如果有调整,需要重新校准。

四、程序演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转

4.1、力矩模式

1、选择力矩模式,其它参数根据实际情况设置
在这里插入图片描述
2、编译下载
  可以串口下载或者SWDIO下载;
  如果是串口下载,Boot加上跳线帽,下载完毕后拿掉跳线帽,按复位键重启或者断电重启。
  注意:复位重启只能重启单片机,编码器没有重启,这可能会导致重启后的I2C接口编码器不能正确读出,SPI接口编码器不受影响。
3、等待初始化完成
4、串口发送指令,此时发送的数据表示电压值Uq
  注意:设置的电压值不能超过voltage_power_supply/√3,比如电源电压12V,设置不能超过6.92V。
在这里插入图片描述
5、给电机施加阻力,感受不同电压对应不同的力矩

注意:力矩模式不涉及PID,所以比较简单,大功率电机设置电压值不能太大。

4.2、速度模式

1、选择速度模式
在这里插入图片描述
注意:PID参数根据电机实际情况自行设置,不了解PID设置的请百度。
2、编译下载
3、重新上电,等待电机初始化完成
4、串口发送指令T6.28,观察电机是否以1圈/秒的速度转动。
在这里插入图片描述
5、设置不同速度,观察电机转动变化。给电机施加阻力,观察电机转动

4.3、位置模式

1、选择位置模式
在这里插入图片描述
注意:本例中,位置模式包含了位置PID和速度PID,根据电机实际情况自行设置,不了解PID的请百度。
2、编译下载
3、重新上电,等待电机初始化完成
4、串口发送指令T6.28,观察电机是否转动一圈
  上电后为了保证电机为静止状态,设置初始化后的目标角度为当前角度,所以第一次设置角度6.28,电机不会转一圈。第一次可以设置目标角度为0。
在这里插入图片描述

(完)


本文只讲了M1电机的操作,源码中包含M1和M2两个工程,M2的操作可比照M1,不再赘述!



请继续阅读相关文章:
SimpleFOC移植STM32(一)—— 简介
SimpleFOC移植STM32(二)—— 开环控制
SimpleFOC移植STM32(三)—— 角度读取
SimpleFOC移植STM32(四)—— 闭环控制
SimpleFOC移植STM32(五)—— 电流采样及其变换

以下是基于优快云文章《Apache Doris从入门到实战:核心原理与代码解析》的思维导图框架(文字版),涵盖Doris架构设计、数据模型、查询优化、实战场景及运维调优。实际导图可用XMind/MindMaster等工具按层级展开: --- ### **Apache Doris思维导图** #### **1. Doris基础概念** - **定义**:MPP架构的实时分析型数据库 - **核心特性** - **高并发点查**:支持万级QPS - **实时分析**:亚秒级延迟 - **向量化执行**:SIMD指令优化 - **云原生友好**:支持K8s部署 - **应用场景** - 实时报表(如电商GMV看板) - 用户画像(标签查询) - 监控告警(时序数据查询) - 交互式分析(Ad-hoc查询) #### **2. 核心架构** - **组件分层** - **前端层**: - FE(Frontend):元数据管理、查询解析 - Broker:外部数据导入(如HDFS/S3) - **计算层**: - BE(Backend):存储计算、执行引擎 - CBO(Cost-Based Optimizer):基于成本的查询优化 - **存储层**: - 列式存储(Prefix Encoding+Delta Encoding) - 分区与分桶(Partition+Bucket) - **关键组件** - **FE节点**: - 选举机制(Leader/Follower) - 元数据缓存(RocksDB) - **BE节点**: - 内存管理(MemTable+SSD Cache) - 任务调度(Pipeline执行模型) - **Zookeeper**: - FE集群协调 - 分布式锁管理 #### **3. 数据模型** - **表类型** - **明细模型(Duplicate Key)**: - 保留所有明细数据 - 示例:用户行为日志表 - **聚合模型(Aggregate Key)**: - 预聚合计算(SUM/COUNT等) - 示例:订单金额统计表 - **唯一键模型(Unique Key)**: - 主键去重+更新 - 示例:用户信息表 - **分区与分桶** - **Range分区**: - 按时间范围分区(如`PARTITION BY RANGE(dt) (...)`) - **Hash分桶**: - 按列值哈希分散数据(如`DISTRIBUTED BY HASH(user_id) BUCKETS 10`) - **物化视图** - **Rollup**: - 预聚合层级(如明细表→小时粒度汇总表) - **智能物化视图**: - 自动匹配查询模式 #### **4. 查询优化** - **执行引擎** - **Pipeline模型**: - 打破Operator边界,流水线执行 - 对比Volcano模型的开销降低 - **向量化执行**: - 批量数据处理(SIMD指令加速) - 示例:`VectorizedGroupingAggregate`算子 - **优化策略** - **谓词下推**: - 提前过滤无关数据(如`WHERE dt='2023-01-01'`) - **Join优化**: - Broadcast Join(小表广播) - Colocate Join(同节点数据关联) - **CBO优化**: - 基于统计信息选择最优执行计划 - 示例:自动选择Hash Join vs Nested Loop Join #### **5. 实战场景** - **实时报表** - **电商GMV看板**: - 模型设计:聚合模型按`product_id`+`dt`分区 - 查询示例: ```sql SELECT product_id, SUM(price) FROM orders WHERE dt BETWEEN '2023-01-01' AND '2023-01-31' GROUP BY product_id; ``` - **用户行为分析**: - 模型设计:明细模型按`user_id`+`event_time`分桶 - 查询示例: ```sql SELECT user_id, COUNT(*) as event_count FROM user_events WHERE event_time > NOW() - INTERVAL 1 HOUR GROUP BY user_id; ``` - **用户画像** - **标签查询**: - 模型设计:唯一键模型按`user_id`分区 - 查询示例: ```sql SELECT user_id, age, gender, city FROM user_profiles WHERE user_id IN (1001, 1002, 1003); ``` - **标签圈选**: - 模型设计:位图索引加速标签组合查询 - 查询示例: ```sql SELECT user_id FROM user_tags WHERE (tags & 1) > 0 AND (tags & 2) > 0; -- 同时满足标签1和2 ``` #### **6. 数据导入** - **导入方式** - **Stream Load**: - 同步导入(HTTP API) - 示例: ```bash curl -u user:passwd -H "format:json" -H "strip_outer_array:true" -T data.json http://fe_host:8030/api/db_name/tbl_name/_stream_load ``` - **Routine Load**: - 持续消费Kafka数据 - 示例: ```sql CREATE ROUTINE LOAD db_name.tbl_name ON tbl_name COLUMNS(col1, col2, col3) PROPERTIES ( "desired_concurrent_number"="3", "max_batch_interval" = "20", "max_batch_rows" = "300000", "max_batch_size" = "209715200" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092", "kafka_topic" = "topic_name", "property.group.id" = "doris_consumer_group" ); ``` - **Broker Load**: - 异步导入HDFS/S3文件 - 示例: ```sql LOAD LABEL db_name.label_name (DATA INFILE("hdfs://path/to/file") INTO TABLE tbl_name COLUMNS TERMINATED BY "," PROPERTIES (...) ) WITH BROKER "broker_name"; ``` #### **7. 运维调优** - **参数配置** - **内存管理**: - `mem_limit`:BE进程内存上限(如`80%`) - `query_mem_limit`:单查询内存限制(如`2GB`) - **并发控制**: - `parallel_fragment_exec_instance_num`:并行度(如`4`) - `max_scan_key_num`:单分区扫描最大键数(如`1024`) - **监控指标** - **查询性能**: - `QueryTime`:总耗时 - `ScanTime`:扫描耗时 - **资源使用**: - `CpuUsage`:CPU利用率 - `MemUsage`:内存使用率 - **故障排查** - **慢查询分析**: - 通过`SHOW PROC '/queries'`查看执行计划 - **数据倾斜处理**: - 调整分桶列或使用`DISTRIBUTED BY RANDOM` #### **8. 生态集成** - **连接器** - **JDBC**:支持MySQL协议访问 - **Spark Connector**:读写Doris表 - **Flink Connector**:CDC同步数据 - **可视化工具** - **Superset**:直接连接Doris查询 - **Grafana**:监控告警面板 --- ### **导图使用建议** 1. **层级展开**:从“Doris基础概念”逐级展开子节点(如“核心特性”→“高并发点查”)。 2. **标注重点**:用颜色/图标标记关键机制(如向量化执行、CBO优化)。 3. **实战关联**:在“实战场景”节点下添加具体SQL示例或配置片段。 ---
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值