10126-基于STM32的FOC无刷直流电机三闭环控制系统(详细设计说明书+源码+原理图+PCB)

10126-基于STM32的FOC无刷直流电机三闭环控制系统(详细设计说明书+源码+原理图+PCB)

功能需求:
1、实现电流环控制-力矩模式
2、实现速度环控制-速度模式
3、实现位置环控制-位置模式
4、实现速度力矩模式
5、实现位置力矩模式

资料摘要:
⑴参考了国内外不同的研究内容和参考文献,阐述了大功率关节电机的研究背景和目前国内外研究现状。阐述了研究大功率人形机器人关节电机驱动的重要意义。
⑵介绍了关节电机的结构组成,对关节电机的本体选型进行了分析。对PMSM数学建模以及控制方法的介绍,包括Park、Clarke变化、SVPWM的介绍。
⑶硬件设计主要是对元器件选型、原理图的设计、PCB的绘制。电机驱动的主要模块包括电源模块、主控、栅极驱动器、逆变电路、测量电路。PCB采用四层板设计,芯片封装小,集成度高。
⑷软件设计首先是对底层驱动的开发包括SPI通信的栅极驱动器DRV8353、编码器AS5047;微控制器的ADC、TIM、PWM等外设的设置。然后是对FOC算法的编写,包括Park变化、Clarke变化、SVPWM、PID算法等。最后是整体逻辑框架的编写。
⑸工艺流程主要是对元器件焊接、模块功能的调试流程和方法。功能验证包括力矩控制、速度控制、位置控制,母线电压、板载温度的检测、通信方式控制等功能。

资料包含:
1、Keil5源码+Cubemx配置文件
2、详细设计说明书-15023字
3、原理图+PCB+封装库源文件请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include "main.h"
#include "FOC.H"
#include "arm_math.h"
#include <stdbool.h>
#include "math.h"
#define deg2rad(a) (PI * (a) / 180)
#define rad2deg(a) (180 * (a) / PI)
#define rad60 deg2rad(60)
#define SQRT3 1.73205080756887729353///根号3
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))

float limit_max(float input,float lim)//限幅最大值
{
	if(input>lim)
		return lim;
	else
		return input;
}
float limit_min(float input,float lim)//限幅最小值
{
	if(input<lim)
		return lim;
	else
		return input;
}
float Normalization(float input,float Norm)//归一化函数
{
	float data=fmod(input,Norm);
	return (data>=0)?data:(data+Norm);
}
float cycle_diff(float diff, float cycle)
{
    if (diff > (cycle / 2))
        diff -= cycle;
    else if (diff < (-cycle / 2))
        diff += cycle;
    return diff;
}

float Low_pass_filter(float input,float prop)//低通滤波
{
	static float last_data;
	last_data=(input*prop+last_data*(1-prop));
	return last_data;
}

void SVPWM(float phi, float d, float q, float *d_u, float *d_v, float *d_w)
{
    d = min(d, 1);
    d = max(d, -1);
    q = min(q, 1);
    q = max(q, -1);
    const int v[6][3] = {{1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {0, 1, 1}, {0, 0, 1}, {1, 0, 1}};
    const int K_to_sector[] = {4, 6, 5, 5, 3, 1, 2, 2};
    float sin_phi = arm_sin_f32(phi);
    float cos_phi = arm_cos_f32(phi);
    float alpha = 0;
    float beta = 0;
    arm_inv_park_f32(d, q, &alpha, &beta, sin_phi, cos_phi);

    bool A = beta > 0;
    bool B = fabs(beta) > SQRT3 * fabs(alpha);
    bool C = alpha > 0;

    int K = 4 * A + 2 * B + C;
    int sector = K_to_sector[K];

    float t_m = arm_sin_f32(sector * rad60) * alpha - arm_cos_f32(sector * rad60) * beta;
    float t_n = beta * arm_cos_f32(sector * rad60 - rad60) - alpha * arm_sin_f32(sector * rad60 - rad60);
    float t_0 = 1 - t_m - t_n;

    *d_u = t_m * v[sector - 1][0] + t_n * v[sector % 6][0] + t_0 / 2;
    *d_v = t_m * v[sector - 1][1] + t_n * v[sector % 6][1] + t_0 / 2;
    *d_w = t_m * v[sector - 1][2] + t_n * v[sector % 6][2] + t_0 / 2;
}







Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