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.

[参考译文] TMS320F2.8027万F:TMS320F2.8027万F

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/658806/tms320f28027f-tms320f28027f

部件号:TMS320F2.8027万F
主题:controlSUITE中讨论的其他部件

<link>
         <name>cap.c</name>
         <type>1</type>
         <locationURI>MW_INSTALL_DIR/SW/DRIVERS/TIMER/src/32b/F28x/F2802x/CAP.c</locationURI>
      链接>








1. HAL.C:
~986线
 //备注:BK MODDED此项:
 //未使用(PWM_In)
 //GPIO设置模式(obj->gpioHandle,gPIO_NUMBER_5,gPIO_5_Mode_generalpurpe);
 GPIO_setMode(obj->gpioHandle,gPIO_NUMBER_5,gPIO_5_Mode_ECAP1);
 
  2. HAL_OBJ.H
第43行#include "SW/DRIVERS/ADC/SRC/32b/F28x/F2802x/CA.h"

第135行:
typedef结构_HAL_Obj_

 adc_handle   adcHandle;       //!< ADC手柄
  
 cap_handle   capHandle;         //!< ECAP手柄-- bk已添加

 clk_handle   clkHandle;       //!<时钟手柄
 
  3. HAL.c

 第608行
 //bk已添加:
 obj->capHandle = cap_init((void *)CAP1_base_ADDR,sizeof(Cap_Obj));


 //设置ISR。

 添加到hal .h:

 行1304:
 //! \brief设置ECAP
//! \param[in]处理        硬件抽象层(HAL)句柄
void HAL_setupeCAP (HAL_HANDLE句柄);

HAL.c:
1350行:

//BK添加如下:
// ECAP
void HAL_setupeCAP (HAL_HANDLE句柄)

   HAL_Obj *OBJ =(HAL_Obj *)句柄;

   CAP_setModeCap(obj->capHandle);//将模式设置为CAP

   //禁用计数器同步
   cap_disableSyncIn(obj->capHandle);

   //设置捕获事件极性
   CAP_setCapEvtPolarity(obj->capHandle, CAP_Event_1,CAP_POLICATICAL_Rising);

   //设置捕获事件极性
   CAP_setCapEvtPolarity(obj->capHandle, CAP_Event_2,CAP_POLICATICAL_Falling);

   //设置捕获事件计数器重置配置
   CAP_setCapEvtReset(obj->capHandle, CAP_Event_1,CAP_Reset_Disable);

   //设置捕获事件计数器重置配置(在此处重置计数)
   CAP_setCapEvtReset(obj->capHandle, CAP_Event_2,CAP_Reset_Enable);

   //连续计时器
   cap_setCapContinued(obj->capHandle);

   //将停止/环绕模式设置为2个事件
   CAP_setStopWrap (obj->capHandle,CAP_Stop_Wrap _CEVT2);

   //在捕获事件上启用CAP1-4加载
   cap_enableCaptureLoad(obj->capHandle);

   //启用时间戳计数器以运行
   cap_enableTimestampCounter(obj->capHandle);

   //启用捕获(CAP)中断源
   cap_enableInt(obj->capHandle, CAP_Int_Type_CEVT2);

   //启用eCAP中断
   PIE_enableInt (obj->p压 处理,PIE_GroupNumber_4,PIE_InterruptSource_ECAP1);

   //启用CPU ECAP组中断
   CPU_enableInt(obj->cpuHandle, CPU_IntNumber_4);

   返回;
}// HAL_setupCAP()函数结束


线路1082:
 clk_enableEscap1Clock(obj->clkHandle);


 HAL.c:


//已添加BK:
 第160行
//ECAP
extern interrupt void ecapISR(void);

HAL.H (HAL):
第487行


 //已添加BK:
 //ECAP:
 静态内联void HAL_initIntVectorTable (HAL_HANDLE句柄)
...
 //已添加BK:
 //ECAP:
 PIE->ECAP1_INT = ecapISR;

 disable_protected_register_write_mode;

 返回;
 主实验文件:

行(顶部)

// bk已添加:
#define speed_base_Krpm 7.7     // 11 V时DJI E30.092万 kV的最大电动机转速

_IQ gSpeedRef_Duty =_IQ (0.0);  //来自外部控制器的速度参考

