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.

[参考译文] CCS/TMS320F28379D:ADCRESULTx 寄存器问题

Guru**** 2589280 points
Other Parts Discussed in Thread: TMDSCNCD28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/662383/ccs-tms320f28379d-adcresultx-register-question

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

大家好!  

我的多 SOC 及其结果有问题。

我需要使用12个通道、对于每个通道、我单独使用 SOC。 我从一个通道开始弓箭步,这一点没有问题,所有的工作都很完美。

下一步是为4个通道建立4个 SOC、这里开始出现问题。

通过在通道 A0上提供1.5V 电压、我已经在寄存器 ADCRESULT0和 ADCRESULT1中得到结果(请参阅图像1)。  

寄存器 ADCRESULT1 (好的)中通道 A1提供1.5V 电压。

通过在通道 A2处提供1.5V 电压、我完全没有结果、等等。

我已经阅读过10次以上的所有示例、与技术手册相同... 我找不到答案。

原因可能是什么?  

谢谢!

图1.

----------------------------------------------------------------------

//############################################################################################################
// ePWM1 100kHz、50%占空比;
// ePWM1B=!ePWM1A;
//去带= 100ns 上升沿+ 100ns 下降沿
// PIN49=ePWM1A PIN51=ePWM1B;
// ADC SOC0、CHSEL0 =引脚09
//############################################################################################################

//包含的文件
//
#include "F28x_Project.h"

//
//定义
//
#define PRD 499 //周期寄存器2499=20kHz 499=100kHz 99=500kHz
#define DB 20 //去带1 = 10nS
#define acqps 14 //采集窗口75ns

//
//全局
//


//
//函数原型
//
void ConfigureADC (void);
void SetupADCepwm (void);
_interrupt void adca1_ISR (void);

void InitEPwm1Examples(void);
_interrupt void epwm1_ISR (void);


//
//主函
//
void main (void)


InitSysCtrl();


// InitGpio();


CpuSysRegs.PCLKCR2.bit.EPWM1=1;

InitEPwm1Gpio();


//
//配置 ADC 并为其加电
//
ConfigureADC();
//
//为 ePWM 触发的转换设置 ADC
//
SetupADCepwm();


Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();


EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM1_INT =&epwm1_ISR;
PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的


EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

InitEPwm1Examples();

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

IER |= M_INT3;
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//PWM
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//ADC

while (1)

}//结束时

}//主端

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

空配置 ADC (空)

EALLOW;

//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
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.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 A0
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 A1
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;//SOC2将转换引脚 A2
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;//SOC3将转换引脚 A3

AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;// 14 = 75ns
AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;// 14 = 75ns

AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;// ePWM1 SOCA 上的触发

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3;// SOC3结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

EDIS;

//
// adca1_ISR -在 ISR 中读取 ADC 缓冲器
//
_interrupt void adca1_ISR (void)

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

//
// epwm1_ISR - EPWM1 ISR
//
_interrupt void epwm1_ISR (void)

//
//切换 GPIO31 (LED)
//
// GpioDataRegs.GPATOGGLE.bit.GPIO31=1;
//
//清除此计时器的 INT 标志
//
EPwm1Regs.ETCLR.bit.INT = 1;

//
//确认此中断以接收来自组3的更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

//
// InitEPwm1Example-Initialize EPWM1配置
//
空 InitEPwm1Examples()

//
//设置 TBCLK
//
EPwm1Regs.TBPRD = PRD;//设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器

//
//设置比较值
//
EPwm1Regs.CMPA.bit.CMPA = PRD/2;//设置比较 A 值
EPwm1Regs.CMPB.bit.CMPB = 0;//设置比较 B 值

//
//设置计数器模式
//
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.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.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM1A、递增
//计数
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM1A、
//倒计数
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//在事件 B 上设置 PWM1B、向上
//计数
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;//在事件 B 上清除 PWM1B、
//倒计数

//
//低电平有效 PWM -设置死区
//

EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;// ePWMxA -上升沿的源、ePWMxB -下降沿的源、
EPwm1Regs.DBFED.bit.DBFED = DB;
EPwm1Regs.DBRED.bit.DBRED = DB;

//
//中断,我们将在其中更改比较值
//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在第三个事件发生时生成 INT

EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲

