0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA实现FOC算法之PWM模块设计

FPGA研究院 ? 来源:FPGA之旅 ? 2025-07-17 15:21 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一.简介

哈喽,大家好,从今天开始正式带领大家从零到一,在FPGA平台上实现FOC算法,整个算法的框架如下图所示,如果大家对算法的原理不是特别清楚的话,可以先去百度上学习一下,本教程着重介绍实现过程,弱化原理的介绍。那么本文将从PWM模块开始进入FOC算法中去。

6faaa3e0-5c54-11f0-baa5-92fbcf53809c.png

二. PWM模块设计

我们知道有些驱动芯片是需要输入互补的PWM,例如FD6288,而有些驱动芯片则只需要输入PWM,芯片内部会自动将其转为互补的PWM进行工作,例如DRV8313和MP6540。单路FOC开发板使用的是MP6540,多路电机驱动板使用的是FD6288,因此设计的PWM模块需要兼容这两种模式。

1. 模块端口信号

模块端口信号如下所示,命名和工作模式借鉴了STM32定时器的工作方式。

moduletimer_top #(
 parameter   DEFAULT_ARR  =16'd1500 , //5000
  parameter    DEFAULT_CCR   = 16'd750  , //2500
 parameter   COUNT_MODE   ="UP"   , //UP DOWN CENTRE
 parameter   TRIG_ENABLE  ="ENABLE" , //ENABLE DISABLE
 parameter   PWM_OUT    ="NONE"  , //NONEP PN
 parameter   PWM_OUT_MODE  ="MODE1"  , //MODE1 MODE2
 parameter   PWM_DEATH_TIME =3'd0     // 0 ~ 10 sys_clk
)(
  input      sys_clk_i      , 
  input      sys_rst_n_i     ,


  input      pwm_clk_200M_i   ,


  input      timer_wr_type_i   ,
  input      timer_write_en_i  ,
  input[15:0]   timer_write_data_i ,
  input      timer_read_en_i   ,
  output[15:0]  timer_read_data_o  ,


  output     timer_trig_o    ,
  output     timer_pwm_o     ,
  output reg   timer_pwm_n_o   
);

首先给大家介绍一下端口参数

DEFAULT_ARR: 默认的定时器计数周期。

DEFAULT_CCR: 默认的定时器比较输出值。

COUNT_MODE: 定时器工作模式,分为向上计数、向下计数和中心计数三种模式,这是和STM32的三种模式保持一致。

TRIG_ENABLE:中断输出是否使能,当计数器计数到CCR寄存器值的时候,是否输出一个中断信号。

PWM_OUT: PWM输出,分为三种模式,其一是不输出,其二是只输出一路PWM,其三是输出互补两路PWM。

PWM_OUT_MODEL: PWM输出的模式,也就是但计数器小于CCR的时候,是输出高电平,还是输出低电平。

PWM_DEATH_TIME: 死区时间,最大为10个时钟周期,也就是50ns,加上芯片内部基本上都内置了死区补偿,这个时间是够用了的。

然后就是端口信号

sys_clk_i,sys_rst_n_i: 100Mhz系统时钟和系统复位

pwm_clk_200M_i: PWM输出的参考时钟,为200Mhz,这个时钟频率越高,PWM的分辨率也就越高。

timer_trig_o: 中断信号输出

timer_pwm_o,timer_pwm_n_o: PWM信号输出

其他:动态调整定时器的计数周期ARR和比较值CCR,从而可以调整PWM的频率和占空比,实际使用的过程中,只会调整占空比。

2. 设计细节

PWM模块设计原理比较简单,其中有两点需要注意一下,这两点中好了 ,设计起来就毫无压力~。

1. 跨时钟同步: 定时器时钟频率为200Mhz,而系统时钟频率为100Mhz,模块只会涉及到中断信号的同步,定时器时钟域同步到系统时钟域下,快时钟域同步到慢时钟域下,也是同步场景中最为常见的一种,这里直接将脉冲信号作为使能信号,对另外一个信号进行取反,然后检查其边沿即可实现同步。