uINT32_t gSpeedRef_OK = 0;      //速度参考信号的安全检查


在更新全局变量中:


 //已添加BK:
   gMotorVars.SpeedRef_Krpm = gSpeedRef_Duty * speed_base_Krpm;


线路(主ISR)

//检查速度参考信号是否激活
 //如果超过2000个保养例行程序循环在没有信号的情况下通过,请禁用电机
 如果(gSpeedRef_OK++>2000)
 {
     gSpeedRef_Duty =_IQ (0);
     gMotorVars.Flag_Run_Identify = 0;
     gSpeedRef_OK = 0;
 }





行(底部)

 __interrupt void ecapISR(void)

   //清除捕获(CAP)中断标志
   CAP_clearInt (halHandle->capHandle,CAP_Int_Type_All);

   //计算PWM高周期(上升边缘到下降边缘)
   UINT32_t PwmDuty =(UINT32_t) cap_getCap2 (halHandle->capHandle)-(UINT32_t) cap_getCap1 (halHandle->capHandle);

   //指定适当的速度命令Combine 5 % 和100 %
   // 0 100 % 速度与1-2毫秒的高周期成比例
   // 60MHz * 2ms = 12万

   // 0 1 %
   IF (PwmDuty <= 6.1万)
   {
       gSpeedRef_OK = 0;
       gSpeedRef_Duty =_IQ (0);
       gMotorVars.Flag_Run_Identify = 0;
   }
   // 1 99 %
   IF ((PwmDuty > 6.1万)&&(PwmDuty < 11.9万))
   {
       gSpeedRef_OK = 0;
       gSpeedRef_Duty =_IQdiv (PwmDuty - 6万,6万);
       gMotorVars.Flag_Run_Identify = 1;
   }
   // 99 100 %
   否则,如果(PwmDuty >= 11.9万)
   {
       gSpeedRef_OK = 0;
       gSpeedRef_Duty =_IQ (1.0);
       gMotorVars.Flag_Run_Identify = 1;
   }
   //捕获所有内容
   否则
   {
       gSpeedRef_Duty =_IQ (0);
       gMotorVars.Flag_Run_Identify = 0;
   }

   //清除由组号定义的中断
   PIE_clearInt (halHandle->PiHandle,PIE_GroupNumber_4);
}// ecapISR()函数结束

我们使用此代码来捕获PWM,并使用PWM输入作为参考来控制BLDC电机的速度。 我们能够成功识别电机参数,但由于某些原因,我们的ECAP中断不会触发,并且我们无法捕获PWM信号。 请建议对代码进行必要的更改。

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

    理解代码并提供响应需要时间。您能否提供一些关于您是否正在基于TI现有示例开发代码的第一级信息? 您运行的任何现有示例是否有效?您修改了哪些内容,并且eCAP中断已停止工作?

    此致,
    Sudharsanan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也使用过这个代码,它是在一本手册中提供的,这个代码不起作用,ecapture中断不执行,PWM信号不被捕获。 请浏览代码并提供永久解决方案。 至少提供有关ecapture未能捕获PWM的可能原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我认为您的代码中的其他地方全局启用了中断,对吗?

    在CCS的“寄存器”视图中查看eCAP寄存器时,您会看到什么? 在ECFLG中是否设置了任何标志? 计数器是否正在运行?

    编辑:此外,如果尚未运行,请尝试运行controlSUITE中的eCAP示例,看看它们是否适合您。


    谢谢!
    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,中断正在全局启用。 没有设置任何标志,但计数器正在运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然没有看到您的代码有任何问题。 我将您的eCAP配置复制到我自己的项目中,没有遇到任何中断问题。

    您是否介意在CCS寄存器窗口中共享ECAP和PIE寄存器的屏幕捕获?

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

    嘿,Whitney,

    以下是您请求的所有屏幕截图。

    此致。

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

    很抱歉回复太慢。 我上周在旅行,没有机会回答。 您是否仍有问题?

    从您的屏幕捕获来看,似乎没有一个来自HAL_setupeCAP()的配置通过。 您是否可以确定您是在HAL_setupeCAP()之前调用CLK_enableEscap1Clock()? 如果未启用时钟,则写入寄存器将不起作用。

    Whitney