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.

[参考译文] TMS320F28027:ADC 随机停止工作

Guru**** 2535750 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601595/tms320f28027-adc-randomly-stops-working

器件型号:TMS320F28027
Thread 中讨论的其他器件:controlSUITE

您好!  

我已经像 controlSUITE 中给出的示例那样设置了 ADC。  

我将在一天的大部分时间获得完美的 ADC 计数、但随机地、ADC 将停止工作、不会返回任何结果。  

我不明白为什么会发生这种情况? 是否有一些缓冲器需要清除、以免过载或其他缓冲器?

这非常奇怪和令人沮丧。  

ADC 示例工作正常、这几乎正是我在代码中实现的。  

请帮助。  

此致、

Rajan Joshi

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

    控制器是否冻结? 您是否可以检查此项?

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

    Gautam、您好!

    控制器仍然正常工作。 我可以通过运行代码来运行电机。 它只是代码中的 Voltage2[10]变量、我所监控的变量没有向我显示任何值。

    这是我的 ADC 初始化函数:

    
    
    
    
    
    
    
    
    void ADC_init (void){//* ADC 设置*//初始化此应用所需的所有句柄 myAdc = ADC_init ((void *) ADC_base_ADDR、sizeof (ADC_Obj));myClk = CLK_init (void *) CLK_base_ADDR、sizeof (CLK_Obj)(nid);myeUpie (void)= npie (npie (nid)、sizeUpie (npie)(nv_gpie (npie)、sizecpu_gpie (nid)= nv_ecpu (npie ()、sizecpu_ecpi)(nid)、sizej)(nv_ecpu_ecpie (nvecpie (nid)、sizecpu_gpie (vecpu ()(vecpu_ecpu ()、
    myPll = PLL_init (((void *) PLL_base_ADDR、sizeof (PLL_Obj));
    myPwm = PWM_init ((void *) PWM_ePWM1_base_ADDR、Osceof (PWM_sizej));
    myWdock_isp = WDOG_Flags ((*);禁用
    
    
    
    
    
    
    myCCP_clpie
    
    
    (enable_clpie);禁用 myCCP_clpie (n_clb_clpie);禁用 myCn_clock_enable_clock_clock_enable_enable_enable_clock_enable_enable_clock_enable_ench_clock_enable_encheId_clock_enic (inb);禁用 myCnecnecu_enable_enable_clpie (necu_enu_enu_enu_enu_clu_enu_clu_clu_clu_clu_clu_clu_clu_clu_clu_clu
    
    
    
    
    
    //设置调试矢量表并启用 PIE PI_ENABLE
    (myPie);
    
    
    //初始化 ADC
    ADC_enableBandGap (myAdc);
    ADC_enableRefBuffers (myAdc);
    ADC_POWERUP (myAdc);
    ADC_ENABLE (myAdc);
    ADC_setVoltRefSrc (myAdc、 ADC_VoltageRefSrc_Int);
    
    //在 PIE
    PI_enableAdcInt (myPie、ADC_IntNumber_1)中启用 ADCINT1;
    //启用 CPU 中断1
    CPU_enableInt (myCpu、CPU_IntNumber_10);
    //启用全局中断 INTM
    CPU_enableGlobalInts (myCpu
    
    
    
    )
    ;启用 ADC_IntegtrueInt (myC0 =启用 ADCnecnuleInt
    
    、InsteInt;// Int = myCnecnuleInt;//启用全局中断1、ADCnecnecnecnec1;启用 ADC0 = myCnecnuleInt; ADC_IntSrc_EoC2);
    //启用 PWM 时钟
    CLK_enablePwmClock (myClk、PWM_NUMBER_1);
    
    //设置 PWM
    PWM_enableSockpulse (myPwm); //在组
    PWM_setSockAPulseSrc (myPwm、PWM_SockSrc_CounterEqualCmpAcincr)上启用 SOC;//从向上计数 PWM_setSockAPeriod (
    myPwm、PWM_SockPeriod_FirstEvent)上的 CPMA 中选择 SOC; //在第1个事件
    PWM_setCmpA (myPwm、0x0080)上生成脉冲; //设置比较值
    PWM_setPeriod (myPwm、0xFFFF); //设置 ePWM1
    PWM_setCounterMode 的周期(myPwm、PWM_CounterMode_Up); //向上计数并启动
    CLK_enableTbClockSync (myClk);
    
    
    EALLOW;
    myGpio->AIOMUX1 = 0<<13;//启用 AIO6
    myGpio->AIODIR = 1<<6;//将 AIO6设置为输出
    //(((GPIO_Obj *) myGpio)->AIODAT = 1<<6;//将 AIO6设置为输出
    myGpio->AIOCLEAR=1<<6;//将 AIO6设置为输出
    EDIS;
    
    /*
    结束 ADC 设置
    */
    } 

    我所做的是设置一个计时器、每隔5秒获取一次 ADC 值、如果设置为特定计数、它将运行电机。  

    我认为我可能没有对 ADC 进行完美的设置、但这很奇怪、因为它有时工作、有时在代码中不工作、尽管我使用的设置与示例代码中的设置相同。  

    我已附加 hal.c 文件。

    我的初始化中是否有我可能出错的东西?

    此致、

    Rajan Joshi

    e2e.ti.com/.../4101.hal.c

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

    当 ADC 停止工作时、您能否检查 ADCINTOVF 和 ADCSOCOVF1寄存器? 如果您的系统错过了中断服务的最后期限、则可能会发生这种情况。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Tommy、
    我检查了寄存器,输出是:
    ADCINTOVF = 0x0003且 ADCSOCOVF1= 0x0000

    那么、我认为错过了 ADCINT1吗?

    如何重置?

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

    您需要使用 ADCINTOVFCLR 寄存器将其清除。 在 ADCINTOVF 状态被清除前、ADC 不会生成进一步的中断。

    一个选项是将 ADCINT 配置为在连续模式下运行--即使不及时处理中断,也应继续触发中断。

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

    我确实试图清除它,但它似乎不起作用。 也尝试了连续模式、但它也不起作用。

    我感觉我没有正确地调用命令,我所做的是:

    EALLOW;
    myAdc->ADCINTOVFCLR = 0x0003;
    EDIS;

    它仍然无法清除中断。 我是否正确地这样做了、我知道这可能是一个简单明了的问题。 很抱歉耽误你的时间。

    此致、

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

    如果您通过 CCS 在断点处手动清除 ADCINTOVF 标志、您是否能够清除该标志?

    在程序中尝试清除 ADCINOVF 可能很困难、因为您已经错过了 ADCINT 服务的最后期限、因此您可能无法继续清除 OVF 标志。

    Tommy