28335 ePWM模块 中心移相与边沿移相代码

2024-04-26 04:28

本文主要是介绍28335 ePWM模块 中心移相与边沿移相代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

中心移相

最常见的中心移相示意图如下:

可以看到其中的PWM1作为主相,其余PWM2和PWM3都作为其的辅相。中心移相,顾名思义,就是移动相位参考高电平的中心,当占空比D=0.5时,其移相与我们认为的上升沿移相一致,也就是最常见的移相。

为方便理解,先给相关设置的结构体设置:

typedef struct {volatile struct EPWM_REGS* ePWMx;Uint32 Fs;double D;Uint32 td;
} ePWM_Master_Set_Struct;typedef struct {volatile struct EPWM_REGS* ePWMx;double D;double Phase;Uint32 td;
} ePWM_Slave_Set_Struct;

其中 ePWM_Master_Set_Struct 是主相设置函数,而 ePWM_Slave_Set_Struct 辅相设置函数。

这是初始化ePWM初始化设置具体实现函数及其定义

void ePWM_Master_Set_Flush(ePWM_Master_Set_Struct* pwm);//中心对齐移相 主要
void ePWM_Slave_Set_Flush(ePWM_Master_Set_Struct* master_pwm,ePWM_Slave_Set_Struct* slave_pwm);//中心对齐移相 次要
void ePWM_Master_Set_Flush(ePWM_Master_Set_Struct* pwm)
{EALLOW;// Initialization Time(TB)pwm->ePWMx->TBPRD=75e6/pwm->Fs;pwm->ePWMx->TBPHS.half.TBPHS = 0; //不进行移相pwm->ePWMx->TBCTR=0; //计数器清零pwm->ePWMx->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //上计数模式pwm->ePWMx->TBCTL.bit.PHSEN = TB_DISABLE; //主机模式pwm->ePWMx->TBCTL.bit.PRDLD = TB_SHADOW;pwm->ePWMx->TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; //减到0时发出同步信号pwm->ePWMx->TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUTpwm->ePWMx->TBCTL.bit.CLKDIV = TB_DIV1;pwm->ePWMx->CMPCTL.bit.SHDWAMODE = CC_SHADOW;pwm->ePWMx->CMPCTL.bit.SHDWBMODE = CC_SHADOW;pwm->ePWMx->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zeropwm->ePWMx->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zeropwm->ePWMx->AQCTLA.bit.CAD = AQ_SET;  //计数比CA低时PWMA输出高pwm->ePWMx->AQCTLA.bit.CAU = AQ_CLEAR;  //比CA高时PWMA输出低pwm->ePWMx->AQCTLB.bit.CAD = AQ_CLEAR; //计数比CA低时PWMB输出低pwm->ePWMx->AQCTLB.bit.CAU = AQ_SET; //计数比CA高时PWMB输出高pwm->ePWMx->CMPA.half.CMPA = pwm->ePWMx->TBPRD *pwm->D;       // Set compare A value// Initialization Dead-Band(DB)pwm->ePWMx->DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; //上升沿和下降沿都开启延迟pwm->ePWMx->DBCTL.bit.IN_MODE=DBA_ALL; //A作为源信号pwm->ePWMx->DBCTL.bit.POLSEL=DB_ACTV_HIC;//PWMA、B互补相反pwm->ePWMx->DBRED=pwm->td;//死区设置pwm->ePWMx->DBFED=pwm->td;// Initialization Trip-Zone(TZ)pwm->ePWMx->TZCTL.bit.TZA=2;    //PWM-A\B均输出低电平pwm->ePWMx->TZCTL.bit.TZB=2;pwm->ePWMx->TZCLR.bit.OST=1;    //清空OST标志位EDIS;
}void ePWM_Slave_Set_Flush(ePWM_Master_Set_Struct* master_pwm,ePWM_Slave_Set_Struct* slave_pwm)
{EALLOW;// Initialization Time(TB)slave_pwm->ePWMx->TBPRD=75e6/master_pwm->Fs;slave_pwm->ePWMx->TBPHS.half.TBPHS = fabs(slave_pwm->Phase)/180*slave_pwm->ePWMx->TBPRD; //设置移相角度,相对于主pwm提前角度slave_pwm->ePWMx->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;slave_pwm->ePWMx->TBCTL.bit.PHSEN = TB_ENABLE;if(slave_pwm->Phase>=0)slave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_UP;elseslave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_DOWN;slave_pwm->ePWMx->TBCTL.bit.PRDLD = TB_SHADOW;slave_pwm->ePWMx->TBCTL.bit.SYNCOSEL = TB_SYNC_IN;slave_pwm->ePWMx->TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUTslave_pwm->ePWMx->TBCTL.bit.CLKDIV = TB_DIV1;slave_pwm->ePWMx->CMPCTL.bit.SHDWAMODE = CC_SHADOW;slave_pwm->ePWMx->CMPCTL.bit.SHDWBMODE = CC_SHADOW;slave_pwm->ePWMx->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;slave_pwm->ePWMx->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;slave_pwm->ePWMx->AQCTLA.bit.CAD = AQ_SET;  //计数比CA低时PWMA输出高slave_pwm->ePWMx->AQCTLA.bit.CAU = AQ_CLEAR;  //比CA高时PWMA输出低slave_pwm->ePWMx->AQCTLB.bit.CAD = AQ_CLEAR; //计数比CA低时PWMB输出低slave_pwm->ePWMx->AQCTLB.bit.CAU = AQ_SET; //计数比CA高时PWMB输出高slave_pwm->ePWMx->CMPA.half.CMPA = slave_pwm->ePWMx->TBPRD *slave_pwm->D;       // Set compare A value// Initialization Dead-Band(DB)slave_pwm->ePWMx->DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; //上升沿和下降沿都开启延迟slave_pwm->ePWMx->DBCTL.bit.IN_MODE=DBA_ALL; //A作为源信号slave_pwm->ePWMx->DBCTL.bit.POLSEL=DB_ACTV_HIC;//PWMA、B互补相反slave_pwm->ePWMx->DBRED=slave_pwm->td;//死区设置slave_pwm->ePWMx->DBFED=slave_pwm->td;// Initialization Trip-Zone(TZ)slave_pwm->ePWMx->TZCTL.bit.TZA=2;    //PWM-A\B均输出低电平slave_pwm->ePWMx->TZCTL.bit.TZB=2;slave_pwm->ePWMx->TZCLR.bit.OST=1;    //清空OST标志位EDIS;
}

