F280049C实现Simulink调制,以及多个PWM实例之间的同步

news2025/2/23 16:15:02

文章目录

  • 前言
  • 基本概念
  • 调制发波
  • 载波同步问题

前言

最近作实验碰到了载波不同步的问题,以前也有碰到过这个问题,现在终于解决了,做个记录。

为了以示区分,实例指ePWMx,x=1,2,3,4,5,6,7,8;通道指ePWMxA/B,x=1,2,3,4,5,6,7,8

基本概念

开始接触AC-DC变换,就需要一些特殊的控制策略来进行调制了。一般是先在Simulink中搭建仿真,验证控制策略的可行性,再利用DSP复现控制策略。

在Simulink中,一般是根据调制法发出PWM波的。
在这里插入图片描述
即调制波和载波一同送入比较器,比较器的输出即PWM信号。

在Simulink中,载波由Repeating Sequence模块配置,多数情况下是一个正负半周对称的一个周期信号,且配置为中心对称的三角载波;而调制波一般是计算得到的,也大多情况下是一个有正有负的信号

想想如果我们用C2000器件发出PWM波,哪些模块充当着载波和调制波的作用呢?

  • TBCTR即载波
  • CMPA即调制波

由于实际驱动电路放大的时延性,需要进行死区DeadBand配置,简易起见可以只用CMPA作为输入源,进行翻转,上升沿延时以及下降沿延时等操作就可以得到另一个互补通道xB的信号,所以说CMPA就可以充当调制波的作用了。

调制发波

但是有一个问题,DSP里面的TBCTR只能是非负整数呀,而且CMPA也是一个非负整数。而Simulink里的这些信号都有正有负的,该怎么对应起来呢?

我采用的办法是抬升调制波的办法。

因为在实现调制之前,各种采样,计算等等操作都是可以完全复现的,而DSP的载波相较于Simulink的载波只是变为非负了,相当于抬到了正半轴上,因此我们也可以把调制波给抬上去。

抬升后的结果就是调制波关于调制波的中心线对称。

具体的代码为

void PWM_Generate()
{
    // Anti Park
    float Ualpha = Sin * Uind + Cos * Uinq;
    float Ubeta = -Cos * Uind + Sin * Uinq;
    // Anti Clark
    Ua = Ualpha;
    Ub = -0.5 * Ualpha + 0.866025403784439 * Ubeta;
    Uc = -0.5 * Ualpha - 0.866025403784439 * Ubeta;
    // modulate wave
    float temp1 = 1000 + Modulation * Ua;
    float temp2 = 1000 + Modulation * Ub;
    float temp3 = 1000 + Modulation * Uc;
    // limit
    if (temp1 > 1950)
        temp1 = 1950;
    if (temp1 < 50)
        temp1 = 50;
    if (temp2 > 1950)
        temp2 = 1950;
    if (temp2 < 50)
        temp2 = 50;
    if (temp3 > 1950)
        temp3 = 1950;
    if (temp3 < 50)
        temp3 = 50;

    EPwm1Regs.CMPA.bit.CMPA = (Uint16) temp1;
    EPwm2Regs.CMPA.bit.CMPA = (Uint16) temp2;
    EPwm3Regs.CMPA.bit.CMPA = (Uint16) temp3;
}

载波同步问题

在Simulink中都是共用的同一个载波,而DSP的每一个ePWM的载波都是各自独立的,就会存在不同PWM实例之间的TBCTR不相等的情况,这就是PWM实例之间载波不同步的现象。

至于如何检查不同PWM实例的载波是否同步,可以给每个PWM实例的CMPA一个固定值,然后看各个PWMxA的输出信号是否不存在明显的相移即可。

具体实施办法:

  1. 给想要使用的PWM实例使能相位加载PhaseShifLoad
  2. 填写相位加载值
  3. 关闭时钟
  4. 软件强制同步
  5. 打开时钟
EPwm1Regs.TBCTL.bit.PHSEN = 1;
EPwm1Regs.TBPHS.bit.TBPHS = 1;
EPwm2Regs.TBCTL.bit.PHSEN = 1;
EPwm2Regs.TBPHS.bit.TBPHS = 1;
EPwm3Regs.TBCTL.bit.PHSEN = 1;
EPwm3Regs.TBPHS.bit.TBPHS = 1;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; // disable TB clock
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
EPwm2Regs.TBCTL.bit.SWFSYNC = 1;
EPwm3Regs.TBCTL.bit.SWFSYNC = 1;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; // disable TB clock

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用jmeter进行压测

目录 1.概述 2.测试计划、线程组、取样器 3.调试运行 4.请求默认值 5.流量录制 6.模拟时间间隔 7.压力测试 8.报表 1.概述 一款工具&#xff0c;功能往往是很多的&#xff0c;细枝末节的地方也很多&#xff0c;实际的测试工作中&#xff0c;绝大多数场景会用到的也就是…

看大老如何用Postman+Jmeter实现接口实例

一、接口基础 为什么要单独测试接口&#xff1f; 1. 程序是分开开发的&#xff0c;前端还没有开发&#xff0c;后端已经开发完了&#xff0c;可以提前进入测试 2. 接口直接返回的数据------越底层发现bug&#xff0c;修复成本是越低的 3. 接口测试能模拟功能测试不能测到的异常…

数十位高级测工联合讲解Selenium自动化测试框架工作原理