always@( posedge pwm_clk_200M_i or negedge sys_rst_n_i )begin
 if( sys_rst_n_i ==1'b0 )
    timer_trig_pluse <= 1'b0;
? ??elseif( TRIG_ENABLE ==?"ENABLE"?&& CNT == CCR_SHADOW )
? ? ? ? timer_trig_pluse <= ~timer_trig_pluse;
? ??else
? ? ? ? timer_trig_pluse <= timer_trig_pluse;
end
always@( posedge sys_clk_i or negedge sys_rst_n_i )?begin
? ??if( sys_rst_n_i ==?1'b0 ) begin
? ? ? ? timer_trig_pluse_d0 <= 1'b0;
? ? ? ? timer_trig_pluse_d1 <=?1'b0;
? ? end
? ? else begin
? ? ? ? timer_trig_pluse_d0 <= timer_trig_pluse;
? ? ? ? timer_trig_pluse_d1 <= timer_trig_pluse_d0;
? ? end
end

1.互补PWM输出死区控制:死区控制的目的是为了防止短时间内两路PWM输出同时为高的情况发生,从而导致上下臂同时导通,了解了这个之后,就只需要将互补PWM输出信号中,输出为高电平的那个信号提前拉低即可,在实现的过程中要结合配置的定时器模式进行输出,会涉及到多重判断的情况,如下图所示,大家可以通过多级判断,去优化这部分时序。

6fc04088-5c54-11f0-baa5-92fbcf53809c.png

最后给大家展示一下仿真结果

6fd2aa7a-5c54-11f0-baa5-92fbcf53809c.png

来源:本文转载自FPGA之旅公众号

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1646

    文章

    22059

    浏览量

    619211
  • PWM
    PWM
    +关注

    关注

    116

    文章

    5581

    浏览量

    219661
  • 算法
    +关注

    关注

    23

    文章

    4713

    浏览量

    95550
  • 驱动芯片
    +关注

    关注

    13

    文章

    1414

    浏览量

    56490

原文标题:FPGA从零到一实现FOC(一)之PWM模块设计

文章出处:【微信号:FPGA研究院,微信公众号:FPGA研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FOC 算法实现永磁同步电机调整指南

    本文档介绍了使用 FOC 算法实现永磁同步电机 (Permanent Magnet SynchronousMotor,PMSM)调整所需的步骤和设置,该算法如 AN1078《PMSM
    发表于 03-03 01:53

    FOC算法原理!

    FOCFOC算法
    YS YYDS
    发布于 :2023年04月17日 18:12:34

    FPGA设计浮点DSP算法实现【赛灵思工程师作品】

    FPGA设计浮点DSP算法实现,DSP算法是很多工程师在设计过程中都会遇到的问题,本文将从FPGA
    发表于 03-01 15:23

    有感FOC算法学习与实现总结

    原文:https://blog.csdn.net/u010632165/article/details/103656254文章目录基于STM32的有感FOC算法学习与实现总结1 前言2 FOC
    发表于 07-05 06:45

    STM32 Foc开源算法是什么

    STM32 Foc开源算法,包括观测器和Foc method STM32F0系列FOC 源代码,有单电阻采样和三电阻采样两种代码。都是ST很经典算法
    发表于 09-06 08:09

    如何对电机控制算法FOC进行调试

    什么是FOCFOC算法的原理是什么?FOC算法模块是由哪些部分组成的?如何对
    发表于 09-18 09:16

    采用FPGA实现SVPWM调制算法

    1. 为什么要使用FPGA实现在全控型电力电子开关器件出现以后,为了改善交流电动机变压变频调速系统的性能,科技工作者在20世纪80年代开发出了应用脉宽调制(PWM)技术的变压变频器,由于它的优良
    发表于 01-20 09:34

    如何实现FOC算法

    如何实现FOC算法
    发表于 02-23 07:47

    基于FPGA 的指纹识别算法硬件实现

    提出用FPGA实现指纹识别算法, 代替了PC 机、通用MCU 或者DSP。算法由硬件来实现, 提高了运算速度。同时具体说明了指纹识别系统
    发表于 07-22 15:17 ?0次下载

    基于FPGA的空间矢量PWM实现

    本文详述了空间矢量SV PWM算法, 并提出用FPGA 实现SV PWM 的方法, 最后分析了使用FP2GA 的优点
    发表于 10-19 16:11 ?30次下载

    基于FPGA的横向LMS算法实现

       横向LMS算法实现自适应数字波束形成的基本方法之一。提出了一种用Matab/Simulink中DSP Builder模块库设计算法模型,然后应用
    发表于 12-07 14:03 ?23次下载

    ECT图像重建算法FPGA实现

    ECT图像重建算法FPGA实现 ECT图像重建算法FPGA实现
    发表于 11-19 14:59 ?2次下载

    foc控制算法FOC_stm32主控pmsm源码

    foc控制算法FOC_stm32主控pmsm源码
    发表于 12-20 22:55 ?168次下载

    FPGA实现PID控制算法

    相信大家对于PID控制算法,都不感到陌生了,平衡车就是靠它平衡起来的,还有飞控的平衡算法也是它,以及FOC中的闭环控制中也是用的它,它不仅简单,而且易于理解。那么本篇文章将简要介绍一下算法
    的头像 发表于 05-19 16:40 ?2121次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>PID控制<b class='flag-5'>算法</b>

    foc电机控制需要几个pwm foc控制算法介绍

    一般PWM用于控制电机的直流母线电压,其输出频率一般为几千赫兹,可以有效地抑制电机的噪声和震动。通过PWM的占空比来调节直流电压,从而实现对电机的调速和调转矩。一般PWM一般由开发板或
    的头像 发表于 06-10 07:40 ?5039次阅读