主题中讨论的其他器件:UCD3138、 UCD3138064
工具/软件: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;//通过读取/写入清除中断位。
}