TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28069 时钟问题

大家好!

我遇到一个奇怪的问题,用Internal Oscillator 1 ,调用F2806x_SysCtrl.c中 IntOsc1Sel()函数,定时器0的100ms中断里面有个PID调节,最后PID能调节稳定,PID可以使用。但是我用示波器测定时器中断,发现有100多us的误差,即设置的是100ms定时器中断,用示波器实测的话是99.9ms。

我通过外部10M 的有源时钟源给DSP提供时钟,如下图,调用F2806x_SysCtrl.c中的   ExtOscSel();函数,最后发现PID不能稳定下来,震荡,用的是和内部时钟源一样的参数,我用示波器测定时器中断,也是我设置的100ms。

请各位专家分析一下,我就修改一句话,把   ExtOscSel();修改为IntOsc1Sel();系统最后又PID稳定下来,把IntOsc1Sel();修改为ExtOscSel();后PID调节的系统又震荡。我觉得可能是我设置的不对,或者是初始化不对,现在没有找到解决的办法

yanhui fu:

回复 10#:

10#您好!

1、我把系统时钟除以4通过GPIO18/XCLKOUT输出后,用内部晶振测得波形图如下图,波形图不是想象的方波,不知道对不?还有测得的方波频率23MHz

用外部时钟源输入到DSP 的GPIO19/XCLKIN 晶振测得波形图如下图,还有测得的方波频率22.5MHz

2、我调节变频器是在100ms定时器中断,每次进入中断,把一个引脚电平翻转,分别采样内部晶振如下图:

采样外部时钟源输入时钟,每次进入100ms中断翻转的电平如下:

可以看出,还是有差别的,但是差别不是很大。

3、硬件上布局如下

4、软件上设置

用DSP内部的晶振调用的函数

