ST电机库学习记录——配置MC—WorkBench + CuBeMX配置MT6701磁位置传感器
选择板卡和驱动电机电机参数需要自行对照调节配置一览为了方便测试配置开环调试 串口波特率选择115200配置CuBeMX配置spi读取mt6701配置MISO和CLK配置FOC_L_CS引脚配置LED灯与电机控制引脚个人配置Keil5代码移植mian.c/.h中//-------------main.c--------------------- /* USER CODE BEGIN PFP */ MCI_State_t state; //电机状态机全局变量 float angle_f;//获取的实际角度 int16_t angle; float use_angle_f; /*串口重映射还需要修改对应函数 stm32_mc_common_it.c 中的 USART1_IRQHandler 函数 */ int fputc(int ch, FILE *f) { // 通过串口1发送一个字符 // 这里的 huart1 是你已经初始化好的串口句柄 HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, HAL_MAX_DELAY); return ch; } //mt6701驱动 void mt6701_spi_read_L(unsigned char* buf, unsigned short len) { HAL_SPI_Receive(hspi1, buf, len, MT6701_Timeout); } // 14Bit角度信息存储在0x03[13:6]、0x04[5:0]两个寄存器中高位在前原始读数0~16383对应0-360° void mt6701_spi_get_L_angle(int16_t *angle, float *angle_f) { uint8_t temp[3]; SPI_L_CS_Enable(); mt6701_spi_read_L(temp, 3); //HAL_SPI_TransmitReceive(hspi2, tx, temp, 3, MT6701_Timeout); SPI_L_CS_Disable(); *angle ((int16_t)temp[0] 6) | (temp[1] 2); *angle_f (float)*angle * 360 / 16384.0f; } float getAngle_Without_track(void)//绝对角度角度制 { mt6701_spi_get_L_angle(angle, angle_f); return angle_f; } //闪灯小代码 void shan() { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); HAL_Delay(300); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); HAL_Delay(300); } /* USER CODE END PFP */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //是否上电自动启动电机 // MC_StartMotor1(); state MC_GetSTMStateMotor1(); if(stateRUN) { //MC_ProgramSpeedRampMotor1(500, 500); //HAL_Delay (5000); } shan(); // 将控制模式设置为开环电压模式 // MCI_SetOpenLoopVoltageMode(Mci[M1]); // 设定电压为 10% 的满量程 // OL_UpdateVoltage(OpenLoop_ParamsM1, ((10 * 32767) / 100)); //触发保护自救 // if(state11) // { // MC_AcknowledgeFaultMotor1(); //清除报错 // MC_StartMotor1(); // } } /* USER CODE END 3 */ //-------------main.h--------------------- /* USER CODE BEGIN Includes */ #include stdio.h /* USER CODE END Includes */ /* USER CODE BEGIN Private defines */ #define SPI_L_CS_Enable() FOC_L_CS_GPIO_Port-BSRR(uint32_t)FOC_L_CS_Pin16U #define SPI_L_CS_Disable() FOC_L_CS_GPIO_Port-BSRRFOC_L_CS_Pin #define MT6701_Timeout 50 extern int16_t anglee; extern float angle_f;//获取的实际角度 void mt6701_spi_get_L_angle(int16_t *angle, float *angle_f); float getAngle_Without_track(void);//绝对角度(角度制) /* USER CODE END Private defines */stm32_mc_common_it.c//文件开头 /* USER CODE BEGIN Includes */ #include main.h extern UART_HandleTypeDef huart1; /* USER CODE END Includes */ //USART1_IRQHandler函数 /* USER CODE BEGIN USART1_IRQHandler 1 */ HAL_UART_IRQHandler(huart1); /* USER CODE END USART1_IRQHandler 1 */修改启动参数drive_parameters.h/* Phase 1 */ #define PHASE1_DURATION 50 /*milliseconds */ #define PHASE1_FINAL_SPEED_UNIT (0*SPEED_UNIT/U_RPM) #define PHASE1_FINAL_CURRENT_A 7 /* Phase 2 */ #define PHASE2_DURATION 300 /*milliseconds */ #define PHASE2_FINAL_SPEED_UNIT (1000*SPEED_UNIT/U_RPM) #define PHASE2_FINAL_CURRENT_A 7 /* Phase 3 */ #define PHASE3_DURATION 700 /*milliseconds */ #define PHASE3_FINAL_SPEED_UNIT (3333*SPEED_UNIT/U_RPM) #define PHASE3_FINAL_CURRENT_A 7 /* Phase 4 */ #define PHASE4_DURATION 0 /*milliseconds */ #define PHASE4_FINAL_SPEED_UNIT (3333*SPEED_UNIT/U_RPM) #define PHASE4_FINAL_CURRENT_A 5 /* Phase 5 */ #define PHASE5_DURATION 0 /* milliseconds */ #define PHASE5_FINAL_SPEED_UNIT (3333*SPEED_UNIT/U_RPM) #define PHASE5_FINAL_CURRENT_A 5补充任务mc_tasks.c/.hMC_RunMotorControlTasks//mc_tasks.h中 #include main.h //设定停止时间为2ms #define STOPPERMANENCY_MS ((uint16_t)2) //mc_tasks.c中 /* USER CODE BEGIN Private Variables */ extern UART_HandleTypeDef huart1; char g_debug_buf[512]; static uint16_t printCounter 0; const uint16_t PRINT_INTERVAL 50; // 次中频任务 int ctrluser 0; int ctrlkeep 0; // 电流基值 #define CURRENT_SCALE (ADC_REFERENCE_VOLTAGE / (RSHUNT * AMPLIFICATION_GAIN)) // 16.5A // 电压基值 (相电压峰值) #define VOLTAGE_SCALE (NOMINAL_BUS_VOLTAGE_V / 1.73205f) // 6.93V /* USER CODE END Private Variables */ /* USER CODE BEGIN MC_Scheduler 2 */ printCounter; if (printCounter PRINT_INTERVAL) { printCounter 0; // 读取故障 uint16_t occurredFaults MC_GetOccurredFaultsMotor1(); // 读取速度 int16_t speed_internal MC_GetMecSpeedAverageMotor1(); float_t speed_rpm MC_GetAverageMecSpeedMotor1_F(); // 读取状态 MCI_State_t state MC_GetSTMStateMotor1(); // 读取电流旋转坐标系 qd_t iqd MC_GetIqdMotor1(); qd_t vqd MC_GetVqdMotor1(); // 读取原始三相电流 Ia, Ib ab_t iab MC_GetIabMotor1(); float use_angle_f getAngle_Without_track(); // 换算为实际值 float iq (float)iqd.q * CURRENT_SCALE / 32767.0f; float id (float)iqd.d * CURRENT_SCALE / 32767.0f; float vq (float)vqd.q * VOLTAGE_SCALE / 32767.0f; float vd (float)vqd.d * VOLTAGE_SCALE / 32767.0f; // Ia, Ib 换算为实际安培值 float ia (float)iab.a * CURRENT_SCALE / 32767.0f; float ib (float)iab.b * CURRENT_SCALE / 32767.0f; // 格式化为 CSV 行VOFA FireWater 模式 int len sprintf(g_debug_buf, data: %d, %.2f, %d, %.3f, %.3f, %.2f, %.2f, %.3f, %.3f, %f, 0x%04X\n, speed_internal, // col1: 实际速度内部值 speed_rpm, // col2: 实际速度 (RPM) state, // col3: 状态 iq, // col4: 实际 Iq (A) id, // col5: 实际 Id (A) vq, // col6: Vq (V) vd, // col7: Vd (V) ia, // ★col8: A相电流 (A) ib, // ★col9: B相电流 (A) use_angle_f, // ★col10: occurredFaults // ★col11: 历史故障 (0x0000 表示无故障) ); if (len 0) { for (int i 0; i len; i) { while (!(USART1-ISR USART_ISR_TXE)) {} USART1-TDR g_debug_buf[i]; } } if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11)SET) { ctrluser 1; } if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12)SET) { ctrlkeep 1; } if(ctrluser 1) { if(ctrlkeep 0) { if(use_angle_f 40use_angle_f 50) { if(state!STOP) { if(stateRUN||stateSTART) { MC_StopMotor1(); } } } // else if(use_angle_f 310||use_angle_f 40) // { // MC_StartMotor1(); // MC_ProgramSpeedRampMotor1(-800, 500); // } else { MC_StartMotor1(); MC_ProgramSpeedRampMotor1(-600, 500); } } else if(ctrlkeep 1) { if(use_angle_f 290use_angle_f 300) { if(state!STOP) { if(stateRUN||stateSTART) { MC_StopMotor1(); } } } // else if(use_angle_f 50||use_angle_f 320) // { // MC_StartMotor1(); // MC_ProgramSpeedRampMotor1(-800, 500); // } else { MC_StartMotor1(); MC_ProgramSpeedRampMotor1(600, 500); } } } ctrluser 0; ctrlkeep 0; } /* USER CODE END MC_Scheduler 2 */硬件补丁如果因为硬件设计导致电源电压不稳定可以将STSPIN32G4_setVCC改为8V位于mc_tasks.c/*************************************************/ /* STSPIN32G4 driver component initialization */ /*************************************************/ STSPIN32G4_init(HdlSTSPING4); STSPIN32G4_reset(HdlSTSPING4); STSPIN32G4_setVCC(HdlSTSPING4, (STSPIN32G4_confVCC){.voltage _8V, .useNFAULT true, .useREADY false }); STSPIN32G4_setVDSP(HdlSTSPING4, (STSPIN32G4_confVDSP){.deglitchTime _4us, .useNFAULT true }); STSPIN32G4_clearFaults(HdlSTSPING4);

