基于开源项目HAL STM32F4 +DSP库跑SVPWM开环速度测试

HAL STM32F4 +ARM DSP库跑SVPWM开环速度测试


  • ✨本篇硬件电路和代码来源于此开源项目:https://github.com/MengYang-x/STM3F401-FOC/tree/main

  • 📍硬件电路和项目介绍,立创开源广场:https://oshwhub.com/shadow27/tai-yang-neng-wu-ren-chuan

  • 📌 相关篇《自制无感无刷电机驱动板

  • 🌼测试效果:
    在这里插入图片描述

  • 🌻移植到STM32F446上,采用自制电机驱动板,采用EG3112,上下桥臂采用高电平驱动控制。
    在这里插入图片描述

  • 🌿通过vofa+输出的三路马鞍波波形:
    在这里插入图片描述

  • 📝原作者介绍过的内容,这里就不多做介绍了,详情可以前往立创开源主页了解详情。程序这一块,主要针对stm32F4系列。

📘测试条件

  • 🌿STM32F4或者M4内核的相关型号的mcu即可。工程时基于HAL库STM32CubeMX生产的配置工程,移植非常简单。
  • 🌿有感或无感无刷电机,个人测试使用的是:2204-1400KV无感无刷电机,参数:12N14P(12槽14极),也就是,极对数是14/2=7极对数。(程序中需要填写)

  • 🧨硬件支持条件:MCU需要支持浮点运算(FPU)功能。

  • 🌿一块无刷电机驱动板。(可以参考原作者的硬件。)

  • ✨由于原作者使用的是EG2133驱动芯片,驱动电路中上下桥是连一块的,3路PWM输出即可实现无刷电机转动,如果自己使用的是上下桥独立驱动(6路输出控制),那么需要将定时器的PWM输出通道配置为互补输出通道,(即3路互补输出),同时需要注意输出极性。
    在这里插入图片描述