void IntOsc1Sel (void) { EALLOW; SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0; SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0; // Clk Src = INTOSC1 SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; // Turn off XCLKIN SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1; // Turn off XTALOSC SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1; // Turn off INTOSC2 EDIS;},调用这个函数,系统如上贴所述,最后PID能够达到稳定。

用外部时钟源输入时钟调用如下函数

void ExtOscSel (void) { EALLOW; SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn off XTALOSC(External Crystal Oscillator ) SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0; // Clock Watchdog off of INTOSC1 always SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2 SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0; // Leave INTOSC1 on EDIS;}最后系统中断里面的PID输出不能稳定,呈现正弦波形式的波动,波动周期有20多秒,

使用DSP内部晶振和外部的晶振唯一的区别就在于如下:

使用外部晶振程序:

// IntOsc1Sel();// IntOsc2Sel(); ExtOscSel();

使用内部晶振程序:

 IntOsc1Sel();// IntOsc2Sel();//ExtOscSel();

我使用的外部时钟源是10Mhz的。

现在问题依然存在,使用内部晶振和外部时钟源,最后的效果不一样。应该说外部有源时钟输入比内部晶振精度更高,但是为什么使用内部晶振可以稳定,使用外部有源时钟源就不稳定。

大家好!

我遇到一个奇怪的问题,用Internal Oscillator 1 ,调用F2806x_SysCtrl.c中 IntOsc1Sel()函数,定时器0的100ms中断里面有个PID调节,最后PID能调节稳定,PID可以使用。但是我用示波器测定时器中断,发现有100多us的误差,即设置的是100ms定时器中断,用示波器实测的话是99.9ms。

我通过外部10M 的有源时钟源给DSP提供时钟,如下图,调用F2806x_SysCtrl.c中的   ExtOscSel();函数,最后发现PID不能稳定下来,震荡,用的是和内部时钟源一样的参数,我用示波器测定时器中断,也是我设置的100ms。

请各位专家分析一下,我就修改一句话,把   ExtOscSel();修改为IntOsc1Sel();系统最后又PID稳定下来,把IntOsc1Sel();修改为ExtOscSel();后PID调节的系统又震荡。我觉得可能是我设置的不对,或者是初始化不对,现在没有找到解决的办法

10#:

回复 yanhui fu:

比较明显,是XCLKOUT不准确,如果你确定使用的倍频和分频是相同的,那问题应该在输入的外部时钟上。

建议你再量一下XCLKIN的频率,看看它是不是准确的10Mhz?

大家好!

我遇到一个奇怪的问题,用Internal Oscillator 1 ,调用F2806x_SysCtrl.c中 IntOsc1Sel()函数,定时器0的100ms中断里面有个PID调节,最后PID能调节稳定,PID可以使用。但是我用示波器测定时器中断,发现有100多us的误差,即设置的是100ms定时器中断,用示波器实测的话是99.9ms。

我通过外部10M 的有源时钟源给DSP提供时钟,如下图,调用F2806x_SysCtrl.c中的   ExtOscSel();函数,最后发现PID不能稳定下来,震荡,用的是和内部时钟源一样的参数,我用示波器测定时器中断,也是我设置的100ms。

请各位专家分析一下,我就修改一句话,把   ExtOscSel();修改为IntOsc1Sel();系统最后又PID稳定下来,把IntOsc1Sel();修改为ExtOscSel();后PID调节的系统又震荡。我觉得可能是我设置的不对,或者是初始化不对,现在没有找到解决的办法

yanhui fu:

回复 10#:

10#,您好

您是根据什么判断我外部时钟输入不准确那,从波形上看,我使用外部时钟时,XCLKOUT=22.5MHz,是准确的啊。我用示波器量了外部时钟输入端,是10MHz,有时候有点波动,但是和我PID输出不稳定的周期是不一致的。

我是通过调节ePWM的占空比调节变频器的转速,通过eCAP模块测转速,达到控制转速稳定目的。

昨天通过和TI的工程师郑义先生沟通,郑工提供一个思路,把PID关掉,给一个固定的输出,结果发现用外部时钟源输入到XCLKIN给一个固定的占空比,电机的速度也不稳定,来回波动(速度来回波动是使用频闪测速仪测得的)。而用内部时钟源电机速度则很稳定。

 

大家好!

我遇到一个奇怪的问题,用Internal Oscillator 1 ,调用F2806x_SysCtrl.c中 IntOsc1Sel()函数,定时器0的100ms中断里面有个PID调节,最后PID能调节稳定,PID可以使用。但是我用示波器测定时器中断,发现有100多us的误差,即设置的是100ms定时器中断,用示波器实测的话是99.9ms。

我通过外部10M 的有源时钟源给DSP提供时钟,如下图,调用F2806x_SysCtrl.c中的   ExtOscSel();函数,最后发现PID不能稳定下来,震荡,用的是和内部时钟源一样的参数,我用示波器测定时器中断,也是我设置的100ms。

请各位专家分析一下,我就修改一句话,把   ExtOscSel();修改为IntOsc1Sel();系统最后又PID稳定下来,把IntOsc1Sel();修改为ExtOscSel();后PID调节的系统又震荡。我觉得可能是我设置的不对,或者是初始化不对,现在没有找到解决的办法

yanhui fu:

回复 10#:

10#您好!

就这个标题来说,您的回答是详细的,谢谢。

今天下午找到问题所在了,我PWM的频率为1K,通过调节占空比来调节变频器速度。

问题的关键在于这个1K,我用外部有源时钟源输出10M的频率进入DSP的XCLKIN,经过PLL得到系统时钟为90M,通过ePWM模块输出的频率为1.0000K

而我使用内部晶振,内部的晶振频率和温度有关系,随着温度的升高而升高(我还没有做内部晶振频率的补偿),所以我按90M的系统时钟设置ePWM模块,输出的PWM频率为1.0043K,问题就差在这4.3Hz,我把通过调节EPwm3Regs.TBPRD这个寄存器,把输出PWM时钟凑到1.0000K时,出现了和使用外部时钟一样的问题,变频器调速不稳定了,即时我给定一个固定的占空比,变频器调速也不稳定了,来回波动。

我又尝试调节PWM的频率,只要避开1K这个频率,我使用内外时钟效果都是一样的。问题在于变频器在1K不稳定、有可能出现谐振。

大家好!

我遇到一个奇怪的问题,用Internal Oscillator 1 ,调用F2806x_SysCtrl.c中 IntOsc1Sel()函数,定时器0的100ms中断里面有个PID调节,最后PID能调节稳定,PID可以使用。但是我用示波器测定时器中断,发现有100多us的误差,即设置的是100ms定时器中断,用示波器实测的话是99.9ms。

我通过外部10M 的有源时钟源给DSP提供时钟,如下图,调用F2806x_SysCtrl.c中的   ExtOscSel();函数,最后发现PID不能稳定下来,震荡,用的是和内部时钟源一样的参数,我用示波器测定时器中断,也是我设置的100ms。

请各位专家分析一下,我就修改一句话,把   ExtOscSel();修改为IntOsc1Sel();系统最后又PID稳定下来,把IntOsc1Sel();修改为ExtOscSel();后PID调节的系统又震荡。我觉得可能是我设置的不对,或者是初始化不对,现在没有找到解决的办法

10#:

回复 yanhui fu:

ok,找到问题原因就好。

你也给我们提供了一个思路,当时钟有异常时,可以尝试别的频率测试。

关于内部晶振的补偿,你可以参考osc_comp例程。

大家好!

我遇到一个奇怪的问题,用Internal Oscillator 1 ,调用F2806x_SysCtrl.c中 IntOsc1Sel()函数,定时器0的100ms中断里面有个PID调节,最后PID能调节稳定,PID可以使用。但是我用示波器测定时器中断,发现有100多us的误差,即设置的是100ms定时器中断,用示波器实测的话是99.9ms。

我通过外部10M 的有源时钟源给DSP提供时钟,如下图,调用F2806x_SysCtrl.c中的   ExtOscSel();函数,最后发现PID不能稳定下来,震荡,用的是和内部时钟源一样的参数,我用示波器测定时器中断,也是我设置的100ms。

请各位专家分析一下,我就修改一句话,把   ExtOscSel();修改为IntOsc1Sel();系统最后又PID稳定下来,把IntOsc1Sel();修改为ExtOscSel();后PID调节的系统又震荡。我觉得可能是我设置的不对,或者是初始化不对,现在没有找到解决的办法

Jie Hu2:

回复 yanhui fu:

yanhui fu:

您好。我的28069系统在使用外部时钟时也碰到问题。主要是GPIO19脚接入时钟不行,只能从GPIO38脚接入。具体情况请看下帖。

http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/t/52185.aspx

看您的帖子,应该是用GPIO19脚做通了。请问:

我在ExtOscSel()中运行了SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN

外部时钟输入线默认为GPIO38,要切换到GPIO19除了上述的这行代码,还需要其他的软件或者硬件设置吗?

从现在的情况来看,好像是时钟切换没有生效,系统仍然在在使用GPIO38脚进来的时钟。

谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28069 时钟问题
分享到: 更多 (0)