相关新闻

多层板SI信号完整性仿真,深度解析高速信号仿真逻辑

多层板SI信号完整性仿真,深度解析高速信号仿真逻辑

多层板信号完整性 SI 仿真,是高速 PCB 仿真中应用最广泛的模块。很多工程师遇到 DDR 读写出错、高速接口间歇性断连,反复调整上拉电阻、更换芯片,问题依旧存在,根源往往是多层板互连带来的信号反射、串扰、时延偏差。多层板内层带…

2026/10/18 4:08:04 阅读更多 →
G-Helper终极使用指南:10分钟上手华硕笔记本轻量控制工具

G-Helper终极使用指南:10分钟上手华硕笔记本轻量控制工具

G-Helper终极使用指南:10分钟上手华硕笔记本轻量控制工具 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook,…

2026/10/17 17:43:53 阅读更多 →
终极窗口隐藏指南:Boss-Key老板键实战测评,一键秒藏私密窗口

终极窗口隐藏指南:Boss-Key老板键实战测评,一键秒藏私密窗口

终极窗口隐藏指南:Boss-Key老板键实战测评,一键秒藏私密窗口 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 上周三…

2026/10/18 4:09:18 阅读更多 →

最新新闻

Docker跑Oracle XE 11g数据持久化完整指南:从踩坑到稳定方案