在程序运行中,进行调频、调宽、移相等操作就需要以下函数

void ePWM_Master_Set(ePWM_Master_Set_Struct* master_pwm);//中心对齐移相 主要
void ePWM_Slave_Set(ePWM_Slave_Set_Struct* slave_pwm,ePWM_Master_Set_Struct* master_pwm);//中心对齐移相 次要
void ePWM_Slave_Set(ePWM_Slave_Set_Struct* slave_pwm,ePWM_Master_Set_Struct* master_pwm)
{if(slave_pwm->Phase>=0)slave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_UP;elseslave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_DOWN;slave_pwm->ePWMx->TBPRD=75e6/master_pwm->Fs;slave_pwm->ePWMx->TBPHS.half.TBPHS = fabs(slave_pwm->Phase)/180*slave_pwm->ePWMx->TBPRD;slave_pwm->ePWMx->CMPA.half.CMPA = slave_pwm->ePWMx->TBPRD *slave_pwm->D;
}void ePWM_Master_Set(ePWM_Master_Set_Struct* master_pwm)
{master_pwm->ePWMx->TBPRD=75e6/master_pwm->Fs;master_pwm->ePWMx->CMPA.half.CMPA = master_pwm->ePWMx->TBPRD *master_pwm->D;
}

这里给个demo,实现上面3个pwm的初始化程序如下:

void Init_ePWM()
{InitEPwm1Gpio();    //初始化 A0-EPWM1A  A1-EPWM1BInitEPwm2Gpio();    //初始化 A2-EPWM2A  A3-EPWM2BInitEPwm3Gpio();    //初始化 A4-EPWM3A  A5-EPWM3Bpwm1.ePWMx=&EPwm1Regs;pwm1.Fs=50e3; //50khzpwm1.D=0.25.; //0.25占空比pwm1.td=50; //0.5us 死区时间ePWM_Master_Set_Flush(&pwm1); //pwm1作为主pwm 初始化pwm2.ePWMx=&EPwm2Regs;pwm2.D=0.4; //0.4占空比pwm2.Phase=0; //不移相pwm2.td=50;ePWM_Slave_Set_Flush(&pwm1,&pwm2); //pwm2以pwm1作为主pwmpwm3.ePWMx=&EPwm3Regs;pwm3.D=0.4; //0.4占空比pwm3.Phase=-0.3*360; //滞后108°,这个参数范围为 -180°~+180°pwm3.td=50;ePWM_Slave1_Set_Flush(&pwm1,&pwm3); //pwm3以pwm1作为主pwmEALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers syncedEDIS;
}

边沿移相