//
//文件结束
//

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

    是否发生了 ADC-A INT1 ISR?

    常规设置看起来正常:ePWM SOCA 触发 ADCA SOC0-SOC3、然后 SOC3结束触发 ADCISPR。

    通道选择和 S+H 设置也看起来正常。

    但是、即使对于 A0、结果也不是很正确:即使是3.3V VREFHI 范围、1.5V/3.3V*4096 = 1862、但 ADCA 结果0是1699、这太低了。 您可能需要检查 VDDA、VREFHI 和实际 ADC A 输入的物理连接。

    这是 TI 套件还是您自己的定制板?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、
    是的、ADC_INTERRUPT 正常工作、现在为空=)
    我使用此套件 www.ti.com/.../TMDSDOCK28379D
    controlCARD www.ti.com/.../TMDSCNCD28379D
    因此 REFVoltage 是实习生。
    此外、在大多数情况下、该芯片上还有另一个程序、该程序使用 ADC、所有程序都可以正常工作。 我在属性中找不到区别...
    完全位于 ADCRESULT1中的 A1的结果显示1863+-5、当只有一个通道工作时、相同的结果显示结果寄存器。 这意味着 REFHI REFLO 电压=(

    我被骗了... 我甚至尝试使用 ePWM_ADC_example、但使用4个通道-同样的问题.. 即使是4个 SOC、单通道也能正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Anton:

    我在这里也看不到任何东西来解释这一点。

    您是否将3.3V = VDDA 用于 VREFHI 或3.0V 精密基准? (这由控制卡上的小开关选择)

    您的卡版本是否受此勘误表的影响?如果是、您是否更正了此错误?:

    "有关 F28379D controlCARD R1.3的警告:
    1.R51-R54错误地装配了100MΩ Ω 电阻器而不是100mΩ Ω 电阻器。 使用100MΩ μ m
    使用的电阻器、ADC 的电压基准可能不会保持足够的恒定和
    采样/转换期间 ADC 结果的精度/精度可能会受到影响。 建议这样做
    客户将 R51-R54替换为100mΩ Ω、0603、5%容差(或更高)电阻器。 用于评估
    controlCARD 在实验室环境中、也可以使用0Ω Ω 电阻器或将 R51-R54短接
    焊接电桥;但是、最好填充100mΩ Ω 电阻器。 请参阅以下 E2E 帖子:
    e2e.ti.com/.../576301。 "
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    感谢您的回答!

    我已检查 R51-R54、它们都正常(~100m Ω)。

    '在左侧位置–ADC-A 被配置为使用 VDDA (3.3V)作为 ADC 的电压基准。 满量程

    该 ADC 的范围为0-3.3V、但 ADC 的精度/精度会降低。

    •在正确的位置–ADC-A 配置为使用精确的3.0V 电压基准或

    外部电压可用作基准。 R59和 R60决定使用哪种设置(请参阅

    R59/R60的说明、上述)"

    我使用开关 SW2、SW3的左侧位置。 这意味着基准电压为3.3V  

    在前面的测试中、我已对 A0通道施加1.5V 电压、这次我曾对3.3V 电压施加过电压(请参阅屏幕截图)

    3.3V 至 A1

    3.3V 至 A2

    3.3V 至 A3

    它看起来像是溢出在发生... 但是、为什么将结果放在其他寄存器中呢? (具有1.5V 相同的电压、但值较小)

    谢谢!

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

    您是否在其他通道上驱动任何东西? 在没有输入的情况下、将转换之前转换中剩余的任何电荷。

    A2和 A3读数不完全是4095、这似乎很奇怪。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、
    不、我使用的是单根电缆、并将电压分别施加到每个通道上。 3.3V 我直接从套件卡获取。
    在该板中、另一人使用具有此属性的程序(请参阅代码)、ADC 工作正常。 我不需要这么多的中断、而 ADC 只需要 ADCA 和一个中断。 我认为属性没有区别、也不理解结果为何如此错误...
    ######################################
    空 SetupADC()

    EALLOW;

    //ADC A

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //触发 ePWM1 SOCA/C

    // ADC B

    AdcbRegs.ADCSOC1CTL.bit.CHSEL = 2; //SOC0将转换引脚 B2
    AdcbRegs.ADCSOC1CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5; //触发 ePWM1 SOCA/C

    AdcbRegs.ADCSOC2CTL.bit.CHSEL = 1; //SOC0将转换引脚 B1
    AdcbRegs.ADCSOC2CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 7; //触发 ePWM2 SOCA/C

    AdcbRegs.ADCSOC3CTL.bit.CHSEL = 0; //SOC0将转换引脚 B0
    AdcbRegs.ADCSOC3CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 9; //触发 ePWM3 SOCA/C


    // ADC C

    AdccRegs.ADCSOC4CTL.bit.CHSEL = 2; //SOC0将转换引脚 C2
    AdccRegs.ADCSOC4CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdccRegs.ADCSOC4CTL.bit.TRIGSEL = 11; //触发 ePWM4 SOCA/C


    // ADC D

    AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 D0
    AdcdRegs.ADCSOC0CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //触发 ePWM1 SOCA/C

    AdcdRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC0将转换引脚 D1
    AdcdRegs.ADCSOC1CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 5; //触发 ePWM1 SOCA/C

    AdcdRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC0将转换引脚 D2
    AdcdRegs.ADCSOC2CTL.bit.ACQPS = ACQ_WINDOW; //采样窗口
    AdcdRegs.ADCSOC2CTL.bit.TRIGSEL = 5; //触发 ePWM1 SOCA/C

    //中断1.

    AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1的末尾将设置 INT1标志
    AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

    AdcbRegs.ADCINTSEL1N2.bit.INT2SEL = 2;// SOC2的末尾将设置 INT2标志
    AdcbRegs.ADCINTSEL1N2.bit.INT2E = 1;//启用 INT2标志
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//确保 INT1标志被清除

    AdcbRegs.ADCINTSEL3N4.bit.INT3SEL = 3;// SOC3结束将设置 INT3标志
    AdcbRegs.ADCINTSEL3N4.bit.INT3E = 1;//启用 INT3标志
    AdcbRegs.ADCINTFLGCLR.bit.ADCINT3 = 1;//确保 INT1标志被清除

    //中断2

    AdccRegs.ADCINTSEL3N4.bit.INT4SEL = 4;// SOC4的末尾将设置 INT4标志
    AdccRegs.ADCINTSEL3N4.bit.INT4E = 1;//启用 INT4标志
    AdccRegs.ADCINTFLGCLR.bit.ADCINT4 = 1;//确保 INT4标志被清除

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

    如果您对每个通道一次施加一个电压(而其他通道处于浮动状态)、我们希望看到您之前介绍的内容。 您需要始终以一定的电压驱动所使用的所有通道。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    感谢您的建议! 我将尝试并稍后编写答案=)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    您的建议非常有用! 现在一切都很好!
    谢谢!

    此致、
    安东