This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS:LAUNCHXL-F28069M 中频率为1kHz 的 PWM 问题范围分析

Guru**** 2543190 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/626050/ccs-problem-scoping-pwm-with-frequency-1khz-from-launchxl-f28069m

工具/软件:Code Composer Studio

尊敬的 Sirs:

我使用的主要内容如下:

///--------------------------------------------
//文件:AsymmetricPWM-Main.c
// (向上、具有独立调制功能的单边沿非对称波形
// 在 EPWM2A 和 EPWM2B 上)
////
说明:此程序设置 EV TIMER2以生成互补
// PWM 波形。 然后、用户可以使用
来自//的示波器观察波形 ePWM2A 和 ePWM2B 引脚。
// -为了改变 PWM 频率,用户应该改变
// "期间"的值。
// -可通过改变比较
//来独立调整占空比 ePWM2A 和 ePWM2B 的值(Duty_cycle_A 和 Duty_cycle_B)。
// -有关更多详细信息、请搜索 SPRU791.PDF
// (TMS320x28xx、28xxx 增强型脉宽调制器模块),网址为 TI.com
//
////目标:TMS320F2806x 或 TMS320F2803x 系列(F28069)
//-----------

//$TI 发行版:$V1.0
//$发行 日期:$2010年1月11日- VSC
//../../-----------
//
//请阅读-有关此项目的有用注释

//尽管此项目由多个文件组成,但最重要的文件是:
//“AsymmetricPWM .c”,此文件
// -应用程序初始化、外设配置
// -应用程序管理
// -较慢的后台代码循环和任务调度
//"AsymmetricPWM-DevInit_F28xxx.c"
// -器件初始化、例如时钟、PLL、WD、GPIO 映射
// -外设时钟启用
//其他文件通常用于支持并将寄存器定义为 C
//结构。 一般而言、这些文件不需要更改。
//"F2806x_RAM_AsymmetricPWM.CMD"或"F2806x_flash_AsymmetricPWM.CMD"
// -将程序和数据空间分配到器件的存储器映射中。
//"F2806x_Headers_nonBIOS.cmd"和"F2806x_GlobalVariableDefs.c"
// -将寄存器结构分配到数据存储器中。 这些寄存器结构是
// 在外设标头中定义包括(F2806x_ADC.h、...)
///////---------------


#include "PeripheralHeaderIninclude.h"
#include "F2806X_ePWM_define.h" //用于初始化的有用定义
//#include "PWM_1ch_Cnf.c"

///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//函数原型
///%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void DeviceInit(void);
void InitFlash(void);
void Memcopy(UINT16 * SourceAddr、UINT16* SourceEndAddr、UINT16* DestAddr);

void PWM_1ch_CNF (int16 n、uint16周期、int16模式、int16阶段);


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//可变声明-常规
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


volatile struct ePWM_regs * ePWM[]=
{EPwm1Regs、 //有意:(ePWM[0]未使用)
EPwm1Regs (EPwm1Regs)、
EPwm2Regs (EPwm2Regs)、
EPwm3Regs (EPwm3Regs)、
EPwm4Regs (EPwm4Regs)、
EPwm5Regs (EPwm5Regs)、
EPwm6Regs (EPwm6Regs)、
EPwm7Regs (EPwm7Regs)、
};