边沿移相示意图如下:

结构体和上面中心移相一致,实现代码如下:

void ePWM_Master1_Set_Flush(ePWM_Master_Set_Struct* pwm);//上升沿对齐移相 主要 D<=0.5
void ePWM_Slave1_Set_Flush(ePWM_Master_Set_Struct* master_pwm,ePWM_Slave_Set_Struct* slave_pwm);//上升沿对齐移相 次要 D<=0.5
void ePWM_Master1_Set_Flush(ePWM_Master_Set_Struct* pwm)
{EALLOW;// Initialization Time(TB)pwm->ePWMx->TBPRD=75e6/pwm->Fs;pwm->ePWMx->TBPHS.half.TBPHS = 0; //不进行移相pwm->ePWMx->TBCTR=0; //计数器清零pwm->ePWMx->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //上下计数模式pwm->ePWMx->TBCTL.bit.PHSEN = TB_DISABLE; //主机模式pwm->ePWMx->TBCTL.bit.PRDLD = TB_SHADOW;pwm->ePWMx->TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; //减到0时发出同步信号pwm->ePWMx->TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUTpwm->ePWMx->TBCTL.bit.CLKDIV = TB_DIV1;pwm->ePWMx->CMPCTL.bit.SHDWAMODE = CC_SHADOW;pwm->ePWMx->CMPCTL.bit.SHDWBMODE = CC_SHADOW;pwm->ePWMx->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zeropwm->ePWMx->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zeropwm->ePWMx->AQCTLA.bit.ZRO = AQ_SET;  //计数0时PWMA输出高pwm->ePWMx->AQCTLA.bit.CAU = AQ_CLEAR;  //比CA高时PWMA输出低pwm->ePWMx->AQCTLB.bit.PRD = AQ_CLEAR; //计数PRD时输出高pwm->ePWMx->AQCTLB.bit.CBD = AQ_SET; //计数比CB低时PWMB输出低pwm->ePWMx->CMPA.half.CMPA = pwm->ePWMx->TBPRD *pwm->D*2;       // Set compare A valuepwm->ePWMx->CMPB = pwm->ePWMx->TBPRD *(1-pwm->D*2)+1;       // Set compare B value// Initialization Dead-Band(DB)pwm->ePWMx->DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; //A\B均开启死区pwm->ePWMx->DBCTL.bit.IN_MODE=DBA_RED_DBB_FED; //A上升沿,B下降沿源信号pwm->ePWMx->DBCTL.bit.POLSEL=DB_ACTV_HIC;//PWMA、B互补相反pwm->ePWMx->DBRED=pwm->td;//死区设置pwm->ePWMx->DBFED=pwm->td;// Initialization Trip-Zone(TZ)pwm->ePWMx->TZCTL.bit.TZA=2;    //PWM-A\B均输出低电平pwm->ePWMx->TZCTL.bit.TZB=2;pwm->ePWMx->TZCLR.bit.OST=1;    //清空OST标志位EDIS;
}void ePWM_Slave1_Set_Flush(ePWM_Master_Set_Struct* master_pwm,ePWM_Slave_Set_Struct* slave_pwm)
{EALLOW;// Initialization Time(TB)slave_pwm->ePWMx->TBPRD=75e6/master_pwm->Fs;slave_pwm->ePWMx->TBPHS.half.TBPHS = fabs(slave_pwm->Phase)/180*slave_pwm->ePWMx->TBPRD; //设置移相角度,相对于主pwm提前角度slave_pwm->ePWMx->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;slave_pwm->ePWMx->TBCTL.bit.PHSEN = TB_ENABLE;if(slave_pwm->Phase>=0)slave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_UP;elseslave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_DOWN;slave_pwm->ePWMx->TBCTL.bit.PRDLD = TB_SHADOW;slave_pwm->ePWMx->TBCTL.bit.SYNCOSEL = TB_SYNC_IN;slave_pwm->ePWMx->TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUTslave_pwm->ePWMx->TBCTL.bit.CLKDIV = TB_DIV1;slave_pwm->ePWMx->CMPCTL.bit.SHDWAMODE = CC_SHADOW;slave_pwm->ePWMx->CMPCTL.bit.SHDWBMODE = CC_SHADOW;slave_pwm->ePWMx->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;slave_pwm->ePWMx->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;slave_pwm->ePWMx->AQCTLA.bit.ZRO = AQ_SET;  //计数0时PWMA输出高slave_pwm->ePWMx->AQCTLA.bit.CAU = AQ_CLEAR;  //比CA高时PWMA输出低slave_pwm->ePWMx->AQCTLB.bit.PRD = AQ_CLEAR; //计数PRD时输出高slave_pwm->ePWMx->AQCTLB.bit.CBD = AQ_SET; //计数比CB低时PWMB输出低slave_pwm->ePWMx->CMPA.half.CMPA = slave_pwm->ePWMx->TBPRD *slave_pwm->D*2;       // Set compare A valueslave_pwm->ePWMx->CMPB = slave_pwm->ePWMx->TBPRD *(1-slave_pwm->D*2)+1;       // Set compare B value// Initialization Dead-Band(DB)slave_pwm->ePWMx->DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; //A\B均开启死区slave_pwm->ePWMx->DBCTL.bit.IN_MODE=DBA_RED_DBB_FED; //A上升沿,B下降沿源信号slave_pwm->ePWMx->DBCTL.bit.POLSEL=DB_ACTV_HIC;//PWMA、B互补相反slave_pwm->ePWMx->DBRED=slave_pwm->td;//死区设置slave_pwm->ePWMx->DBFED=slave_pwm->td;// Initialization Trip-Zone(TZ)slave_pwm->ePWMx->TZCTL.bit.TZA=2;    //PWM-A\B均输出低电平slave_pwm->ePWMx->TZCTL.bit.TZB=2;slave_pwm->ePWMx->TZCLR.bit.OST=1;    //清空OST标志位EDIS;
}

