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/F28M36P63C2:ADC 转换

Guru**** 2618835 points

Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/697742/ccs-f28m36p63c2-adc-conversion

器件型号:F28M36P63C2
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

您好!

我正在尝试通过执行简单的转换来更好地了解有关 ADC 模块的内容。 我正在为模拟通道 A7提供1.5V 电压电源。(在将电源实际馈入模拟输入引脚之前,我正在使用限流电阻器和电位计)。

我要尝试验证 ADC 结果寄存器是否与我的模拟电压表读数匹配。 那么、在为 ADCCTL1.ADCREFSEL 位分配值时、我应该使用什么呢? 我的印象是、我必须使用外部基准电压。 我可以使用 ePWM 触发该通道的 SOC 吗? 在编写代码时、我还会记住哪些其他事项?

谢谢、

Srini.

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

    Srini,

    我建议您通读 《参考手册》的"模拟子系统"一章、了解背景信息。

    在从头开始对您自己的应用进行编程之前、我建议您先尝试 controlSUITE 中的一些示例。 ADC_SoC 示例适合您描述的内容:\controlSUITE\device_support\f28m36x\v220\F28M36x_examples_Control\ADC_SoC

    如需器件架构的简要概述、您可以查看这 一为期一天的 F28M35x 技术讲座的材料

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Tommy 抽出时间。 我阅读了模拟子系统一章。 我的疑问实际上是在阅读了第904页之后出现的、其中规定了内部/外部电压选择、我不确定哪一个更符合我的需求。 我已经模拟了 TI 示例、它们使用内部带隙并使用 ePWM 来触发 SOC。 我将遵循这一点、但我不确定应该使用内部基准电压还是外部基准电压。 我的直觉是外部参考。 你有什么想法?

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

    您完全可以根据自己的设计要求进行选择。

    内部基准是0V 至3.3V 满量程范围(FSR)的最简单选择。 如果您的应用在0V-3.3V FSR 范围内不需要超过12b 的精度、请继续使用此器件。

    如果您需要通过减小 FSR 实现更高的精度、则可以提供自己的外部基准电压。 只需确保 VREFHI/VREFLO 电压符合数据表规格。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一定要来,非常感谢 Tommy!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Tommy、

    我使用 ADC_SOC 控制套件示例作为框架、并向其中添加了代码。 我将通道 ADC1A7设置为 SOC2并提供 EPWM1作为触发器、并将 ACQPS 位设置为6。 当我在 ADC 通道 A7中传递1.35伏的输入时,它在 ADCResult 2寄存器中的读数接近3.02V? 以下是我的代码。 我做了些什么错吗?? 此外、更改电位计设置对 ADC 结果值没有影响。

    EALLOW;
    GpioG1CtrlRegs.GPADIR.bit.GPIO0 = 1; //设置为输出
    GpioG1CtrlRegs.GPADIR.bit.GPIO8 = 1; //设置为输出
    GpioG1CtrlRegs.GPAMUX1.bit.GPIO0 = 1; //将多路复用器设置为 EPWM1A
    GpioG1CtrlRegs.GPAMUX1.bit.GPIO8 = 3; //将多路复用器设置为 ADCSOCAn
    EDIS;

    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    Dint;

    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F28M36x_PIECTRL.c 文件中。
    InitPieCtrl();

    //禁用 CPU 中断并清除所有 CPU 中断标志:
    IER = 0x0000;
    IFR = 0x0000;

    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F28M36x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F28M36x_PieVect.c 中找到
    InitPieVectTable();

    //此示例中使用的中断被重新映射到
    //此文件中的 ISR 函数。
    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.ADCINT1 =&ADC1_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    //步骤4. 初始化所有器件外设:
    //此函数位于 F28M36x_InitPeripherals.c 中
    // InitPeripherals ();//此示例不需要
    InitAdc1();//对于此示例,初始化 ADC

    //步骤5. 特定于用户的代码、启用中断:

    //在 PIE 中启用 ADCINT1
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
    IER |= M_INT1; //启用 CPU 中断1
    EINT; //启用全局中断 INTM
    ERTM; //启用全局实时中断 DBGM

    LoopCount = 0;
    ConversionCount = 0;

    //配置 ADC
    EALLOW;
    Adc1Regs.ADCCTL2.bit.ADCNONOVERLAP = 1; //启用非重叠模式,即
    //转换和未来
    //采样事件不重叠
    Adc1Regs.ADCCTL1.bit.INTPULSEPOS = 1; // ADCINT1在之后跳闸
    //结果锁定
    Adc1Regs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT1
    Adc1Regs.INTSEL1N2.bit.INT1CONT = 0; //禁用 ADCINT1连续
    //模式
    Adc1Regs.INTSEL1N2.bit.INT1SEL = 0; //设置 EOC0以触发 ADCINT1
    //火灾
    Adc1Regs.ADCSOC0CTL.bit.CHSEL = 0; //将 SOC0通道选择设置为
    // ADC1A0
    Adc1Regs.ADCSOC1CTL.bit.CHSEL = 2; //将 SOC1通道选择设置为
    // ADC1A2
    Adc1Regs.ADCSOC2CTL.bit.CHSEL= 7; //将 SOC2通道设置为 ADC1A7

    AnalogSysctrlRegs.TRIG1SEL.ALL = 5; //将 EPWM1SOCA 分配给
    // ADC 模块的 ADC 触发器1

    Adc1Regs.ADCSOC0CTL.bit.TRIGSEL = 5; //将 SOC0启动触发器设置为
    //的 ADC 触发器1 (EPWM1 SOCA)
    // ADC
    Adc1Regs.ADCSOC1CTL.bit.TRIGSEL = 5; //将 SOC1启动触发器设置为
    //的 ADC 触发器1 (EPWM1 SOCA)
    // ADC
    Adc1Regs.ADCSOC2CTL.bit.TRIGSEL = 5; //将 SOC2启动触发器设置为
    //的 ADC 触发器1 (EPWM1 SOCA)
    // ADC

    Adc1Regs.ADCSOC0CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7 ADC
    //时钟周期、(6个 ACQPS +
    // 1)
    Adc1Regs.ADCSOC1CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC
    //时钟周期、(6个 ACQPS +
    // 1)
    Adc1Regs.ADCSOC1CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC
    //时钟周期、(6个 ACQPS +
    // 1)

    EDIS;

    ////假设 ePWM1时钟已在 InitSysCtrl()中启用;

    //设置 ADC SOC1的事件触发器(SOCA)
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTRL_CMPA;//从 CMPA 中选择 SOC 打开
    //向上计数
    EPwm1Regs.ETPS.bit.SOCAPRD = 3; //每三次生成一次脉冲
    //事件

    //时基寄存器
    EPwm1Regs.TBPRD =周期; //设置计时器周期、PWM
    //频率= 1/周期
    EPwm1Regs.TBPHS.ALL = 0; //时基相位寄存器
    EPwm1Regs.TBCTR = 0; //时基计数器寄存器
    EPwm1Regs.TBCTL.bit.PRDLD = TB_Immediate;//设置立即加载
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增计数模式:用于
    //非对称 PWM
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    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;// CTR 上的负载=零
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零

    //设置比较值

    EPwm1Regs.CMPA.half.CMPA = Duty_cycle_A; //初始设置占空比50%
    EPwm1Regs.CMPB = Duty_cycle_B; //初始设置占空比50%

    //设置操作

    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //将 PWM2A 设置为零
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //清除事件 A 上的 PWM2A、向上
    //计数

    EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR; //将 PWM2B 设置为零
    EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; //清除事件 B 上的 PWM2B、向上
    //计数

    //等待 ADC 中断
    for (;;)

    LoopCount++;



    _interrupt void ADC1_ISR (void)

    Voltage1[ConversionCount]= Adc1Result.ADCRESULT0;
    Voltage2[ConversionCount]= Adc1Result.ADCRESULT1;
    Voltage3[ConversionCount]= Adc1Result.ADCRESULT2;

    //如果记录了20次转换,则重新开始
    if (ConversionCount = 9)

    ConversionCount = 0;

    else ConversionCount++;

    Adc1Regs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志重新初始化
    //用于下一 SOC
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

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

    您似乎要配置 SOC1 ACQPS 设置两次、而不是 SOC2 ACQPS。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我注意到它并更改了它、但我仍然没有获得正确的电压读数。
    我的电源额定电压为1.5V。
    从电位计进入 Analog 引脚的输入为1.368V

    因此、对于该电压读数、我应该在我的 ADC 结果2寄存器中得到大约1698的结果。 但我最终得到的结果是3753。 转换为3.024V。 有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    采样 A7时、您的电阻器可能会减慢 ADC 保持电容器的充电(或放电)速度。  您可以在 ADC 转换期间使用示波器查看 A7来确认这一点、以查看引脚上是否存在电压干扰。

    在这种情况下、您可以通过以下组合进行实验来改善转换:

    • 增加 ACQPS
    • 减少串联电阻(可降至0)
    • 如果是低带宽信号、则在电阻器和 A7之间添加一个大电容器(nF 至 UF 范围)

    Tommy

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

    感谢您、我们将检查示波器并查找是否存在任何干扰。

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

    我查看了 A7上模拟输入的示波器测量结果、该引脚上没有电压干扰。 我在100% POT 设置下获得1.4V 的恒定直流脉冲。 尽管如此、我还是尝试了您的一些建议来了解发生了什么、我处于最大 ACQPS 值、选择了10欧姆的 Rs 值、实际上对模拟读数没有太大影响。 它们仍然不成比例。 添加电容器会影响输入电压、因为它永远不会变为0。 介于1.2V 和1.4V 之间。 (可能是因为我没有低带宽)。

    目前、这是我拥有的、
    一个通过100欧姆电阻器和一个1K 电位流入 ADC1A7通道的1.5伏输入。 使用万用表在该通道上测量的模拟输入在100% POT 设置下为1.369 V、在0% POT 设置下为0V。 示波器输出分别为1.4V 和0V 的理想直流信号。

    但对于这两个 POT 设置、我分别获得3566和1862的模拟读数。 这意味着在100% POT 设置中电压读数为2.873V、在0% POT 设置中电压读数为1.50V。 当我减小 POT 设置时、电压读数呈线性下降。 我绘制了它、不同时间点的斜率几乎相同。 您认为这可能是失调电压误差吗? 或者您是否有任何其他建议。 感谢您抽出宝贵时间为您提供帮助。 请告诉我您的想法。

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

    您能否展示一个原理图、说明您是如何连接所有设备的? 其他 ADC 通道是否具有相同的行为?

    电位计会产生 Rs、因此您还可以将1.5V 输入直接应用于 A7。 如果外部电压与器件之间接地不良、您还可以尝试直接对 VDD12或 VDD18电源进行采样。

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

    这是电路连接。 我不使用 TI 提供的扩展坞。 使用个性化电路板、其中有用于 ADC 通道的连接器。

    代码中使用的其他 ADC 通道来自 TI 示例。 这些寄存器的值大约在3800范围内

    我移除了 Rs、并且仅使用电位器、并且模拟读数仍然没有变化。

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

    您能否确认1.5V 接地连接到电路板上的 Pot 1端子和 VSSA?

    您的图显示 A7同时连接到1.5V 接地和 PoT-2?

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

    很抱歉、Tommy。 我认为这张电路图有点误导人。 下面是原理图

    在上图中、

    VREF BUFFEXT 是一个1.5V 信号。 R6为 Rs、等于100欧姆。 P1是1k 电位计。 它的一端接地、并且雨刮器将输入馈送到 AD2B6。 但我使用的不是 ADC2B6、而是 ADC1A7。

    原理图中的唯一接地连接是 POT。

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

    这是 ADC 通道连接器

    重要说明 ADC1A7的节点位于该连接器的第二个引脚中。 电位计的抽头向其馈送1.38V 信号。 雨刮器的接地端连接到此连接器中的其中一个接地引脚(精确到引脚11)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否确认 VREF BUFFEXT 的接地基准也连接到 VSSA?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、它已连接。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了 Tommy。 感谢所有帮助。