您好!
在过去的几天里、我一直在尝试让培训实验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();
}