首页 > 其他分享 >FOC系列电机入门知识

FOC系列电机入门知识

时间:2024-09-01 22:36:24浏览次数:10  
标签:入门 电机 svpwm t7 sum float ts t3 FOC

 

原文链接:https:/

/*
 * foc.c
 *
 *  Created on: 2024年9月1日
 *      Author: 13624
 */
#include"main.h"
#include "foc.h"
//帕克变换
  float u_d;//d坐标系电压
  float u_q;//q坐标系电压
  float theta;//电角度
//克拉克变换
  float u_alpha;//
  float u_beta;//
//svpwm
  float t_a;
  float t_b;
  float t_c;

  float i_a;
  float i_b;
  float i_c;

  float i_alpha;
  float i_beta;

  float i_d;
  float i_q;


  void ipark() {
      sine = sin(theta);
      cosine = cos(theta);
      u_alpha = u_d * cosine - u_q * sine;
      u_beta = u_q * cosine + u_d * sine;
    }

    void ipark2() {
      u_alpha = u_d * cosine - u_q * sine;
      u_beta = u_q * cosine + u_d * sine;
    }

    void clarke() {
      i_alpha = i_a;
      i_beta = (i_a + 2 * i_b) *0.5773502691896257;//sqrt(3) = 0.5773502691896257;
    }

    void park() {
      sine = sin(theta);
      cosine = cos(theta);
      i_d = i_alpha * cosine + i_beta * sine;
      i_q = i_beta * cosine - i_alpha * sine;
    }

    void svpwm() {
      const float ts = 1;

      float u1 = u_beta;
      float u2 = -0.8660254037844386 * u_alpha - 0.5 * u_beta;
      float u3 = 0.8660254037844386 * u_alpha - 0.5 * u_beta;

      uint8_t sector = (u1 > 0.0) + ((u2 > 0.0) << 1) + ((u3 > 0.0) << 2);

      if (sector == 5) {
        float t4 = u3;
        float t6 = u1;
        float sum = t4 + t6;
        if (sum > ts) {
          k_svpwm = ts / sum;
          t4 = k_svpwm * t4;
          t6 = k_svpwm * t6;
        }
        float t7 = (ts - t4 - t6) / 2;
        t_a = t4 + t6 + t7;
        t_b = t6 + t7;
        t_c = t7;
      } else if (sector == 1) {
        float t2 = -u3;
        float t6 = -u2;
        float sum = t2 + t6;
        if (sum > ts) {
          k_svpwm = ts / sum;
          t2 = k_svpwm * t2;
          t6 = k_svpwm * t6;
        }
        float t7 = (ts - t2 - t6) / 2;
        t_a = t6 + t7;
        t_b = t2 + t6 + t7;
        t_c = t7;
      } else if (sector == 3) {
        float t2 = u1;
        float t3 = u2;
        float sum = t2 + t3;
        if (sum > ts) {
          k_svpwm = ts / sum;
          t2 = k_svpwm * t2;
          t3 = k_svpwm * t3;
        }
        float t7 = (ts - t2 - t3) / 2;
        t_a = t7;
        t_b = t2 + t3 + t7;
        t_c = t3 + t7;
      } else if (sector == 2) {
        float t1 = -u1;
        float t3 = -u3;
        float sum = t1 + t3;
        if (sum > ts) {
          k_svpwm = ts / sum;
          t1 = k_svpwm * t1;
          t3 = k_svpwm * t3;
        }
        float t7 = (ts - t1 - t3) / 2;
        t_a = t7;
        t_b = t3 + t7;
        t_c = t1 + t3 + t7;
      } else if (sector == 6) {
        float t1 = u2;
        float t5 = u3;
        float sum = t1 + t5;
        if (sum > ts) {
          k_svpwm = ts / sum;
          t1 = k_svpwm * t1;
          t5 = k_svpwm * t5;
        }
        float t7 = (ts - t1 - t5) / 2;
        t_a = t5 + t7;
        t_b = t7;
        t_c = t1 + t5 + t7;
      } else if (sector == 4) {
        float t4 = -u2;
        float t5 = -u1;
        float sum = t4 + t5;
        if (sum > ts) {
          k_svpwm = ts / sum;
          t4 = k_svpwm * t4;
          t5 = k_svpwm * t5;
        }
        float t7 = (ts - t4 - t5) / 2;
        t_a = t4 + t5 + t7;
        t_b = t7;
        t_c = t5 + t7;
      }
    }
    void Foc_Run()
    {
         for (double theta = 0; theta < 7; theta += 1e-3) {
        foc.u_d = 0.1;
        foc.u_q = 0;
        foc.theta = theta;
        foc.ipark();
        foc.svpwm();
        double u_a = foc.t_a - 0.5 * (foc.t_b + foc.t_c);
        double u_b = foc.t_b - 0.5 * (foc.t_a + foc.t_c);
        double u_c = -(u_a + u_b);
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,u_a*4200);
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,u_b*4200);
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,u_c*4200);

    }

