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.

[参考译文] 编译器/UCD3138064EVM-166:UCD3138064EVM-166程序

Guru**** 2386610 points
Other Parts Discussed in Thread: UCD3138, UCD3138064
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/640891/compiler-ucd3138064evm-166-ucd3138064evm-166-program

器件型号:UCD3138064EVM-166
主题中讨论的其他器件:UCD3138UCD3138064

工具/软件:TI C/C++编译器

我在下面提供了源代码、用于感应 AD0中的 IC、并根据感应参数 IC 的状态生成 DPWM0B 和 DPWM1B。 如果 IC 大于0.5、则 DPWM0B 会生成开关信号、而 DPWM1B 持续导通、而当 IC 小于0.5时、则另一种方式。 如果不包含 AD0感应、但包含感应功能时不能提供令人满意的结果、则该程序正常工作。 请帮助我解决此问题。

#define main 1.

#include "system_defines.h"
#include "Cyclon_Device.h"
#include "PMBus_commands.h"
#include "PMBus_common.h"
#include "PMBus_topology.h"
#include "variables.h"
#include "functions.h"
#include "software_interrupts.h"
#include "cyclone_defination.h"
#include "stdio.h"
#include "math.h"
//#include "include.h"


define PCLK_PERIOD      4.0e-9
#define PERIOD_Seconds   10.0e-6
#define 周期         ((int)(period_seconds/PCLK_PERIOD)<<4)
#define EVENT1         (int)(周期*0.00)
#define EVENT2         (int)(周期*0.25)
#define EVENT3         (int)(周期*0.50)
#define EVENT4         (int)(周期* 0.75)

int ram_eadcdac;
// HyperKnob 的注释[min=0、max=16383、step=256]
uint16 i;
int ram_cpu_sample、vout;
float CH1[334]、sinth、wt、w、t;
//uint32 ic;
void init_adc_polled (void)

   AdcRegs.ADCCTRL.bit.MAX_CONV = 6;//总共5次转换(0至4次)
   AdcRegs.ADCCTRL.bit.SINGLE_SAWEP = 1;
   AdcRegs.ADCCTRL.bit.ADC_EN = 1;
   AdcRegs.ADCSEQSEL0.bit.SEQ0 = 0;// ad00 AC-L 订购0
   AdcRegs.ADCSEQSEL0.bit.SEQ1 = 2;// AD01 IIN
   AdcRegs.ADCSEQSEL0.bit.SEQ2 = 3;// AD03 VB
   AdcRegs.ADCSEQSEL0.bit.SEQ3 = 4;// ad04 AC-N
   AdcRegs.ADCSEQSEL1.bit.SEQ4 = 6;// ad06 CT-1 Order4
   AdcRegs.ADCSEQSEL1.bit.SEQ5 = 7;// ad07 VB-OV
   AdcRegs.ADCSEQSEL1.bit.SEQ6 = 13;// ad13 CT-2
   AdcRegs.ADCSEQSEL1.bit.SEQ7 = 9;// ad09
   AdcRegs.ADCSEQSEL2.bit.SEQ8 = 13;// ad13


   AdcRegs.ADCAVCTRL.bit.AVG0_CONFIG = 0;//平均4个 ad06样本
   AdcRegs.ADCAVCTRL.bit.AVG0_EN = 1;//模0取平均值被启用
   AdcRegs.ADCAVCTRL.bit.AVG1_CONFIG = 1;//平均8个 AD02样本
   AdcRegs.ADCAVGCTRL.bit.AVG1_EN = 1;//模1取平均值启用
   AdcRegs.ADCAVCTRL.bit.AVG2_CONFIG = 2;//平均16个 AD04样本
   AdcRegs.ADCAVCTRL.bit.AVG2_EN = 1;//模2取平均值被启用
   AdcRegs.ADCAVCTRL.bit.AVG3_CONFIG = 3;//平均32个 AD06样本
   AdcRegs.ADCAVCTRL.bit.AVG3_EN = 1;//模3取平均值被启用
   AdcRegs.ADCAVGCTRL.bit.AVG4_CONFIG = 3;//平均4个 ad08样本
   AdcRegs.ADCAVGCTRL.bit.AVG4_EN = 1;//模4取平均值启用
   AdcRegs.ADCAVCTRL.bit.AVG5_CONFIG = 3;//平均4个 ad08样本
   AdcRegs.ADCAVCTRL.bit.AVG5_EN = 1;//模4取平均值被启用

   AdcRegs.ADCCTRL.bit.SW_START = 1;//触发新的测量序列

   }