同样类似的,也有程序运行中调频、调宽、调相的设置程序如下:

void ePWM_Master1_Set(ePWM_Master_Set_Struct* master_pwm);//上升沿对齐移相 主要 D<=0.5
void ePWM_Slave1_Set(ePWM_Slave_Set_Struct* slave_pwm,ePWM_Master_Set_Struct* master_pwm);//上升沿对齐移相 次要 D<=0.5
void ePWM_Slave1_Set(ePWM_Slave_Set_Struct* slave_pwm,ePWM_Master_Set_Struct* master_pwm)
{if(slave_pwm->Phase>=0)slave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_UP;elseslave_pwm->ePWMx->TBCTL.bit.PHSDIR = TB_DOWN;slave_pwm->ePWMx->TBPRD=75e6/master_pwm->Fs;slave_pwm->ePWMx->TBPHS.half.TBPHS = fabs(slave_pwm->Phase)/180*slave_pwm->ePWMx->TBPRD;slave_pwm->ePWMx->CMPA.half.CMPA = slave_pwm->ePWMx->TBPRD *slave_pwm->D*2;       // Set compare A valueslave_pwm->ePWMx->CMPB = slave_pwm->ePWMx->TBPRD *(1-slave_pwm->D*2)+1;       // Set compare B value
}void ePWM_Master1_Set(ePWM_Master_Set_Struct* master_pwm)
{master_pwm->ePWMx->TBPRD=75e6/master_pwm->Fs;master_pwm->ePWMx->CMPA.half.CMPA = master_pwm->ePWMx->TBPRD *master_pwm->D*2;       // Set compare A valuemaster_pwm->ePWMx->CMPB = master_pwm->ePWMx->TBPRD *(1-master_pwm->D*2)+1;       // Set compare B value
}

这里给个demo,实现上面3个pwm的初始化程序如下:

void Init_ePWM()
{InitEPwm1Gpio();    //初始化 A0-EPWM1A  A1-EPWM1BInitEPwm2Gpio();    //初始化 A2-EPWM2A  A3-EPWM2BInitEPwm3Gpio();    //初始化 A4-EPWM3A  A5-EPWM3Bpwm1.ePWMx=&EPwm1Regs;pwm1.Fs=50e3; //50kHzpwm1.D=0.5; //50%占空比pwm1.td=50; //0.5us 死区ePWM_Master1_Set_Flush(&pwm1); //pwm1作为主pwmpwm2.ePWMx=&EPwm2Regs;pwm2.D=0.25; //25%占空比pwm2.Phase=0; //不移相pwm2.td=50; //注意这里死区要设置与主相一致,否则上升沿相位无法对齐ePWM_Slave1_Set_Flush(&pwm1,&pwm2); //pwm2以pwm1作为主pwmpwm3.ePWMx=&EPwm3Regs;pwm3.D=0.3; //30%占空比pwm3.Phase=-0.3*180; //滞后108° 范围-180°~+180°pwm3.td=50;ePWM_Slave1_Set_Flush(&pwm1,&pwm3); //pwm3以pwm1作为主pwmEALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers syncedEDIS;
}

这篇关于28335 ePWM模块 中心移相与边沿移相代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936708

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数