/*
* foc.h
*
* Created on: 2024年9月1日
* Author: 13624
*/

#ifndef INC_FOC_H_
#define INC_FOC_H_

//帕克变换
extern float u_d;//d坐标系电压
extern float u_q;//q坐标系电压
extern float theta;//电角度
//克拉克变换
extern float u_alpha;//
extern float u_beta;//
//svpwm
extern float t_a;
extern float t_b;
extern float t_c;

extern float i_a;
extern float i_b;
extern float i_c;

extern float i_alpha;
extern float i_beta;

float i_d;
float i_q;


void ipark() ;

void ipark2();

void clarke() ;

void park() ;

void svpwm() ;
void Foc_Run();


#endif /* INC_FOC_H_ */

/blog.csdn.net/qq_35947329/article/details/115483413

标签:入门,电机,svpwm,t7,sum,float,ts,t3,FOC
From: https://www.cnblogs.com/mokongking/p/18391877

相关文章

  • 测试小白入门-03测试理论知识看这一篇就够了
    文章目录前言一、软件开发过程模型瀑布开发模型(熟悉)快速原型模型(理解)螺旋模型(了解)二、测试模型测试V模型(代表性)测试W模型(中大型企业)测试H模型(了解)三、测试方法分类是否覆盖源代码是否运行是否覆盖源代码是否自动化其他四、编写测试用例的方法1.等价划分类2.边界值3.......
  • Go入门:gin框架极速搭建图书管理系统
    Go入门:gin框架极速搭建图书管理系统前言本项目适合Golang初学者,通过简单的项目实践来加深对Golang的基本语法和Web开发的理解。项目源码请私信,欢迎前往博主博客torna.top免费查看。项目结构D:.├─go.mod├─go.sum│├─cmd│└─main│......
  • java入门:安装开发环境
    安装JDK1:百度搜索JDK8,找到下载地址2:登录并同意协议3:下载电脑对应的版本4:双击安装JDK5:记住安装的路径(重要)6:配置环境变量我的电脑>右键>属性找到高级系统设置>环境变量>在系统设置下找到新建>变量名是JAVA_HOME>变量值填安装的路径7:配置path变量在系统变量中找到path......
  • Vue入门(四)Vue异步操作Axios
    一、Vue异步操作在Vue中发送异步请求,本质上还是AJAX。我们可以使用axios这个插件来简化操作!-使用步骤1.引入axios核心js文件。2.调用axios对象的方法来发起异步请求。3.调用axios对象的方法来处理响应的数据。-axios常用方法get:发起Get方式请求post:发起Po......
  • 研究生深度学习入门的十天学习计划------第二天
    第2天:学习神经网络的构建与基本操作目标:学会使用Python和TensorFlow/Keras构建简单的神经网络模型,理解基本操作和训练过程。2.1选择开发环境并安装依赖在开始动手构建神经网络之前,需要选择一个合适的开发环境并安装相关依赖。常用的开发环境包括JupyterNotebook、Go......
  • Datawhale X 李宏毅苹果书 AI夏令营-跟李宏毅学深度学习(入门)Task3笔记
    目录一、机器学习框架&实践攻略1.总览2.训练误差较大时:    1.模型偏差    2. 优化问题3.训练误差较小时:    1.测试误差较小:    2.测试误差较大:            1.过拟合    2.不匹配一、机器学习框架&实......
  • Vue入门(三)Vue生命周期
    一、Vue生命周期Vue生命周期的八个阶段创建前beforeCreate创建后created载入前beforeMount载入后mounted更新前beforeUpdate更新后updated销毁前beforeDestroy销毁后destroyedVue生命周期的八个阶段如下图:  二、生命周期示例生命周期示例代码: <!DOCTYPEhtml>......
  • jQuery入门(七)jQuery实现按钮分页
    一、分页案例分析功能分析:使用分页插件,实现分页,效果如下图:  二、实现思路和代码2.1)页面实现分析1.引入分页插件的样式文件和js文件。2.定义当前页码和每页显示的条数。(分页必备信息)3.调用查询数据的函数。4.定义请求查询分页数据的函数,发起AJAX异步......
  • jQuery入门(六)jQuery实现瀑布分页
    一、瀑布流分页案例分析1.1)功能分析:鼠标下拉,加载分页数据(10条),如下图:  1.2)如何确定当前显示的数据已经浏览完毕?公式:(滚动条距底部的距离+滚动条上下滚动的距离+当前窗口的高度)>=当前文档的高度举例:-当前文档高......
  • stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)
    理论1.输出比较简介OC(OutputCompare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出的功......