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.

[参考译文] UCD3138:UCD3138培训实验4 - CAN#39;t 使闭环正常工作

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/604396/ucd3138-ucd3138-training-lab-4---can-t-get-closed-loop-to-work

器件型号:UCD3138

您好!

在过去的几天里、我一直在尝试让培训实验4 (DPWM 的闭环控制)正常工作、但没有成功。 我尝试写入不同的寄存器等、但无法使闭环控制工作。 在脉冲完全关闭之前、我会看到脉冲在非常短的时间内发生突发(脉冲非常窄的时间大约为10ms)。 我不确定我做了什么、我已经关注了培训视频中的所有内容、逐字描述、包括在 UCD3138开发板上设置跳线。 实验2和3运行良好、我能够完全控制代码...因此我知道我的开发环境设置正确。 我非常感谢在这方面提供的一些帮助、因为我正在尝试将此闭环代码实施到我的项目中。 我已附上以下代码。

#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"

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]

void init_dpwm0 (void)

Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 0;//针对初始化在本地禁用
Dpwm0Regs.DPWMCTRL0.bit.CLA_EN = 1;//默认值为1 -使用 CLA

Dpwm0Regs.DPWMPRD.All =周期;//对所有值使用.all,以便缩放匹配
Dpwm0Regs.DPWMEV1.ALL = EVENT1;//将事件1设置为周期的0%(开始)
Dpwm0Regs.DPWMEV2.all = EVENT2;//将事件2设置为周期的25%
Dpwm0Regs.DPWMEV3.ALL = EVENT3;//将事件3设置为周期的50%
Dpwm0Regs.DPWMEV4.ALL = EVENT4;//将事件4设置为周期的75%

Dpwm0Regs.DPWMSAMPTRIG1.ALL =(周期* 3)/4;//3/4周期
Dpwm0Regs.DPWMCTRL2.bit.sample_trig_1_EN = 1;//启用1个采样触发器
Dpwm0Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1;//在周期结束时更新
Dpwm0Regs.DPWMCTRL0.bit.PWM_MODE = 0;//正常模式(这不是默认值)

Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 1;//本地启用 DPWM0

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

//Filter0Regs.FILTERCTRL.bit.USE_CPU_SAMPLE = 1;//启用 CPU 样本
//Filter0Regs.CPUXN.bit.CPU_SAMPLE = 200;//设置为1/4
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.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 main()

//启用 JTAG
杂项 AnalogRegs.IOMUX.ALL = 0;

///-------------------------------------------------------
//重要:阅读下面的内容,否则代码可能无法正确执行
///-------------------------------------------------------
//将引脚 FAULT3接地以实现正常运行
//将引脚 FAULT3连接到3.3V 以清除校验和
//if (GioRegs.FAULTIN.BIT.FLT3_IN = 1)

//clear_integration_worth();

#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_filter0();
init_loop_mux();
init_front_end0();
global_enable();
RAM_eadcdac = 1000;//FeCtrl0Regs.EADCDAC.bit.DAC_value;//初始化 HyperKnob

/* GioRegs.FAULTINTENA.bit.FLT2_INT_EN = 1;
GioRegs.FAULTDIR.bit.FLT2_DIR = 0;
GioRegs.FAULTIN.bit.FLT2_IN = 0;//1 -故障引脚必须驱动为高电平。 0 -驱动为低电平以触发中断
GioRegs.FAULTINTPOL.bit.FLT2_INT_POL = 0;//将在1 =上升沿、0 =下降沿上生成中断

disable_interrupt ();
disable_fast_interrupt ();//确保禁用快速中断
WRITE_REQMASK (CIMINT_All_FAULT_PIN);//启用 pwm2cmp 和 DPWM0中断(第16个周期结束)(int-priority29)
WRITE_FIRQpr (CIMINT_All_FAULT_PIN);// DPWM0中断(第16个周期结束)映射到 FIQ
enable_fast_interrupt ();
enable_interrupt ();

杂项 AnalogRegs.GLBION.bit.DPWM1A_IO_EN = 1;
杂项 AnalogRegs.GLBIOOE.bit.DPWM1A_IO_OE = 1;
杂项 AnalogRegs.GLBIOVAL.BIT.BIT.DPWM1A_IO_VALUE = 0;*


for (;;)

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


//#pragma 中断(c_int00、复位)

void c_int00 (void)

main();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您要将一些非零值放入 EADCDAC.bit.DACVALUE 中? 如果你在那里保留一个零、我预计没有脉冲、因为你正在尝试不输出任何东西。

    如果你将一个非零值放入 DACVALUE、但仍然没有得到脉冲、那么我建议重新放入实验练习3并改变脉冲宽度以改变电压输出。 在开环模式下更改脉冲宽度时、您应该能够看到 EAP0引脚上的电压上升和下降。 这是我们使用开环的主要原因。 在闭合环路之前、我们会详细测试器件配置和外部硬件。

    如果可以、则返回实验4、使用内存调试器查看滤波器的输入和输出、并使用 EADC 原始值查看击穿位置。