void init_dpwm0 (void)


      Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 0;//禁用所有内容
      Dpwm0Regs.DPWMCTRL1.bit.GPIO_A_EN = 1;//立即关闭 DPWM1A
      Dpwm0Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;//立即关闭 DPWM1B
      //启用 CBC 和消隐窗口
      Dpwm0Regs.DPWMCTRL0.bit.CBC_PWM_AB_EN = 1;//启用逐周期电流限制。
      Dpwm0Regs.DPWMCTRL0.bit.Blank_B_EN = 1;//启用消隐
      Dpwm0Regs.DPWMBLKBBEG.ALL = 0x0000;
      Dpwm0Regs.DPWMBLKBEND.ALL = 0x0500;
      Dpwm0Regs.DPWMFLTCTRL.bit.B_MAX_COUNT = 2;
      Dpwm0Regs.DPWMFLTCTRL.bit.ALL_FAULT_EN = 1;//为 OVP 启用此选项
      Dpwm0Regs.DPWMCTRL2.bit.sample_trig_1_EN = 1;//启用采样触发器1
      Dpwm0Regs.DPWMCTRL0.bit.PWM_MODE = 3;//三角模式
      Dpwm0Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0;//立即更新
      Dpwm0Regs.DPWMCTRL0.bit.CLA_EN = 1;
      Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 1;
      Dpwm0Regs.DPWMPRD.All=周期;//新建


void init_dpwm1 (void)


      Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 0;//禁用所有内容
      Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN = 1;//立即关闭 DPWM1A
      Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;//立即关闭 DPWM1B
      //启用 CBC 和消隐窗口
      Dpwm1Regs.DPWMCTRL0.bit.CBC_PWM_AB_EN = 1;//启用逐周期电流限制。
      Dpwm1Regs.DPWMCTRL0.bit.Blank_B_EN = 1;//启用消隐
      Dpwm1Regs.DPWMBLKBBEG.ALL = 0x0000;
      Dpwm1Regs.DPWMBLKBEND.ALL = 0x0500;
      Dpwm1Regs.DPWMFLTCTRL.bit.B_MAX_COUNT = 2;
      Dpwm1Regs.DPWMFLTCTRL.bit.ALL_FAULT_EN = 1;//为 OVP 启用此选项
      Dpwm1Regs.DPWMCTRL2.bit.sample_trig_1_EN = 1;//启用采样触发器1
      Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3;//三角模式
      Dpwm1Regs.DPWMCTRL0.bit.MSYNC_SLAVE_EN = 0;//新建
      Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0;//立即更新
      Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_MODE = 0;//新建
      Dpwm1Regs.DPWMCTRL0.bit.CLA_EN = 1;
      Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 1;
      Dpwm1Regs.DPWMPRD.All=周期;//新建


void init_dpwm2 (void)


   Dpwm2Regs.DPWMCTRL0.bit.PWM_EN = 0;    //针对初始化在本地禁用
   //Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN = 1;//立即关闭 DPWM1A
  //Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;//立即关闭 DPWM1B
   Dpwm2Regs.DPWMCTRL0.bit.CLA_EN = 1;      //默认值为1 -使用 CLA
   Dpwm2Regs.DPWMPRD.All =周期;        //对所有值使用.all,以便缩放匹配
   Dpwm2Regs.DPWMEV1.ALL = EVENT1;        //将事件1设置为周期的0%(开始)
   Dpwm2Regs.DPWMEV2.all = EVENT2;        //将事件2设置为周期的25%
   Dpwm2Regs.DPWMEV3.ALL = EVENT3;        //将事件3设置为周期的50%
   Dpwm2Regs.DPWMEV4.ALL = EVENT4;        //将事件4设置为周期的75%
   Dpwm2Regs.DPWMSAMPTRIG1.ALL =(周期* 3)/4;//3/4周期
   Dpwm2Regs.DPWMCTRL2.bit.sample_trig_1_EN = 1;//启用1个采样触发器
   Dpwm2Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1;//在周期结束时更新
   Dpwm2Regs.DPWMCTRL0.bit.PWM_MODE =0;  //正常模式(这不是默认值)
   //Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN =1;//立即关闭 DPWM1A
   //Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN =1;//立即关闭 DPWM1B
   Dpwm2Regs.DPWMCTRL0.bit.PWM_EN =1;    //本地启用 DPWM0
   Dpwm2Regs.DPWMPRD.All=周期;//新建


void init_dpwm3 (void)


   Dpwm3Regs.DPWMCTRL0.bit.PWM_EN = 0;    //针对初始化在本地禁用
   //Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN = 1;//立即关闭 DPWM1A
  //Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;//立即关闭 DPWM1B
   Dpwm3Regs.DPWMCTRL0.bit.CLA_EN = 1;      //默认值为1 -使用 CLA
   Dpwm3Regs.DPWMPRD.All =周期;        //对所有值使用.all,以便缩放匹配
   Dpwm3Regs.DPWMEV1.ALL = EVENT1;        //将事件1设置为周期的0%(开始)
   Dpwm3Regs.DPWMEV2.all = EVENT2;        //将事件2设置为周期的25%
   Dpwm3Regs.DPWMEV3.ALL = EVENT3;        //将事件3设置为周期的50%
   Dpwm3Regs.DPWMEV4.ALL = EVENT4;        //将事件4设置为周期的75%
   Dpwm3Regs.DPWMSAMPTRIG1.ALL =(周期* 3)/4;//3/4周期
   Dpwm3Regs.DPWMCTRL2.bit.sample_trig_1_EN = 1;//启用1个采样触发器
   Dpwm3Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1;//在周期结束时更新
   Dpwm3Regs.DPWMCTRL0.bit.PWM_MODE =0;  //正常模式(这不是默认值)
   //Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN =1;//立即关闭 DPWM1A
   //Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN =1;//立即关闭 DPWM1B
   Dpwm3Regs.DPWMCTRL0.bit.PWM_EN =1;    //本地启用 DPWM0
   Dpwm3Regs.DPWMPRD.All=周期;//新建

 
void init_filter0 (void)
{   //PID 设置取自随机拓扑-实验用于回路、而不是调整参数。

   Filter0Regs.FILTERKPCOEF0.bit.KP_COEF_0 = 800;
   Filter0Regs.FILTERKICOEF0.bit.KI_COEF_0 = 50;
   Filter0Regs.FILTERKDCOEF0.bit.KD_COEF_0 = 1500;
   Filter0Regs.FILTERKDALPHA.bit.KD_alpha_0 =-1;

   Filter0Regs.FILTERKICLPHI.bit.KI_CLAMP 高电平= 0x7FFFFF;
   Filter0Regs.FILTERKICLPLOL.bit.KI_CLAMP 低电平= 0;

   Filter0Regs.FILTEROCLPHI.bit.output_CLAMP 高电平= 0x7FFFFF;
   Filter0Regs.FILTEROCLPLO。bit.output_clamp 低电平= 0;

   Filter0Regs.FILTERCTRL.bit.FILTER_EN = 1;
    //在此处启用 OK,因为在全局启用 DPWM 和前端之前不会发生任何情况

   //处理击穿的更好选择-使用全动态范围的滤波器
   LoopMuxRegs.FILTERKCOMPA.bit.KCOMP0 =(周期/2)>> 4;   // KCOMP 为4ns、周期为250ps
   Filter0Regs.FILTERCTRL.bit.output_MULT_SEL = 0;      //为输出乘法器选择半周期 kcomp


void init_loop_mux (void)

   LoopMuxRegs.DPWMMUX.bit.DPWM0_FILTER_SEL = 0;      //对 DPWM 0使用滤波器0
   LoopMuxRegs.SAMPTRIGCTRL.bit.FE0_TRIG_DPWM0_EN = 1;//使用 DPWM0进行滤波器0采样触发


void global_enable (void)

   UNION GLBEN_REG glben_store;//收集全局使能位以供同步使用
   glben_store.all = 0;
   glben_store.bit.DPWM0_EN = 1;
   glben_store.bit.DPWM1_EN = 1;
   glben_store.bit.DPWM2_EN = 1;
   glben_store.bit.DPWM3_EN = 1;
   glben_store.bit.FE_CTRL0_EN = 1;
      LoopMuxRegs.GLBEN = glben_store;


void init_front_end0 (void)

   FeCtrl0Regs.EADCDAC.BIT.DAC_VALUE = 0;
   FeCtrl0Regs.EADCCTRL.bit.AFE_GAIN = 2;


void init_timer_interrupt (void)

   TimerRegs.T16PWM0CMP0DAT.ALL = 312; //大约50kHz。 按规格
   TimerRegs.T16PWM0CMP1DAT.ALL = 0xFFFF;
   TimerRegs.T16PWM0CMPCTRL.ALL = 2;
   TimerRegs.T16PWM0CNTCTRL.ALL = 0x00c;

   //write_reqmask (CIMINT_All_FAULT_COMP);//启用 pwm2cmp
   //enable_interrupt ();
   disable_interrupt ();
   disable_fast_interrupt ();
   //interrupt_status = FaultMuxRegs.FAULTMUXINTSTAT.ALL;
   //配置 IRQ
   WRITE_REQMASK (CIMINT_All_FAULT_MUX|CIMINT_All_PWM0_COMP|CIMINT_All_PWM1_COMP);
   //配置 FIQ
   WRITE_FIRQpr (CIMINT_All_FAULT_MUX);
   //启用中断
   enable_interrupt ();
   enable_fast_interrupt ();





void main()

     杂项 AnalogRegs.IOMUX.ALL = 0;

   if (GioRegs.FAULTIN.bit.FLT3_IN = 1)
   {
      clear_integration_word_();
   }

#IF (UCD3138|UCD3138064)
   杂项 AnalogRegs.CLKTRIM.bit.HFO_LN_FILTER_EN = 0;
   杂散 AnalogRegs.CSTRIM.bit.ITARM_TRIM =23;//28;
#endif

   INIT_PMBus (0x58);                   //初始化 PMBus 处理程序
   init_dpwm0();                      //初始化 DPWM0
   init_dpwm1 ();                          //初始化 DPWM1
   init_dpwm2 ();                          //初始化 DPWM2
   init_dpwm3 ();                          //初始化 DPWM3
   init_filter0();
   init_loop_mux();
   init_front_end0();
   global_enable();
   init_timer_interrupt ();
   init_adc_polled();
   //string_out_0 ("\033[2J");
   //init_uart();
   RAM_eadcdac = FeCtrl0Regs.EADCDAC.bit.DAC_value;//初始化 HyperKnob

   for (;;)
            {
                        PMBus_handler ();
                     FeCtrl0Regs.EADCDAC.bit.DAC_value = ram_eadcdac;//将 HyperKnob 值放入寄存器
            }
   }