//用于在闪存中运行后台,以及 RAM
外部 UINT16中运行 ISR RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart;


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%。%%
//主代码-从此处开始
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void main (void)
{

//=================================================
//初始化-常规
//=================================================

DeviceInit();//器件寿命支持和 GPIO 多路复用器设置

//仅在从闪存运行时使用
//请注意变量闪存由编译器定义(-d FLASH )

//-----------

for (;;)
{
if (GpioDataRegs.GPADAT.bit.GPIO19 = 0)
{
PWM_1ch_CNF (1、3600、1、0);
PWM_1ch_CNF (2、3600、0、1705);
}
}

PWM_1ch_CNF.c 代码如下:  

///--------------------------------------
//文件:PWM_1ch_config.c
//
说明:单通道(A 输出) PWM 配置函
数//将 PWM 通道配置为递增计数模式。
//
//目标:TMS320F2803x,
//
函数调用为:
//
PWMDRV_1ch_config (int16 n,int16周期,int16模式,int16相位)
//
//定义为:
//-----
// n =目标 ePWM 模块、1、2、... 16。 例如,如果 n=2,那么目标是 ePWM2
//周期= Sysclks 中的 PWM 周期
//模式=主控/受控模式,例如,主控模式= 1,受控
模式= 0,受控器/相位=来自 Sysclks 中上游主控的相位偏移,
//仅在 MODE = 0时适用,即从/
。---
#include "PeripheralHeaderIninclude.h"
#include "F2806X_ePWM_define.h"

extern volatile struct ePWM_regs * ePWM[];
UINT16 Duty_cycle_A=500;//设置占空
比 UINT16 Duty_cycle_B=500;//设置占空比初始

为 void PWM_1ch_CNF (int16、int16、int16、int16、int16、int16、int16)

//时基子模块寄存
器(* ePWM[n])。TBCTL.bit.PRDLD = TB_IMMEAL;//设置立即负载
(* ePWM[n])。TBPRD =周期- 1;// PWM 频率= 1 /周期
(* ePWM[n])。TBPHS.half.TBPHS = 0;
(* ePWM[n]或配置 TBCTR 时基周期(* ePWM[n])。
(* ePWM[n]).TBCTL.bit.CTRMODE = TB_COUNT_UP;//设置时基计数器的模式:
(* ePWM[n]).TBCTL.bit.HSPCLKDIV = TB_DIV1;// TBCLK = SYSCLK
(* CLEPW[n]= TBDIV.TBIV.TBIV.1* //设置时钟速率

(如果(MODE = 1){//配置为主(
* ePWM[n]).TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载,主模块
(* ePWM[n])。TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步“下行数据流

”(如果= 0) PHASE+2值用于补偿逻辑延迟)
(* ePWM[n]).TBCTL.bit.PHSEN = TB_ENABLE;//从机模块
(* ePWM[n]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步直通

IF ((0 <= PHASE)&&(PHASE <=
2)(* ePWM[n));半相位(TBPHS=TBPHS[2) //将相位寄存器设置为“(2 -相位)”
,否则,如果(相位> 2)
(* ePWM[n]).TBPHS.Half.TBPHS =(周期-相位+ 2);//将相位寄存器设置为“(周期-相位+ 2)”
}

//计数器比较子模块寄存器
(* ePWM[n]).CMPA.PHA.n
=(*半个占空比);//初始占空比 CMPB_B =(* CMPwm_b_cuty = n) //初始设置占空
比(* ePWM[n]).cmPCTL.bit.SHDWAMODE = CC_SHADODE;//影子模式。 用作双缓冲器。
(eEPWM[n]).CMPCTL.bit.LOADAMODE = CC_CTR_PRD;//在 CTR=PRD 上加载

//动作限定符子模块寄存
器(* ePWM[n]).AQCTLB.bit.ZRO = AQWRAT_TOGGLE;// EEPWM1A 的切换操作(
* ePWM[n](* ePWM[n]).AMBQLA.NO.ACT_ACT.AMB.NO.ACT.N)= EQNO.ACT.AMB.ACT.OB_ACT.AM_ACT.AM_ACT.AMR = OB_ACT.OB_ACT.AM_ACT.N (



*无针对 EPWRAT.OB_ACT.AM_OB_OB_OB_OBJT.OB_OB_OB_OBJ.NO.NO.NO.NO.OBJT.OB_OB_OBJT.OB_OBJT.OB_OBJT.OB_OBJT.OB_OBJT.OB_OBJOR

我需要2个频率为1kHz 的 PWM 信号。 但当周期为  3600时、我的最小 ePWM 频率为22kHz => PWM_1ch_CNF (1、3600、1、0);

我已经阅读了 pdf 文档、我知道我需要"TBCTL.bit.HSPCLKDIV = 0x4;"和"TBCTL.bit.CLKDIV = 0x4;"类型的代码、但当我添加这些代码时、信号消失了。  

出什么问题了? 这是关于占空比吗? 或周期值? 因为我知道周期是一个16位的值、最大值应为65535

感谢您的关注。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Troodon、

    当您为 PWM_1ch_CNF 函数提供3600周期时、您应该会看到25kHz (90m/3600)周期。  您说您看到的是22kHz。  首先、我要验证这一点。

    ===

    您对 ePWM 时钟进行分频的计划在很大程度上是合理的。  

    您似乎每次都要通过 for (;)循环重新配置 ePWM。  您应该只需要配置这些 ePWM 寄存器一次。  反复配置这些寄存器可能是您发现的问题的一部分。

    我还建议将 TBCLKSYNC 设置为0、运行所有 ePWM 配置函数、然后最后将 TBCLKSYNC 设置为1。  这是数据表中建议的方法。


    谢谢、
    Brett