Docker跑Oracle XE 11g数据持久化完整指南:从踩坑到稳定方案

Docker跑Oracle XE 11g这事,说简单也简单,docker pull一下、docker run一条命令就能把数据库跑起来,开发环境、演示环境、本地学习都很方便。但说坑也是真坑,尤其是数据持久化这一块——只要你把数据写在容器里面,哪天…

2026/10/19 6:05:39 阅读更多 →
OpenClaw 生产级部署实战:从高可用架构到安全加固

OpenClaw 生产级部署实战:从高可用架构到安全加固

聊一个我最近反复折腾的话题:OpenClaw 的生产级部署。如果你只是想在本地把 OpenClaw 跑起来验证功能,那一条 docker run 就够了,顶多再配个环境变量。但一旦要放到正式环境里,事情就完全变味了——服务要扛得住流量波动&#xff…

2026/10/19 6:05:39 阅读更多 →
单目三维重建实战:Python+OpenCV从标定到点云

单目三维重建实战:Python+OpenCV从标定到点云

简介:这份基于Python的单目三维重建项目源码与文档说明,主要面向计算机、通信、人工智能、自动化等相关专业的本专科学生、教师或从业者,可支撑毕业设计、期末课程设计及项目实战。完整包共12个文件,含Python主程序、Markdown说明…

2026/10/19 6:05:39 阅读更多 →
读懂A股大宗交易:从折价率到营业部的资金预警指南

读懂A股大宗交易:从折价率到营业部的资金预警指南

我第一次认真打开大宗交易数据页面,是在一次股价暴跌之后。当时某只股票盘中走势还算正常,结果收盘后我看到一条大宗交易记录:成交价比当天收盘价低了将近8%,卖方营业部在半个月里反复出现。我没太当回事,直到这只股票…

2026/10/19 6:05:39 阅读更多 →
R语言机器学习工作流实战:从散装脚本到多算法统一实现

R语言机器学习工作流实战:从散装脚本到多算法统一实现

简介:这份资源面向具备一定统计基础、希望用R语言落地机器学习算法的数据分析人员与学生,围绕监督学习与非监督学习两条主线,提供可直接运行的算法实现代码。包内共20个文件,以8个R脚本和6个CSV数据集为主,另含LICENSE…

2026/10/19 6:05:39 阅读更多 →
基于Spring Boot的奖学金评定管理系统设计与实现要点

基于Spring Boot的奖学金评定管理系统设计与实现要点

做毕设选题目的时候,奖学金评定管理系统这东西看着不起眼,真做起来门道不少。它不像电商秒杀那样有高并发噱头,也不像推荐系统那样能晒算法,但胜在业务流程完整——学生申请、辅导员初审、评审打分、结果公示、数据导出&#xff0…

2026/10/19 6:04:38 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →