使用正点原子的直流无刷驱动板自写FOC控制永磁同步(PMSM)电机(开环位置)

news/2024/12/12 11:51:07/文章来源:https://www.cnblogs.com/lizhiqiang0204/p/18602131

由于ST官方MotorControlWorkbench生成的FOC代码过于复杂,决定自己使用正点原子的直流无刷驱动板自己编写FOC去控制PMSM电机。FOC代码参考的是灯哥的教材DengFOC官方文档。

1、配置TIM1高级定时器

 2、foc.c代码

/** foc.c**  Created on: Dec 11, 2024*      Author: ME-LZQ*/#include "main.h"// Constants
#define PI 3.14159265359f
#define PWM_RESOLUTION 5250.0f// Global variables
float voltage_power_supply = 24.0f; // Supply voltage
float zero_electric_angle = 0.0f;   // Zero electrical angle
float cur_angle = 0;// PWM duty cycles
float dc_a = 0.0f;
float dc_b = 0.0f;
float dc_c = 0.0f;// Intermediate variables
float Ualpha = 0.0f;
float Ubeta = 0.0f;
float Ua = 0.0f;
float Ub = 0.0f;
float Uc = 0.0f;// Constrain function
float _constrain(float x, float min, float max) {if (x < min) return min;if (x > max) return max;return x;
}// Calculate electrical angle
float _electricalAngle(float shaft_angle, int pole_pairs) {return (shaft_angle * pole_pairs);
}// Normalize angle to [0, 2PI]
float _normalizeAngle(float angle) {float a = fmod(angle, 2 * PI); // Modulo operationreturn a >= 0 ? a : (a + 2 * PI);
}// Set PWM output to the controller
void setPwm(float Ua, float Ub, float Uc) {// Calculate duty cycles and constrain valuesdc_a = _constrain(Ua / voltage_power_supply, 0.0f, 1.0f);dc_b = _constrain(Ub / voltage_power_supply, 0.0f, 1.0f);dc_c = _constrain(Uc / voltage_power_supply, 0.0f, 1.0f);// Convert duty cycles to PWM valuesuint32_t pwm_a = (uint32_t)(dc_a * PWM_RESOLUTION);uint32_t pwm_b = (uint32_t)(dc_b * PWM_RESOLUTION);uint32_t pwm_c = (uint32_t)(dc_c * PWM_RESOLUTION);// TODO: Replace with actual platform-specific PWM output__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_a);__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pwm_b);__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pwm_c);}// Set phase voltage for motor control
void setPhaseVoltage(float Uq, float Ud, float angle_el) {// Normalize electrical angleangle_el = _normalizeAngle(angle_el + zero_electric_angle);// Inverse Park transformUalpha = -Uq * sin(angle_el);Ubeta = Uq * cos(angle_el);// Inverse Clarke transformUa = Ualpha + voltage_power_supply / 2.0f;Ub = (sqrt(3.0f) * Ubeta - Ualpha) / 2.0f + voltage_power_supply / 2.0f;Uc = (-Ualpha - sqrt(3.0f) * Ubeta) / 2.0f + voltage_power_supply / 2.0f;// Write to PWM channels
    setPwm(Ua, Ub, Uc);
}//Init FOC,start the PWM for U, V, W, and their complementary channels.
void initFoc()
{// Start PWM output on TIM1 Channel 1 (main output)if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)Error_Handler();// Start complementary PWM output on TIM1 Channel 1 (n output)if (HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)Error_Handler();// Start PWM output on TIM1 Channel 2 (main output)if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK)Error_Handler();// Start complementary PWM output on TIM1 Channel 2 (n output)if (HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2) != HAL_OK)Error_Handler();// Start PWM output on TIM1 Channel 3 (main output)if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3) != HAL_OK)Error_Handler();// Start complementary PWM output on TIM1 Channel 3 (n output)if (HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3) != HAL_OK)Error_Handler();}
View Code

3、初始化FOC,设置uq,ud,以及电角度rad,就可以让电机保持在rad位置

  initFoc();//Init FOCsetPhaseVoltage(4.0,0,3.14);//uq = 4.0V ud = 0V, rad = 3.14

 

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

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

相关文章

【Office Access 2024软件下载与安装教程】

1、安装包 「Office LTSC 2024」: 链接:下载地址2、安装教程(建议关闭杀毒软件和系统防护) 1) 下载并解压下载的安装包,双击Setup.exe安装,弹窗安装对话框2) 只留Access选项,点击一键安装3) 保持联网状态 部分在线下载更新4) 安装完成后,解压…

冬季节假日跨境电商运营压力大,哪六款软件能提升效率?

在跨境电商行业,冬季节假日的订单高峰期犹如一场紧张而关键的战役。每一个环节都需要紧密衔接、高效运转,才能在汹涌的订单浪潮中乘风破浪,收获丰硕成果。对于 J 人主导的跨境电商团队公司而言,可视化团队协作办公软件就如同战场上的精良武器,助力团队精准作战,高效协同。…

年底了,产品经理如何写好一份年终工作报告?

项目管理软件在产品经理年终汇报中发挥着关键作用。它不仅帮助产品经理高效整理和展示数据,提高汇报的准确性和逻辑性;还通过实时同步项目进度和风险管理功能,帮助产品经理及时发现问题并采取措施;同时,通过制定详细的汇报大纲和数据驱动的汇报方式,提高了汇报的专业性和…

告别混乱:文档管理系统如何重塑团队工作?

在当今数字化飞速发展的时代,团队协作效率成为企业成功的关键因素之一。而一款出色的文档管理系统软件,就如同团队的智慧中枢,默默地为各项工作提供强大的支持。 以一个项目制的营销团队为例,在日常工作中,从项目策划到执行,涉及大量的文档资料。如市场调研报告、创意策划…

信而泰推出POE交换机一站式自动化测试方案

方案背景 传统POE交换机测试工序主要有扫条码,接网线,POE供电测试,流量测试,LED测试,信息核对等,基本都依赖于手工操作,效率偏低,并且LED测试,POE供电测试依赖人工判断是否良品,容易误测。如果再考虑到操作员工变动等因素,培训员工的时间,员工操作方法不统一等情况…

自定义typeHandler将包含经纬度对象插入到mysql的point类型的字段中

自定义typeHandler将包含经纬度对象插入到mysql的point类型的字段中博客:https://www.emanjusaka.top 公众号:emanjusaka的编程栈 下面给出关键部分代码,完整代码请访问原文地址mysql 中的 point 类型在 java 中没有对应的类型匹配,需要我们自定义 typeHandler 去处理。 环…

cortex-m3基础-概览

cortex-m3是一个32位处理器内核:总线(数据、地址)宽度是32位、寄存器位宽是32位;内核结构为哈佛结构,拥有独立的数据总线和指令总线,可以并行进行指令执行和数据访问;简介cortex-m3是一个32位处理器内核:总线(数据、地址)宽度是32位、寄存器位宽是32位;内核结构为哈…

渠道管理智慧:与新华三谈数字化革新与共赢策略

智算智存全能担当 新华三集团作为数字化解决方案领导者,致力于成为客户业务创新、数字化转型值得信赖的合作伙伴。作为紫光集团旗下的核心企业,新华三通过深度布局"云-网-算-存-端"全产业链,不断提升数字化和智能化赋能水平。新华三拥有计算、存储、网络、5G、安全、…

RocksDB 内存超限问题剖析

在使用 RocksDB 存储引擎的过程中,有部分开发者遇到了内存使用超出预期的情况。本文针对这一问题展开了深入分析,并提出了相应的解决方案和优化建议,提升系统性能和稳定性。作者:来自 vivo 互联网服务器团队- Zeng Luobin在使用 RocksDB 存储引擎的过程中,有部分开发者遇到…

20242822《Linux内核原理与分析》第十二周作业

缓冲区溢出漏洞实验 一、实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。 二、实验准备…

信而泰网络测试仪校准解决方案

一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表,可以模拟网络终端产生流量,进行网络性能测试,对网络状态进行实时监测,分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针,它能促进网络测试仪的规范化、数据化、准确化…

京准电钟:计算机网络监控系统搭建NTP校时服务器

京准电钟:计算机网络监控系统搭建NTP校时服务器京准电钟:计算机网络监控系统搭建NTP校时服务器 京准电钟:计算机网络监控系统搭建NTP校时服务器 京准电钟官微——ahjzsz 我们都知道,对于监控设备来说,设备时间的统一和精准,是保障录像文件及日志可靠的关键。 虽然录像机、…