一、Selenium是什么&#xff1f;   用官网的一句话来讲&#xff1a;Selenium automates browsers. Thats it&#xff01;简单来讲&#xff0c;Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。支持…

uvm寄存器模型

一、基础知识 前门访问与后门访问是两种寄存器的访问方式。 所谓前门访问, 指的是通过模拟cpu在总线上发出读指令, 进行读写操作。 在这个过程中, 仿真时间( $time函数得到的时间) 是一直往前走的。而后门访问是与前门访问相对的概念。 它并不通过总线进行读写操作, 而是…

2023/5/14周报

目录 摘要 论文阅读 1、标题和现存问题 2、准备知识 3、模型结构 4、实验准备 5、实验结果 深度学习 1、大气数据和水质数据 2、数据清洗 3、项目框架设定 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇时空图卷积网络:交通预测的深度学习框架的论文。文章的时…

oracle使用with as创建临时表

一、业务需求 在oracle项目的开发过程中&#xff0c;使用sql编写好对应的分析报表内容后&#xff0c;由于sql分析报表涉及到的一些线别丢失&#xff0c;导致呈现的报表分类统计时固定用醒目颜色标识的统计行数据显示错位&#xff1b;因此需要修复分析报表填充完整的线别。 二、…

LeetCode 62 不同路径

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#…

云上高校导航 小程序 开发教程

Gitee仓库&#xff1a;云上高校导航 GitHub仓库&#xff1a;云上高校导航 “云上高校导航”是一套基于小程序云开发的校园导航类系统开发方案&#xff0c;该开发方案可供开发者进行二次开发&#xff0c;用于解决师生和访客的校园出行需求。 项目优势及创新&#xff1a; 使…

Flink 常用API(2)——转换算子+聚合算子

转换算子&#xff08;Transformation&#xff09; 映射&#xff08;map&#xff09; 用于将数据流中的数据进行转换&#xff0c;形成新的数据流 “一一映射”&#xff0c;消费一个元素就产出一个元素 参数&#xff1a;接口 MapFunction 的实现 方法&#xff1a;map 返回值…

C#串口通信从入门到精通(13)——多个串口发送数据

文章目录 前言1、多串口数据的发送2、源码前言 我们在开发串口通信程序时,有时候会需要连接不止一个串口,这时候该怎么写程序呢?本文就来介绍多个串口数据的发送 1、多串口数据的发送 我们在之前的专栏中介绍了串口数据的发送,当时有提到过,我们是通过创建一个SerialPo…

支付系统设计三:渠道网关设计06-业务处理

文章目录 前言一、业务服务工厂二、业务处理服务1. 业务处理服务2. 业务处理抽象服务3. 流量控制4. 报文提交4.1 获取交易的服务端通讯列表4.2 循环请求支付渠道4.2.1 报文组装4.2.2 报文发送4.2.2.1 协议处理器获取4.2.2.2 构建通讯客户端4.2.2.3 发送请求4.2.2.4 响应报文读取…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

论文/文章/课设 不会写 后端的实现方式?来试试这个吧!

起因 有朋友用了云开发&#xff0c;但是不太会写&#xff0c;老师也不太理解&#xff0c;就来询问我该怎么写&#xff08;不要苛责老师古板&#xff0c;他们确实不一定能够立刻接受新东西&#xff09; 用的不是云开发的也适用以下思路 思路 我们把后端开发类比成拧螺丝&…

非煤矿山电子封条 yolov7

非煤矿山电子封条通过yolov7python网络模型技术&#xff0c;非煤矿山电子封条可以对矿山主副井口、风井口、车辆出入口和调度室等全天候不间断实时分析预警&#xff0c;发现人员违规行为及异常设备状态立即告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研…

GitSVN区别及选型

1、结论先行 git更适用于纯代码仓库&#xff0c;优势在于分支管理svn则擅长于文件管理&#xff0c;优势在于目录级权限控制 2、版本管理发展历程 3、Git&SVN为何而生 Git出生于2005年&#xff0c;是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版…

LeetCode 63 不同路径 II

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。现在考虑网格中有障碍物。那么从左…

一款超级简洁的个人博客系统搭建教程(附源码)

开发环境 IDEA、jdk1.8、mysql8.33 开发框架 springboot 1.首先&#xff0c;确保已安装 Git 和 IntelliJ IDEA。如果你还没有安装 Git&#xff0c;请前往官网下载并安装 Git。 2.打开 IntelliJ IDEA&#xff0c;选择 “File” -> “New” -> “Project from Version Con…

Java面试知识点(全)- Java面试基础部分三

[Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 ThreadPoolExecutor 如果不了解这个类&#xff0c;应该了解前面提到的ExecutorService&#xff0c;开一个自己的线程池非常方便&#xff1a; Execut…

桂院导航小程序 静态项目 二次开发教程

Gitee代码仓库&#xff1a;桂院导航小程序 先 假装 大伙都成功安装了静态项目&#xff0c;并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了&#xff0c;有提到 我的学校 的文字都改成你自己的就行 1. 全局 app.json…

吴恩达教你写提示词 ChatGPT prompt engineering

文章目录 吴恩达教你写提示词 ChatGPT prompt engineering1. 关键提示&#xff08;prompt&#xff09;原则1. 基础2. 编写明确和具体的提示词3. 给模型时间“思考”4. 模型的限制5. 迭代式提示&#xff08;prompt&#xff09;开发过程 2. 提示&#xff08;prompt&#xff09;一…