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.

[参考译文] WEBENCH®︎工具:ADC 采样

Guru**** 2511985 points
Other Parts Discussed in Thread: TLV6001

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

https://e2e.ti.com/support/tools/simulation-hardware-system-design-tools-group/sim-hw-system-design/f/simulation-hardware-system-design-tools-forum/828804/webench-tools-adc-sampling

主题中讨论的其他器件:TLV6001

工具/软件:WEBENCHRegistered设计工具

您好!

我正在使用 ISO244设计隔离式交流电压传感器 (TMSF28377D0。我使用分压器来降低电压 va=vo (R2/R1+R2)在 ISO244的范围内。此外、ISO244的增益为1/3 V/V、因此 ISO244的差分输出为 va*1/3和2.5V 共模电压、我的 ADC 范围为0-3V、因此我使用的 TLV6001的增益为0.75和 偏移电压 为1.65.因此输出电压 为 va*1/3*0.75 。 我的问题是如何使输出电压等于 DSP 内部的实际电压。

V1=(((AdcaResultRegs.ADCRESULT5)*3/9046-1.65)*outputfactor);//  outputfactor 为(R2/R1+2)*1/3*0.75

但是、当我在 CCS 中写入该值并检查 v1的值时、该值不正确。

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

    您好、Shah、

    在我看来、您好像在关注此指导手册电路: http://www.ti.com/lit/an/sbaa317/sbaa317.pdf

    并且在将 ADC 代码转换回电压时遇到问题?  

     TMSF28377D0输出什么代码格式? 二进制补码、还是其他东西?  

    输出系数应为: outputfactor 为(R2/(R1+R2)*1/3*0.75

    3月9046项来自 v1=(((AdcaResultRegs.ADCRESULT5)*3/9046-1.65)*outputfactor);?

    什么是 va?  

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

    是的、我遵循这本指导手册。 是的、我无法将 ADC 代码转换回电压。 ADC 输出代码格式类似于、如果我有30V 交流电压、那么我使用分压器电路在 ISO244范围内降低30交流电压、该分压器电压可以是任何小于12V 的电压。 因此、VA 是分压器电压 、我将分压器电压乘以因数并减去 DC OFFSET、即1.65。  

     模拟输入电压(Vin)、表示数字的二进制数字数和 数字数(D)之间的关系为
    给出  

                    VIN=D*3.0V/4095

    因此 D 是 AdcaResultRegs.ADCRESULT5乘以3/4095,因此整个输出为 ((((AdcaResultRegs.ADCRESULT5)*3/9046-1.65)*outputfactor).

    对还是错? 您能否解释一下将 ADC 代码转换回电压的正确方法。 然后将 ADC 的输出与基准电压进行比较、然后将其提供给 PI 控制器以生成 PWM。

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

    您好、Shah、

    首先是 3/9046、现在是 3/4095、那么您在代码中使用哪一个?  

    您的 ADC 是如何配置的?  

    它是采用伪差分配置还是其他配置进行测量?  

    输出代码格式是什么?  

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

    非常感谢您、我已经正确地解决了 ADC 采样问题。 现在我编写了 C 代码。 我使用50Hz 基频和50kHz 开关频率、因此50kHz/50Hz = 1000、我需要1000点正弦波生成、我需要单相半桥的 SPWM。 我想在不打开直流电源的情况下查看来自 TMSf28377D 板的 SPWM 波形。 但 SPWM 看起来不正确。 我附上了数字、下面是我的代码、谢谢

    #include "F28x_Project.h"

    #include "F28377D_ADC.h"

    #include "F28377D_ePWM.h"

    #include "F28377D_GpioSetup.h"

    #include "math.h"

    #include "string.h"

    #include "Solar_F.h"

    typedef 结构

    volatile struct ePWM_regs * EPwmRegHandle

    uint16 ePWM_CMPA_DIRECTION

    uint16 ePWM_CMPB_DIRECTION

    UINT16 EPwmTimerIntCount

    uint16 EPwmMaxCMPA

    uint16 EPwmMinCMPA

    UINT16 EPwmMaxCMPB

    uint16 EPwmMinCMPB

    }ePWM_INFO

    中断 void epwm1_ISR (void);

    中断 CPU_timer0_ISR ();

    #define PI 3.1415926

    #define period 1000

    #define HALF_PERIOD PERIOD*0.5

    float mag、UA、A=0、z、d、num、cmp;

    float v1、i1;

    Int16 VC1、IL1;

    uint32 i、j、k;

    CNTL_PI_F VC、IL;

    void main (void)

    //步骤1. 初始化系统控制:

    InitSysCtrl();

    InitEPwm1Gpio();

    Dint;

    InitPieCtrl();

    IER = 0x0000;

    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的

    PieVectTable.EPWM1_INT =&epwm1_ISR;

    PieVectTable.TIMER0_INT =&CPU_timer0_ISR;

    EDIS;

    EALLOW;

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;

    EDIS;

    InitEPwm1Examples();

    ConfigureADC();

    SetupADCepwm();

    EALLOW;

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1

    EDIS;

    IER |= M_INT3;

    //在 PIE 中启用 ePWM INTn:组3中断1-3

    PieCtrlRegs.PIEIER1.bit.INTx7=1

    PieCtrlRegs.PIEIER2.bit.INTx1 = 1;

    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

    PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

    PieCtrlRegs.PIEIER3.bit.INTx3=1

    IER |= M_INT1;

    IER |= M_INT2;

    InitCpuTimer();

    ConfigCpuTimer (&CpuTimer0、200、20000);

    CpuTimer0Regs.TCR.ALL = 0x4000;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    PieCtrlRegs.PIEACX.ALL = PIEACK_group2;

    EINT;//启用全局中断 INTM

    ERTM;//启用全局实时中断 DBGM

    /***** 电压 PI 稳压器***** /

    CNTL_PI_F_init (&VC);

    VC.Ki =(500);

    VC.KP=(5)

    vc.Umax= 10;

    vc.umin=-10;

    /***** 电流 PI 稳压器***** /

    CNTL_PI_F_init (&IL);

    iL.Ki =(6000);

    iL.KP=(0.005)

    iL.Umax=30

    iL.Umin=-30;

    I = 0;

    J = 0;

    K = 0;

    中断 epwm1_ISR ()

    //采样电压和电流

    I1=((浮点)(AdcaResultRegs.ADCRESULT1)-2210)*0.01;

    V1=((float)(AdcaResultRegs.ADCRESULT3)-2192)*0.0364;

    IL1=i1;

    VC1= v1;

    /***** 电压 PI 稳压器***** /

    vc.Ref=a

    vc.fbk=v1;;

    CNTL_PI_FUNC (&VC);

    /***** 电流 PI 稳压器***** /

    iL.Ref=vc.out

    iL.FBK=i1

    CNTL_PI_FUNC (&IL);

    D=IL.out

    MAG=周期/100;

    Ua=d*mag;

    CMP=0.5*Period+UA;

    EPwm1Regs.CMPA.bit.CMPA =(UINT16) CMP;

    EPwm1Regs.ETCLR.bit.INT = 1;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    InitEPwm1Examples()

    //设置 TBCLK

    EPwm1Regs.TBPRD =周期;//设置定时器周期

    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0

    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    //设置计数器模式

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率

    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步输出等于零

    //设置隐藏

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载

    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    //

    //设置比较

    //

    EPwm1Regs.CMPA.bit.CMPA = 0;//

    // EPwm1Regs.CMPB.bit.CMPB = 0;

    //设置操作

    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//将 PWM1A 设置为高电平

    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//将 PWM1B 设置为低电平

    EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;

    //

    //中断,我们将在其中更改比较值

    //

    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT INTSEL=中断选择

    EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT

    EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在发生第一个事件时生成 INT

    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC

    EPwm1Regs.ETSEL.bit.SOCASEL = 2;

    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1

    配置 ADC ()

    EALLOW;

    AdcaRegs.ADCCTL2.bit.prescale = 2;//将 ADCCLK 分频器设置为/2

    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    //

    //将脉冲位置设置为晚期

    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1

    //为 ADC 加电

    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //

    //延迟1ms 以允许 ADC 加电时间

    //

    DELAY_US (1000);

    EDIS;

    void SetupADCepwm (void)

    //

    //选择要转换的通道和转换结束标志

    //

    EALLOW;

    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC0将转换引脚 ADCINA0和 ADCRESULT0

    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 28;//采样窗口为 XX 个 SYSCLK 周期

    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发

    AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;//SOC3将转换引脚 ADCINA3和 A1 ADCRESULT3

    AdcaRegs.ADCSOC3CTL.bit.ACQPS = 28;//采样窗口为 XX 个 SYSCLK 周期

    AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发

    //

    //Intraupt

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 4;// SOC4的末尾将设置 INT1标志

    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

    EDIS;

    中断 CPU_timer0_ISR ()

    if (num<1000)

    {num++;}

    其他

    {num=0;}

    Z=2*3.14*num/1000;

    a=30*sinf(z);

    CpuTimer0Regs.TCR.bit.TIF = 1;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    //步骤1. 初始化系统控制:

    InitSysCtrl();

    InitEPwm1Gpio();

    Dint;

    InitPieCtrl();

    IER = 0x0000;

    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的

    PieVectTable.EPWM1_INT =&epwm1_ISR;

    PieVectTable.TIMER0_INT =&CPU_timer0_ISR;

    EDIS;

    EALLOW;

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;

    EDIS;

    InitEPwm1Examples();

    ConfigureADC();

    SetupADCepwm();

    EALLOW;

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1

    EDIS;

    IER |= M_INT3;

    //在 PIE 中启用 ePWM INTn:组3中断1-3

    PieCtrlRegs.PIEIER1.bit.INTx7=1

    PieCtrlRegs.PIEIER2.bit.INTx1 = 1;

    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

    PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

    PieCtrlRegs.PIEIER3.bit.INTx3=1

    IER |= M_INT1;

    IER |= M_INT2;

    InitCpuTimer();

    ConfigCpuTimer (&CpuTimer0、200、20000);

    CpuTimer0Regs.TCR.ALL = 0x4000;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    PieCtrlRegs.PIEACX.ALL = PIEACK_group2;

    EINT;//启用全局中断 INTM

    ERTM;//启用全局实时中断 DBGM

    /***** 电压 PI 稳压器***** /

    CNTL_PI_F_init (&VC);

    VC.Ki =(500);

    VC.KP=(5)

    vc.Umax= 10;

    vc.umin=-10;

    /***** 电流 PI 稳压器***** /

    CNTL_PI_F_init (&IL);

    iL.Ki =(6000);

    iL.KP=(0.005)

    iL.Umax=30

    iL.Umin=-30;

    I = 0;

    J = 0;

    K = 0;

    中断 epwm1_ISR ()

    //采样电压和电流

    I1=((浮点)(AdcaResultRegs.ADCRESULT1)-2210)*0.01;

    V1=((float)(AdcaResultRegs.ADCRESULT3)-2192)*0.0364;

    IL1=i1;

    VC1= v1;

    /***** 电压 PI 稳压器***** /

    vc.Ref=a

    vc.fbk=v1;;

    CNTL_PI_FUNC (&VC);

    /***** 电流 PI 稳压器***** /

    iL.Ref=vc.out

    iL.FBK=i1

    CNTL_PI_FUNC (&IL);

    D=IL.out

    MAG=周期/100;

    Ua=d*mag;

    CMP=0.5*Period+UA;

    EPwm1Regs.CMPA.bit.CMPA =(UINT16) CMP;

    EPwm1Regs.ETCLR.bit.INT = 1;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    InitEPwm1Examples()

    //设置 TBCLK

    EPwm1Regs.TBPRD =周期;//设置定时器周期

    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0

    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    //设置计数器模式

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率

    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步输出等于零

    //设置隐藏

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载

    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    //设置比较

    EPwm1Regs.CMPA.bit.CMPA = 0;//

     

    //设置操作

    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//将 PWM1A 设置为高电平

    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;//将 PWM1B 设置为低电平

    EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;

    //中断,我们将在其中更改比较值

     

    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT INTSEL=中断选择

    EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT

    EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在发生第一个事件时生成 INT

    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC

    EPwm1Regs.ETSEL.bit.SOCASEL = 2;

    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1

    配置 ADC ()

    EALLOW;

    AdcaRegs.ADCCTL2.bit.prescale = 2;//将 ADCCLK 分频器设置为/2

    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);

    //

    //将脉冲位置设置为晚期

    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1

    //为 ADC 加电

    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //延迟1ms 以允许 ADC 加电时间

    DELAY_US (1000);

    EDIS;

    void SetupADCepwm (void)

    //选择要转换的通道和转换结束标志

    //

    EALLOW;

    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC0将转换引脚 ADCINA0和 ADCRESULT0

    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 28;//采样窗口为 XX 个 SYSCLK 周期

    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发

    AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;//SOC3将转换引脚 ADCINA3和 A1 ADCRESULT3

    AdcaRegs.ADCSOC3CTL.bit.ACQPS = 28;//采样窗口为 XX 个 SYSCLK 周期

    AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发

    //Intraupt

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 4;// SOC4的末尾将设置 INT1标志

    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

    EDIS;

    中断 CPU_timer0_ISR ()

    if (num<1000)

    {num++;}

    其他

    {num=0;}

    Z=2*3.14*num/1000;

    a=30*sinf(z);

    CpuTimer0Regs.TCR.bit.TIF = 1;

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

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

    您好、Shah、

    很高兴听到 ADC 问题得到解决!  

    请为新问题创建新主题。