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

关于28034产生PWM的问题。

       刚开始学DSP,用的是28034芯片,目前只想输出一个PWM波,占空比50%,频率10k。是在公司产品的板子上调试的,我的想法是只要系统初始化,然后再配置一下EPwm1模块,就能输出。后来发现公司板子用的外部石英晶振,于是修改系统初始化的时候晶振源选择的函数,即将IntOsc1Sel();改为XtalOscSel();然后修改了PLL倍频系数,因为外部晶振用的20M,28034最高60M,把DSP28_PLLCR改为6,然后2分频就是60M。但是发现还是没有输出,请问是哪里有问题呢?
       而且关于XtalOscSel()函数,系统默认的程序中有这两句SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0;SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;我的问题是都使用外部晶振了,为什么还会用到内部晶振1呢,DSP中难道可以同时有两个晶振源么?那是不是还存在优先级的问题?
       首先我不太确定系统有没有跑起来?如果是这个问题,请问应该如何确定系统跑起来了?
       还有公司板子上还集成了其他电路(板子上还有一块28069,还有一块stm32的芯片),有没有可能是这块板子是一个整体,即使我上面的配置正确,也会有可能输出不了波形?如果是这个问题,那又应该怎么解决呢?
        我的程序如下(删去注释了):
#include "DSP28x_Project.h"
void InitEPwm1Example(void)
void main(void)
{
  InitSysCtrl();
  DINT;
  InitPieCtrl();
  IER = 0x0000;
  IFR = 0x0000;
  InitPieVectTable();
  InitEPwm1Gpio();
  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
  EDIS;
  InitEPwm1Example();
  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
  EDIS;
  for(;;)
  {
    __asm("          NOP");
  }
}
void InitEPwm1Gpio(void)
{
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Disable pull-up on GPIO0 (EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Disable pull-up on GPIO1 (EPWM1B)
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B
    EDIS;
}
void XtalOscSel (void)  {
     EALLOW;
     SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;    
     DELAY_US(1000L);                           
     SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1;      // Turn off 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 = 1;    // Clock Watchdog off of INTOSC1
     SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1;     // Turn off INTOSC2
     SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1;    // Leave INTOSC1 on
     EDIS;
}

Green Deng:你好,没有看到你传上来的程序中有SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0这个语句,但是程序中SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1;就表示看门狗使用外部时钟源。
可以在官方的GPIO翻转例程上修改,通过观察GPIO口的电平变化来判断是否运行。例程位置:
C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\gpio_toggle

       刚开始学DSP,用的是28034芯片,目前只想输出一个PWM波,占空比50%,频率10k。是在公司产品的板子上调试的,我的想法是只要系统初始化,然后再配置一下EPwm1模块,就能输出。后来发现公司板子用的外部石英晶振,于是修改系统初始化的时候晶振源选择的函数,即将IntOsc1Sel();改为XtalOscSel();然后修改了PLL倍频系数,因为外部晶振用的20M,28034最高60M,把DSP28_PLLCR改为6,然后2分频就是60M。但是发现还是没有输出,请问是哪里有问题呢?
       而且关于XtalOscSel()函数,系统默认的程序中有这两句SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0;SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;我的问题是都使用外部晶振了,为什么还会用到内部晶振1呢,DSP中难道可以同时有两个晶振源么?那是不是还存在优先级的问题?
       首先我不太确定系统有没有跑起来?如果是这个问题,请问应该如何确定系统跑起来了?
       还有公司板子上还集成了其他电路(板子上还有一块28069,还有一块stm32的芯片),有没有可能是这块板子是一个整体,即使我上面的配置正确,也会有可能输出不了波形?如果是这个问题,那又应该怎么解决呢?
        我的程序如下(删去注释了):
#include "DSP28x_Project.h"
void InitEPwm1Example(void)
void main(void)
{
  InitSysCtrl();
  DINT;
  InitPieCtrl();
  IER = 0x0000;
  IFR = 0x0000;
  InitPieVectTable();
  InitEPwm1Gpio();
  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
  EDIS;
  InitEPwm1Example();
  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
  EDIS;
  for(;;)
  {
    __asm("          NOP");
  }
}
void InitEPwm1Gpio(void)
{
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Disable pull-up on GPIO0 (EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Disable pull-up on GPIO1 (EPWM1B)
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B
    EDIS;
}
void XtalOscSel (void)  {
     EALLOW;
     SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;    
     DELAY_US(1000L);                           
     SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1;      // Turn off 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 = 1;    // Clock Watchdog off of INTOSC1
     SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1;     // Turn off INTOSC2
     SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1;    // Leave INTOSC1 on
     EDIS;
}

Serenity_pjb:

回复 Green Deng:

我传上来的是我修改过的,系统默认的XtalOscSel (void)这个函数中就是SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0; SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;那么按照你说的意思就是这里就是看门狗使用内部晶振1产生的时钟,而其他部分用的是外部晶振产生的时钟,对么?我在原提问中有提到过,DSP系统是可以同时使用外部时钟和内部时钟的么?请解答一下这个问题,谢谢。

还有我的问题已经解决了,是我原提问的一个猜想,因为这个板子是公司做好的系统板子,pwm输出是经过锁存器的,要在程序中加入使能锁存器的语句,才可以在锁存器输出端看到pwm波,其实昨天要是在锁存器输入侧看波形应该是能看到波形的。

谢谢您的解答。祝好!

       刚开始学DSP,用的是28034芯片,目前只想输出一个PWM波,占空比50%,频率10k。是在公司产品的板子上调试的,我的想法是只要系统初始化,然后再配置一下EPwm1模块,就能输出。后来发现公司板子用的外部石英晶振,于是修改系统初始化的时候晶振源选择的函数,即将IntOsc1Sel();改为XtalOscSel();然后修改了PLL倍频系数,因为外部晶振用的20M,28034最高60M,把DSP28_PLLCR改为6,然后2分频就是60M。但是发现还是没有输出,请问是哪里有问题呢?
       而且关于XtalOscSel()函数,系统默认的程序中有这两句SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0;SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;我的问题是都使用外部晶振了,为什么还会用到内部晶振1呢,DSP中难道可以同时有两个晶振源么?那是不是还存在优先级的问题?
       首先我不太确定系统有没有跑起来?如果是这个问题,请问应该如何确定系统跑起来了?
       还有公司板子上还集成了其他电路(板子上还有一块28069,还有一块stm32的芯片),有没有可能是这块板子是一个整体,即使我上面的配置正确,也会有可能输出不了波形?如果是这个问题,那又应该怎么解决呢?
        我的程序如下(删去注释了):
#include "DSP28x_Project.h"
void InitEPwm1Example(void)
void main(void)
{
  InitSysCtrl();
  DINT;
  InitPieCtrl();
  IER = 0x0000;
  IFR = 0x0000;
  InitPieVectTable();
  InitEPwm1Gpio();
  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
  EDIS;
  InitEPwm1Example();
  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
  EDIS;
  for(;;)
  {
    __asm("          NOP");
  }
}
void InitEPwm1Gpio(void)
{
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Disable pull-up on GPIO0 (EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Disable pull-up on GPIO1 (EPWM1B)
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B
    EDIS;
}
void XtalOscSel (void)  {
     EALLOW;
     SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;    
     DELAY_US(1000L);                           
     SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1;      // Turn off 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 = 1;    // Clock Watchdog off of INTOSC1
     SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1;     // Turn off INTOSC2
     SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1;    // Leave INTOSC1 on
     EDIS;
}

Serenity_pjb:

回复 Green Deng:

谢谢解答。

赞(0)
未经允许不得转载:TI中文支持网 » 关于28034产生PWM的问题。
分享到: 更多 (0)