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:使用PWM信号作为参考对BLDC电机进行速度控制。

Guru**** 2589265 points
Other Parts Discussed in Thread: DRV8301

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/657924/tms320f28027f-speed-control-of-bldc-motor-using-pwm-signal-as-reference

部件号:TMS320F2.8027万F
线程中讨论的其他部件:TMS320F2.8379万DDRV8301

大家好,

我正在尝试基于TI产品制造飞行控制板,在该板上,我将有一个中央控制器,它将向我的ESC提供PWM信号(油门),而ESC将控制电动机的速度。 对于我的中央处理器,我选择了tms320f2.8379万d,对于我的ESC,我选择了tms320f2.8027万f,它配备了insta-spin foc和drv8301来驱动我的电机。 我已将以下内容添加到我的motoware 5b项目中,以实现我的目标,

对于每个项目,请将其添加到.project文件中:

<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()函数结束  

此代码在其中一份tiduak文档中提供。 当我在我的处理器上刷新此代码,并尝试将gMotorVars_enableSys变量设置为1时,出于某种原因,处理器将其转回0。 我还尝试使用带insta-spin通用GUI的程序,但当我单击“运行”时,处理器无法识别电机,GUI未检查运行。 我还在名称my_motor下指定了我的马达类型和马达参数,但没有帮助。 请帮我解决这个问题,我已经坚持了3个星期了,如果有任何文件与我的困境相关,请提供他们的链接。

此致。

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

    1.您是否使用GPIO5作为电机驱动的PWM?
    2.您的项目使用的PWM频率是多少? 如果电动机驱动器的ISR频率非常高,则使用eCAP中断来计算参考速度是不好的,eCAP ISR可能会导致溢出。 您可以读取PWM ISR中的eCAP寄存器,并在后台循环中计算参考速度(如果响应正常)。

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

    1.GPIO 0,1,2,3,4,5 tms320f2.8027万f用于驱动BLDC电动机的MOSFET 1A,1B,2A,2B,3A,3B。 GPIO 19用于捕获PWM

    将tms320f2.8379万d给出的PWM信号提供给tms320f2.8027万f,然后它将检查PWM信号的占空比,并根据占空比百分比,改变电机的速度。 参考PWM信号的频率为500Hz,最小占空比为1ms,最大占空比为2ms。 我尝试将捕获ISR放入PWM ISR,但仍然不起作用。 将PWM信号连接到GPIO 19时,其值为4000并保持不变。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.您是否将GPIO19配置为捕获功能,因为您使用的是GPIO19,而不是GPIO5。
    GPIO设置模式(obj->gpioHandle,gPIO_NUMBER_19,gPIO_19_Mode_ECAP1)

    2.在hal.c中添加eCAP设置函数,以在HAL_setParams()中调用它。

    void HAL_setupCaps (HAL_HANDLE句柄)

    HAL_Obj *OBJ =(HAL_Obj *)句柄;

    CAP_DisableInt(obj->capHandle[0],CAP_Int_Type_All); //禁用所有捕获中断
    cap_clearInt(obj->capHandle[0],cap_Int_Type_All); //清除所有CAP中断标志
    cap_disableCaptureLoad(obj->capHandle[0]); //禁用CAP1-CAP4寄存器负载
    cap_disableTimestampCounter(obj->capHandle[0]); //确保计数器停止

    //配置外设寄存器 //
    cap_setCapContinued(obj->capHandle[0]); //连续
    CAP_setStopWrap (obj->capHandle[0],CAP_Stop_Wrap _CEVT4); //在4个事件时停止

    CAP_setCapEvtPolarity(obj->capHandle[0],CAP_Event_1,CAP_POLICATICAL_Rising); //上升沿
    CAP_setCapEvtPolarity(obj->capHandle[0],CAP_Event_2,CAP_POLICATICAL_Falling);//下降沿
    CAP_setCapEvtPolarity(obj->capHandle[0],CAP_Event_3,CAP_POLICATICAL_Rising); //上升沿
    CAP_setCapEvtPolarity(obj->capHandle[0],CAP_Event_4,CAP_POLICATICAL_Falling);//下降沿

    CAP_setCapEvtReset(obj->capHandle[0],CAP_Event_1,CAP_Reset_Enable);//差异操作
    CAP_setCapEvtReset(obj->capHandle[0],CAP_Event_2,CAP_Reset_Enable);//差异操作
    CAP_setCapEvtReset(obj->capHandle[0],CAP_Event_3,CAP_Reset_Enable);//差异操作
    CAP_setCapEvtReset(obj->capHandle[0],CAP_Event_4,CAP_Reset_Enable);//差异操作

    cap_enableSyncIn(obj->capHandle[0]); //启用同步
    CAP_setSyncOut(obj->capHandle[0],CAP_SyncOut_SyncIn);//传递

    cap_enableTimestampCounter(obj->capHandle[0]); //启动计数器
    cap_enableCaptureLoad(obj->capHandle[0]); //启用CAP1-CAP4寄存器负载

    返回;
    }// HAL_setupCaps()函数

    然后,您可以使用cap_getCap1(obj->capHandle[0]),cap_getCap2(obj->capHandle[0]),cap_getCap3(obj->capHandle[0])和cap_getCap4(obj->capHandle[0])读取寄存器,以计算电机控制ISR中的PWM占空比。