pragma 中断(c_int00、复位)

void c_int00 (void)

   main();



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///标准中断      ////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "system_defines.h"
#include "Cyclon_Device.h"
#include "PMBus_commands.h"
#include "PMBus_common.h"
#include "PMBus_topology.h"
#include "variables.h"
#include "functions.h"
#include "software_interrupts.h"
#include "cyclone_defination.h"
#include "stdio.h"
#include "math.h"
uint32 ic;

//#pragma CODE_STATE (standard_interrupt、32)   //这将确保此代码在 ARM 模式下编译
#pragma FUNC_ALWAYS_INLINE (POLL_ADC)
void POLL_ADC (void)

   if (AdcRegs.ADCSTAT.bit.ADC_INT = 1)//如果转换未完成
   {
       IC = AdcRegs.ADCAVGRESULT[0].bit.RESULT;
             }
   AdcRegs.ADCCTRL.bit.SW_START = 1;//重新启动


#pragma FUNC_ALWAYS_INLINE (整流_VAC)
内联整流_VAC (void)


   Dpwm0Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;
   Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1;

    LoopMuxRegs.FILTERMUX.BIT.filter1_FE_SEL = 0;//使用 EADC2驱动滤波器1
   // IC = AdcRegs.ADCAVGRESULT[0].bit.RESULT;
   IF (IC<0.5)
   {
      Dpwm0Regs.DPWMCTRL1.bit.GPIO_B_EN = 0; //现在打开中性 PWM
      Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_VAL = 1; //然后驱动线路始终为高电平

   }
   其他
   {
      Dpwm0Regs.DPWMCTRL1.bit.GPIO_B_VAL = 1; //线路驱动为低电平
      Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 0; //现在禁用中性 PWM
   }

#pragma INTERRUPT (standard_interrupt、IRQ)
void standard_interrupt (void)

   POLL_ADC();
   矫正_VAC ();
   FaultMuxRegs.ACOMPCTRL3.bit.ACOMP_G_THRESH = 21;
   TimerRegs.T16PWM0CMPCTRL.ALL = 3;//通过读取/写入清除中断位。



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

    您好!

    您的问题已转发给相应的工程师。

    谢谢、

    Amiel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法为您调试您的程序。 您只需说它正常工作、不工作、因此可能当您将两个 DPWM 引脚都退出 I/O 模式时、两个引脚上的信号相同。 如果确实如此、则说明 ADC 读数或 DPWM 引脚禁用或两者都有问题。 我建议一次调试一个。 首先查看 ADC 是否正常工作、IC 值是否随输入信号正确变化。 您可以使用开环板和电压源执行此操作。 或者、您可以将 I/O 引脚设置为高电平(当 IC 值高于.5时)、低电平(当它低于0.5时)。 这对于动态测试很好。

    然后独立测试 I/O 启用/禁用。

    您可能已经完成了这项工作、它正在运行?