在这里插入图片描述

  • 🍁自制驱动板,驱动桥部分电路在这里插入图片描述
  • 🌿SVPWM开环速度测试,工程中所需要的必要驱动文件:
    在这里插入图片描述
  • 🔖MT6701这里SVPWM开环速度测试,没有使用到,可以屏蔽掉:
    在这里插入图片描述
  • 🔖DSP库文件,可以自己从安装的Keil软件ARM文件夹内找到相关驱动库文件:例如:D:\Keil_v5\ARM\CMSIS\DSP_Lib\Source\FastMathFunctions;或者在STM32CubeMX,安装的对应pack包解压文件夹内,:C:\Users\Administrator\STM32Cube\Repository\STM32Cube_FW_F4_V1.28.0\Drivers\CMSIS\DSP\Source或者标准库STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\DSP_Lib中找到对应的所需驱动文件。
    • 🔖Keil ARM路径下位置:
      在这里插入图片描述
      在这里插入图片描述
  • 👉也可以到ARM官方的GitHub账号(https://github.com/ARM-software/CMSIS)下载所有ARM Cortex-M内核的DSP外设库。
    • 🔖STM32CubeMX,pack解压安装文件位置:
      在这里插入图片描述
      在这里插入图片描述
  • 同样在标准外设库中也可以找到:
    在这里插入图片描述
  • 🌿数字信号库包含在路径:STM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\DSP_LibSTM32F4xx_DSP_StdPeriph_Lib_V1.9.0\Libraries\CMSIS\Lib下,或者Keil安装目录下D:\Keil_v5\ARM\CMSIS\Lib\ARM将它们拷贝到目标工程文件夹下。其中Lib文件夹中包含的是经过不同编译器编译后能够运行在Cortex-M4内核上的底层数学库,DSP_Lib文件夹中包含的是调用底层函数封装而成的API函数源码:
    • 🍃Lib文件夹中包含的底层库包括:
	arm_cortexM4lf_math.lib	//---->stm32f4 DSP库跑SVPWM开环速度测试需要使用到的
    arm_cortexM4bf_math.lib
    arm_cortexM4l_math.lib
    arm_cortexM4b_math.lib
    arm_cortexM3l_math.lib
    arm_cortexM3b_math.lib
    arm_cortexM0l_math.lib
    arm_cortexM0b_math.lib

在这里插入图片描述
在这里插入图片描述

    • 🔰对应工程中所用到的:arm_cortexM4lf_math.lib库文件来源。
      在这里插入图片描述
  • 🎉STM32F4 DSP和标准外设库(STSW-STM32065) ST官网下载地址:https://www.st.com.cn/zh/embedded-software/stsw-stm32065.html
    • 📚当前stm32F4 最新版本:STSW-STM32065 STM32F4 DSP and standard peripherals library 1.9.0
链接:https://pan.baidu.com/s/1J8VD2re8SRWOGnZXZKcyvQ?pwd=o5an 
提取码:o5an
  • ⚡工程中配置的重要一步:需要添加相对于的宏,来开启DSP库进行浮点运算和math计算 “__CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT=1U, ARM_MATH_CM4
    在这里插入图片描述

📙SVPWM实现,DC转AC逆变代码核心函数

// FOC核心函数:输入Uq、Ud和电角度,输出三路PWM
// Uq 范围:0—6.928; MAX:  U0*sqrt3/3 (sqrt平方根),
//需要注意:Uq值设置越大,力矩越大,电流越大,电机发热越大。
void setPhaseVoltage(float Uq, float Ud, float angle_el)
{
    static float Ts = 1.0f;
    float Ta, Tb, Tc;
    float t1, t2, t3, t4, t5, t6, t7;
    float sum, k_svpwm;

    angle_el = _normalizeAngle(angle_el);

    // Park逆变换
    float U_alpha = -Uq * arm_sin_f32(angle_el) + Ud * arm_cos_f32(angle_el);
    float U_beta = Uq * arm_cos_f32(angle_el) + Ud * arm_sin_f32(angle_el);

    // 扇区判断
    float K = sqrt3 * Ts / Udc; // SVPWM调制比
    float u1 = U_beta * K;
    float u2 = (0.8660254f * U_alpha - 0.5f * U_beta) * K; // sqrt(3)/2 = 0.8660254
    float u3 = (-0.8660254f * U_alpha - 0.5f * U_beta) * K;

    uint8_t sector = (u1 > 0.0f) + ((u2 > 0.0f) << 1) + ((u3 > 0.0f) << 2); // sector = A + 2B + 4C

    // 非零矢量和零矢量作用时间的计算
    switch(sector) {
        case 3: // 扇区1
            t4 = u2;
            t6 = u1;
            sum = t4 + t6;
            if(sum > Ts) { // 过调制处理
                k_svpwm = Ts / sum;
                t4 *= k_svpwm;
                t6 *= k_svpwm;
            }
            t7 = (Ts - t4 - t6) / 2.0f;
            Ta = t4 + t6 + t7;
            Tb = t6 + t7;
            Tc = t7;
            break;
        case 1: // 扇区2
            t2 = -u2;
            t6 = -u3;
            sum = t2 + t6;
            if(sum > Ts) {
                k_svpwm = Ts / sum;
                t2 *= k_svpwm;
                t6 *= k_svpwm;
            }
            t7 = (Ts - t2 - t6) / 2.0f;
            Ta = t6 + t7;
            Tb = t2 + t6 + t7;
            Tc = t7;
            break;
        case 5: // 扇区3
            t2 = u1;
            t3 = u3;
            sum = t2 + t3;
            if(sum > Ts) {
                k_svpwm = Ts / sum;
                t2 *= k_svpwm;
                t3 *= k_svpwm;
            }
            t7 = (Ts - t2 - t3) / 2.0f;
            Ta = t7;
            Tb = t2 + t3 + t7;
            Tc = t3 + t7;
            break;
        case 4: // 扇区4
            t1 = -u1;
            t3 = -u2;
            sum = t1 + t3;
            if(sum > Ts) {
                k_svpwm = Ts / sum;
                t1 *= k_svpwm;
                t3 *= k_svpwm;
            }
            t7 = (Ts - t1 - t3) / 2.0f;
            Ta = t7;
            Tb = t3 + t7;
            Tc = t1 + t3 + t7;
            break;
        case 6: // 扇区5
            t1 = u3;
            t5 = u2;
            sum = t1 + t5;
            if(sum > Ts) {
                k_svpwm = Ts / sum;
                t1 *= k_svpwm;
                t5 *= k_svpwm;
            }
            t7 = (Ts - t1 - t5) / 2.0f;
            Ta = t5 + t7;
            Tb = t7;
            Tc = t1 + t5 + t7;
            break;
        case 2: // 扇区6
            t4 = -u3;
            t5 = -u1;
            sum = t4 + t5;
            if(sum > Ts) {
                k_svpwm = Ts / sum;
                t4 *= k_svpwm;
                t5 *= k_svpwm;
            }
            t7 = (Ts - t4 - t5) / 2.0f;
            Ta = t4 + t5 + t7;
            Tb = t7;
            Tc = t5 + t7;
            break;
        default:
            break;
    }

   //  printf("[Ta,Tb,Tc]:%f,%f,%f\r\n", Ta, Tb, Tc);
    Set_PWM(Ta, Tb, Tc); // 配置输出三路PWM,驱动无刷电机转动
}

🛠STM32CubeMX配置

  • 🌿选择一个高级定时器:(注意这里是按照原作者的EG2133驱动芯片配置的,上下桥驱动控制端连一块,进行配置的)

在这里插入图片描述

  • 🧲采用自制驱动板EG3112,上下桥独立驱动,定时器配置互补通道输出:
    在这里插入图片描述

  • ⚡需要注意一点的是:采用互补通道输出控制方式,这里的死区时间参数,保持默认配置值0,如果配置了死区时间,反而对无刷电机的控制造成影响。
    在这里插入图片描述

  • 🌿为了查看输出波形,还需要配置一个串口,方便观察波形。
    在这里插入图片描述

⛳SVPWM开环速度测试工程说明

  • 🌿待测试电机参数配置:motor.c中修改测试电机的极对数。
    在这里插入图片描述
📑极对数测量

✨如果知道电机型号,可以找到对应资料查阅多更好。如果无刷电vofa+机外转子不是全部密封,看的到外转子内壁上永磁体的,可以直接自己数出来。上门贴了有多少块强磁铁,即可得到此数据。对应外转子密封看不到内壁磁体的测量方法:

  • 🌿如果有示波器的情况下,用示波器的探头夹住电机的一根线,另一根接探头,然后旋转电机一圈,截取波形,数下峰的个数(上下峰都算),为偶数值除以2,就是电机的极对数。
  • 🌿有低压直流可调电源情况下,限制一定的电流,加载一个小电压到三相中的任意两相,用手转动电机一圈,有稳定位置的个数就是极对。
  • 🔧SVPWM开环速度参数设定:
 OpenVelocity(6.0f); //数值越大,电机旋转的速度越快 
  • 🌿对于采用3路PWM互补输出方式驱动控制:
// 使能TIMx的通道
void PWM_Init(void)
{
	HAL_TIM_Base_Start(&htim1);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
}

🔬串口数据vofa+观测

  • 🔨vofa+设置:添加波形图控件到主窗口
    在这里插入图片描述

  • 🔱设置串口端口号以及数据类型:
    在这里插入图片描述

  • 🪓🍭打开串口,并添加数据到波形图控件中:
    在这里插入图片描述

  • 🌟最终测试效果:
    在这里插入图片描述

  • ✨需要注意一点,所测得的马鞍波形,并不代表实际电机真实的驱动转动效果,电机的运转效果与驱动电路和电机参数有关,这个波形是理论推导得来的理想模型。
  • 🍁在SVPWM开环速度测试运行下,无刷电机的U-V-W相波形:
    在这里插入图片描述
  • 🧨MCU 定时器对应输出通道的PWM驱动波形:
    在这里插入图片描述
  • 🪓这里的PWM频率,通过示波器测得是15.2K,对应的是程序中定时器输出通道:
    PWM频率 = MAIN_CLK/(ARR*2)(没有进行分频,中心对齐方式)
  • 🥕H桥NMOS管栅极驱动波形:
    在这里插入图片描述

📚移植工程测试源码

  • 🌿基于STM32F446 MIAN FOSC=180MHz,
链接:https://pan.baidu.com/s/1IidjgkeSnOLZg-Dq4Snm9Q?pwd=842c 
提取码:842c
摘要 现实的世界是一个拥有宽度、高度和深度的三维立体世界。在平面二维显示技术已经成熟的今天,三维立体显示技术首当其冲的成为了当今显示技术领域的研究热点。 本作品搭建了基于stm32f4的三维旋转显示平台,它的显示原理属于三维显示中的体三维显示一类。它是通过适当方式来激励位于透明显示体内的物质,利用可见辐射光的产生三维体像素。当体积内许多方位的物质都被激励后,便能形成由许多分散的体像素在三维空间内构成三维图像。 体三维显示又称为真三维显示,因为他所呈现的图像在真实的三维空间中,展示一个最接近真实物体的立体画面,可同时允许多人,多角度裸眼观看场景,无序任何辅助眼镜。 本作品的特点在于,利用stm32f4的浮点运算能力,实现了低成本的体三维显示数据的生产,并利用类似分布式处理的系统结构,满足了体三维显示所需要的巨大数据吞吐量,等效吞吐量可达约300Mb/s 系统方案如图1所示,整个系统由四个模块组成,其中数据获取单元主要由在PC上的上位机完成,利用3D-Max,OpenCV,OpenGL,将三维建模数据转化成三维矢量表述文件,传给由STM32F4Discovery开发板构成的控制单元,利用其上的角度传感器,结合wifi模块或以太网模块通过电力线模式传给LED旋转屏单元,其中的STM32F4负责将ASE文件解析成LED显示阵列所需的点云数据流,通过串行总线传输给由FPGA驱动的LED显示阵列,通过LED刷新速率与机械单元旋转速率相匹配,从而实现体三维显示的效果。 系统的机械部分如图2所示,显示面板的硬件结构如图3,图4所示。本系统的底部是直流电机和碳刷,直流电机主要负责带动上层的显示屏幕高速旋转,而碳刷则负责传递能量和通信信号。在显示屏幕的正面是由96*128构成的三色LED点阵,FPGA的PWM信号通过驱动芯片控制三色LED从而实现真彩显示。在屏幕背面由多块STM32F4,SD卡,FIFO构成,主要负责解析由控制单元传过来的ASE文件,并实时生成体三维显示数据,并传给LED灯板的驱动FPGA,并通过其实现最终的图像显示。 图2 图3 图4 关于实时生成体三维显示数据的讨论: 一个瓦片64*32 LED层FPGA*8:每个16*16LED 中间层stm32*2:每个4LED层的FPGA,也即32*32 由于经过压缩,一个led数据为4bits 所以一个stm32每一帧所要生成的数据为32*32*0.5bytes = 512bytes 转速800转,一帧1/800s = 1.25ms = 1250000ns stm32f4主频168Mhz,指令周期 = 5.93ns 约可执行20万多条指令 假设fsmc总线的速度为50Mhz,则每帧写入的时间大概在0.02ms内 系统创新: 其一,由于高效解析算法的提出,大幅简化了真三维显示器显示数据的获取难度,只需在PC端获得当前较为标准化的三维图形的三角面顶点数据流文件,即可在真三维显示平台上显示出来,使得真三维显示器的整体显示流程大为简化。 其二,由于显示体的结构分为并行的若干区块,各个区块只显示自身的部分,因此显示屏幕的扩大并不会造成数据计算量的大幅增加,这就使得本显示器的扩展性大大增强,可以适用于多种多样的显示范围与领域。 其三,由于高效算法的优化与区块化显示的优势,并行结构的计算量相对较少,这就使得实时控制得以实现,大大增强了真三维显示器的应用领域。 其四,高效算法与区块化显示使得本三维体显示器不需要如国内外其他同类产品的中所需的高速传输方式,因此大大减少了从产品研发到材料再到加工中各个环节的成本。 评测与结论在作品的过程中,我们发现本作品虽然还不是很成熟,也同样具备较大的应用前景与价值。价格成本的极大降低,使得真三维立体显示的门槛很低,那么在一些对清晰度要求不高,但是希望多层次全角度呈现三维图像的应用领域,我们的真三维立体显示器能发挥较大的作用。 不是我写的哦,只用于分享,如涉及版权可联系删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值