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.
工具/软件:Code Composer Studio
大家好。 我的 F28069 Piccolo 以90MHz 的频率工作。 我将生成50kHz PWM 信号、但示波器将其标记为50.2kHz。 有人知道为什么会出现这个问题? 我听说分辨率更好地对时钟进行预分频 (例如@1MHz) 、但我不知道如何也不知道如何进行预分频。
感谢您的帮助、谢谢
我的 PWM 代码是
空 InitEPwm2 (空);
void InitEPwm2Gpio (void);
需要以 kHz 为单位的//f
float f=50;
浮点周期=45000/50;
浮子 TOFF;
float h=0.5;//占空比
主程序
{
在 SIS 之后,PIECTRL 和所有这些…
InitEPwm2Gpio();
InitEPwm2();
}
空 InitEPwm2Gpio (空)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO2上的上拉电阻(EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//禁用 GPIO3上的上拉电阻(EPWM2B)
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;//将 GPIO3配置为 EPWM2B
EDIS;
}
空 InitEPwm2()
{
EALLOW;
//Formula 45MHz/50kHz=900周期、TBCLK 计数
EPwm2Regs.TBPRD =周期;//周期= 1201 TBCLK 计数
EPwm2Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零
EPwm2Regs.TBCTR = 0;//清除 TB 计数器
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//相位加载被禁用
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
TOFF=PERIOD*(1-h);
EPwm2Regs.CMPA.half.CMPA = Toff;//调整输出 EPWM2的占空比
EDIS;
}
我使用的是"F2806x_examples.h"文件
//###################################################################################################################### // //文件:F2806x_Examples.h // //标题:F2806x 器件定义。 // //########################################################################################################################## //$TI 发布:F2806x C/C++头文件和外设示例 V151 $ //$发布 日期:2016年2月2日$ //$版权:版权所有(C) 2011-2016德州仪器(TI)公司- // http://www.ti.com/ 保留所有权利$ //############################################################################################################ #ifndef F2806x_examples_H #define F2806x_examples_H #ifdef __cplusplus extern "C"{ #endif /*--------------- 指定 PLL 控制寄存器(PLLCR)和分频选择(DIVSEL)值。 -------------------------------------------------- // //#define DSP28_DIVSEL 0 //为 SYSCLKOUT 启用/4 //#define DSP28_DIVSEL 1 //为 SYSCKOUT 禁用/4 #define DSP28_DIVSEL 2 //为 SYSCLKOUT 启用/2 //#define DSP28_DIVSEL 3 //为 SYSCLKOUT 启用/2 //为 SYSCLKOUT = 90MHz 注释1 //为 SYSCLKOUT =/90 MHz (10MHz * 18)/2] //#define DSP28_PLLCR 17 //#define DSP28_PLLCR 16 //#define DSP28_PLLCR 15 //#define DSP28_PLLCR 14 //#define DSP28_PLLCR 13 //#define DSP28_PLLCR#define DSP28_PLLCR#10/ define DSP28_PLCR#define DSP28/ define DSPCR#SPCR#define DSP28_PLLCR#define 8 / define DSPCR#PLLCR#define DSPCR#SP28_PLLCR#define 8 / define DSPCR#SPCR#SPCR#define DSPCR#PLLCR#SPCR#SPCR#PL28/ define DSPCR#PLCR#PLCR#10/ define DSPCR#define DSPCR#SPCR#SPCR#PLLCR#SPCR#10/ define 2 //#define DSP28_PLLCR 1 //#define DSP28_PLLCR 0 //在此模式中绕过 PLL ------------------------------------------------------- /*------------------ 指定以 NS 为单位的 CPU (SYSCLKOUT)的时钟速率。 考虑输入时钟频率和 PLL 乘法器 在步骤1中选择。 使用提供的值之一、或定义您自己的值。 需要尾部的 L 告诉编译器处理 数字作为64位值。 只应取消注释一条语句。 示例:90MHz 器件: CLKIN 是一个10MHz 晶体或内部10MHz 振荡器 在第1步中、用户为 A 指定了 PLLCR = 0x18 90MHz CPU 时钟(SYSCLKOUT=90MHz)。 在本例中、CPU_RATE 将为11.111L 取消注释行:#define CPU_RATE 11.111L -------------------------------------- *
我尝试更改此行、但结果相同
#define CPU_RATE 1000L //针对1MHz CPU 时钟速度(SYSCLKOUT) //#define CPU_RATE 11.111L //针对90MHz CPU 时钟速度(SYSCLKOUT) //#define CPU_RATE 12.500L //针对80MHz CPU 时钟速度(SYSCLKOUT) /#define CPU_RATE 16.60MHz /针对 SYSCLKOUT / SYSCLRATE (SYSCLKOUT)/#define CPU 时钟速度(16.60MHz) 50MHz CPU 时钟速度(SYSCLKOUT) //#define CPU_RATE 25.000L //针对40MHz CPU 时钟速度(SYSCLKOUT) //#define CPU_RATE 33.333L //针对30MHz CPU 时钟速度(SYSCLKOUT) //#define CPU_RATE 41.667L //针对24MHz CPU 时钟速度(SYSCLKOUT)/定义 SYSCLKOUT / 50.000MHz CPU 时钟速度(SYSCLKOUT) // CPU_RATE 66.667L //对于15MHz 的 CPU 时钟速度(SYSCLKOUT) //#define CPU_RATE 100.000L //对于10MHz 的 CPU 时钟速度(SYSCLKOUT) //----------- /*------------------ PLL2定义了:PLL2输出是 USB0和 HRCAP1-4时钟 --------------------- // 指定 PLL2的输入时钟源 //#define PLL2_PLLSRC0x0// PLL2输入 OSC1 //#define PLL2_PLLSRC0x1// PLL2输入 OSC1 #define PLL2_PLLSRC0x2// PLL2输入 X1 //#define PLL2_PLLLSRC0x3// PLL2输入 OSC2 (分频)/指定控制值。 #define PLL2_SYSCLK2DIV2DIS0// PLL2输出/2 //#define PLL2_SYSCLK2DIV2DIS1// PLL2输出/1 //#define PLL2_PLLLMULT15 //#define PLL2_PLLLMULT14 //#define PLL2_PLLPLL12_PLLPLLULT13 /define LPLLPLL2/PLLPLL12_PLLPLLPLL12/ PLLPLL12_PLLPLLPLLPLLULT6 / define LPLLPLLPLLPLL12_PLLPLLPLLPLLPLL12/ PLLPLLPLLPLL12_PLLPLLPLLULT 6 / define LPLLPLLPLLPLLPLLPLLPLLPLLPLLPLLPLL12/ PLLPLLPLL12_PLLPLLPLLPLLPLLPL PLL2_PLLMULT5 //#define PLL2_PLLMULT4 //#define PLL2_PLLMULT3 //#define PLL2_PLLMULT2 //#define PLL2_PLLMULT1 //#define PLL2_PLLLMULT0// PLL 在该模式下被绕过 //--- //函数调用的以下指针会校准 ADC 和内部振荡 器#define Device_cal(void (*)(void ))0x3D7C80 //--------------- //包含示例头文件: // #include "F2806x_GlobalPrototypes.h" //.c 文件内全局函数的原型。 #include "F2806X_ePWM_defines.h" //用于 PWM 示例的宏。 #include "F2806X_I2C_defins.h" //用于 I2C 示例的宏。 #include "F2806X_DMA_defins.h" //用于 DMA 示例的宏。 #include "F2806x_CLA_defination.h" //用于 CLA 示例的宏。 #define PARTNO_F28062PNT0x64 #definePARTNO_F28062UPNT0x65 #define PARTNO_F28062PZT0x66 #definePARTNO_F28062UPZT 0x67 #define PARTNO_F28063PNT0x68 #define PARTNO_F28063PZT0x69 #define PARTNO_F2806462PADT_F2806UPT0xLD_define 0xLD0x6ARTON_F28064P2806UPTT #define 0x6f #define PARTNO_F28065PNT0x7C #definePARTNO_F28065UPNT0x7D #define PARTNO_F28065PZT0x7E #definePARTNO_F28065PZTZT 0x7F #define PARTNO_F28065PONO 0x80 #define PARTNO_F28065PZT 0x7E #define PARTNO_F28065PADT 0x280688#define 0x486PARTPO_define 0x486PADT_FARTPO#define 0xP0xP2808_F2808_define 0x486PADTRP0xP0xPAD_define 0xP0xP0xP0xPADTRP808_define 0x488#define 0xPADTRPADTRP0xP0xPAD_F2808#define 0x486P#define 0xPADTRPAD_F2808_PARTPA28P0xPADTRPAD_PART808#define 0x808#define 0x486P#define 0xPAD_F PartNo_F28068PNT0x8C #definePARTNO_F28068UPNT0x8D #define PARTNO_F28068PZT0x8E #definePARTNO_F28068UPZT0x8F #define PARTNO_F28069PNT0x9C #define PARTNO_F28069PZT0x9D #define PARTNO_F28068UPZT 0x8F 0x8F 0x8F #define PARTNO_F28069P28069PADC#define 0xADC#define 0x9DIFF_F28069PADC#define 0xADC#define 0x9DSPINDIFF/#define 0xZTINDIFF_F28069P28069PADC#define 0xZTIDS/ #define DELAY_US (a) DSP28x_usDelay (((( long double) a * 1000.0L)/(long double) cpu_rate)- 9.0L)/ 5.0L) #ifdef __cplusplus } #endif /* extern "C"*
Daniel:
您可以获得的最高分辨率是当您以90MHz 为 TBCLK 计时时。 这将为您提供~11nS 的步长、因此我希望您能够消除这种不准确性。
现在、就 PWM 频率的绝对精度而言... 必须了解的是、您的 PWM 输出将仅与时钟输入一样准确。 如果您的时钟源实际上是30.1MHz、而不是30.0MHZ、那么这将反映在您的 PWM 输出中。
使用内部振荡器时、可能比使用晶体或外部振荡器更不精确。 内部振荡器的规格可在数据表中找到。
如果您计划使用内部振荡 器、您应该查看 www.ti.com/.../SPRAB84、它将告诉您如何从内部振荡器获得最佳精度。
希望这对您有所帮助、如果您仍有疑问、请告诉我。
此致、
Cody
Daniel:
如果我仔细阅读上面的代码、可能会出错。 但幸运的是、您可以通过配置 XCLKOUT 直接观察 SYSCLK 频率!!!
TRM第1.4.2.11节"XCLKOUT 生成"对此进行了详细介绍。
此致、
Cody