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.

[参考译文] TMS320F280039C:在 F280039C 中使用 ADC 时遇到问题

Guru**** 2845830 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1632877/tms320f280039c-troubles-using-adc-in-f280039c

器件型号: TMS320F280039C
主题: SysConfig 中讨论的其他器件

您好:
我目前正在使用德州仪器 (TI) 微控制器、但在了解数据表和 SysConfig 时遇到了问题。 为了满足我的要求、我可以有 3.3V 内部基准电压。 在我的硬件中、VREFHI 和 VREFLO 之间只有一个 2.2uF 的电容器。 因此、我想我必须选择内部基准。 我的问题是 ADC 不稳定。 我使用 5 个 ADC(用于连接到滑块,3.3V 或 0V,另一个连接到可变电压)。 滑块至少应该是稳定的、但它们不是从 0x00 0xfff 显示的变量值(从寄存器读取原始值)。 我不知道我配置了什么错误。 以下是读取代码、不应影响原始值:

uint8_t readCANID (){

  uint8_t sample = 0;

  ADC_forceMultipleSOC (ADCA_BASE、(ADC_FORCE_SOC0 | ADC_FORCE_SOC5 | ADC_FORCE_SOC11 | ADC_FORCE_SOC14 | ADC_FORCE_SOC15));
  
  while (ADC_getInterruptStatus (ADCA_BASE、ADC_INT_Number4)= false);
  ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_Number4);
  
  悬空 ADC0 = ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER0)* 2.5 / 4095;
  SAMPLE |=(ADC_readResult (ADCARESULT_BASE、ADC_SOC_Number5)> 3500)<< 3;
  SAMPLE |=(ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER11)> 3500)<< 2;
  SAMPLE |=(ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER14)> 3500)<< 1;
  SAMPLE |=(ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER15)> 3500)<< 0;
  
  Return (sample & 0xF);
  
}

以及 SysConfig 生成的代码:

void myADC0_init (){
  //
  // ADC 初始化:写入 ADC 配置并为 ADC 上电
  //
  //设置模拟电压基准选择和 ADC 模块的失调电压修整。
  //对于 ADC、此函数将模拟电压基准设置为内部(基准电压为 1.65V 或 2.5V)或外部
  //与 SysCtl API 相同。
  //
  ADC_setVREF (myADC0_BASE、ADC_reference_internal、ADC_reference_3_3V);
  //
  //配置模数转换器模块预分频器。
  //
  ADC_setPrescaler (myADC0_BASE、ADC_CLK_DIV_2_0);
  //
  //设置转换结束脉冲的时序
  //
  ADC_setInterruptPulseMode (myADC0_BASE、ADC_PULSE_END_OF_CONV);
  //
  //为模数转换器内核上电。
  //
  ADC_enableConverter (myADC0_BASE);
  //
  //延迟 1ms 以便 ADC 上电时间
  //
  DEVICE_DELAY_US (5000);
  //
  // SOC 配置:设置 ADC ePWM 通道和触发器设置
  //
  //禁用 SOC 突发模式。
  //
  adc_disableBurstMode (myADC0_BASE);
  //
  //设置 SOC 的优先级模式。
  //
  ADC_setSOCPriority (myADC0_BASE、ADC_PRI_ALL_ROTLE_Robin);
  //
  //转换开始 0 配置
  //
  //
  //在 ADC 中配置转换启动 (SOC) 及其中断 SOC 触发条件。
  //   SOC 编号   :0
  //   触发器     :ADC_TRIGGER_SW_ONLY
  //   通道     :ADC_CH_ADCIN0
  //   采样窗口 :16 个 SYSCLK 周期
  //   中断触发器:ADC_INT_SOC_TRIGGER_NONE
  //
  ADC_setupSOC (myADC0_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN0、16U);
  ADC_setInterruptSOCTrigger (myADC0_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
  //
  //转换开始 5 配置
  //
  //
  //在 ADC 中配置转换启动 (SOC) 及其中断 SOC 触发条件。
  //   SOC 编号   :5.
  //   触发器     :ADC_TRIGGER_SW_ONLY
  //   通道     :ADC_CH_ADCIN5
  //   采样窗口 :16 个 SYSCLK 周期
  //   中断触发器:ADC_INT_SOC_TRIGGER_NONE
  //
  ADC_setupSOC (myADC0_BASE、ADC_SOC_Number5、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN5、16U);
  ADC_setInterruptSOCTrigger (myADC0_BASE、ADC_SOC_Number5、ADC_INT_SOC_TRIGGER_NONE);
  //
  //转换开始 11 配置
  //
  //
  //在 ADC 中配置转换启动 (SOC) 及其中断 SOC 触发条件。
  //   SOC 编号   :11.
  //   触发器     :ADC_TRIGGER_SW_ONLY
  //   通道     :ADC_CH_ADCIN11
  //   采样窗口 :16 个 SYSCLK 周期
  //   中断触发器:ADC_INT_SOC_TRIGGER_NONE
  //
  ADC_setupSOC (myADC0_BASE、ADC_SOC_NUMBER11、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN11、16U);
  ADC_setInterruptSOCTrigger (myADC0_BASE、ADC_SOC_NUMBER11、ADC_INT_SOC_TRIGGER_NONE);
  //
  //转换开始 14 配置
  //
  //
  //在 ADC 中配置转换启动 (SOC) 及其中断 SOC 触发条件。
  //   SOC 编号   :14
  //   触发器     :ADC_TRIGGER_SW_ONLY
  //   通道     :ADC_CH_ADCIN14
  //   采样窗口 :16 个 SYSCLK 周期
  //   中断触发器:ADC_INT_SOC_TRIGGER_NONE
  //
  ADC_setupSOC (myADC0_BASE、ADC_SOC_NUMBER14、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN14、16U);
  ADC_setInterruptSOCTrigger (myADC0_BASE、ADC_SOC_NUMBER14、ADC_INT_SOC_TRIGGER_NONE);
  //
  //转换开始 15 配置
  //
  //
  //在 ADC 中配置转换启动 (SOC) 及其中断 SOC 触发条件。
  //   SOC 编号   :15
  //   触发器     :ADC_TRIGGER_SW_ONLY
  //   通道     :ADC_CH_ADCIN15
  //   采样窗口 :15 个 SYSCLK 周期
  //   中断触发器:ADC_INT_SOC_TRIGGER_NONE
  //
  ADC_setupSOC (myADC0_BASE、ADC_SOC_NUMBER15、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN15、15U);
  ADC_setInterruptSOCTrigger (myADC0_BASE、ADC_SOC_NUMBER15、ADC_INT_SOC_TRIGGER_NONE);
  //
  // ADC 中断 4 配置
  //   来源 :ADC_SOC_NUMBER15
  //   中断源:已启用
  //   连续模式:已禁用
  //
  //
  ADC_setInterruptSource (myADC0_BASE、ADC_INT_Number4、ADC_SOC_NUMBER15);
  ADC_clearInterruptStatus (myADC0_BASE、ADC_INT_Number4);
  adc_disableContinuousMode (myADC0_BASE、ADC_INT_Number4);
  ADC_enableInterrupt (myADC0_BASE、ADC_INT_Number4);
}
 
感谢您的帮助。 如果这是一个愚蠢的问题,我很抱歉。
此致、
Diana
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Diana:

    SOC 的概念 是它用作转换序列发生器。  F28003x 具有 16 个 SOC。  转换通常从 SOC0 开始、并以轮询模式执行 SOC15、这是在代码中配置的内容。  不过、可以在代码中优化 SoC 设置。  我认为 SOC#和 ADC 通道分配混合在一起。  SoC#设置不必遵循 ADC 通道编号。  我的意思是、您可以更改 SOC 设置、使 SOC0->ADCIN0、SOC1->ADCIN5、SOC2->ADCIN11、SOC3->ADCIN14、SOC4->ADCIN15。  对于 VREF3.3 内部基准、是的、您不必执行任何操作。

    在使用滑块(开关)选择 0V/3.3V 电平来根据转换结果确定 ID 位置时、我看不出任何明显错误。  只需快速检查一下、也许测量 5、11、14、15 ch5 上的电平、确定它们确实处于 0v 或 3.3V、滑块不会瞬间打开/关闭。  您的问题可能是序列发生器 (SOC) 配置所致。 首先尝试更改时序、看看 SOC 变化是否得到了正确的 ID/转换。

    谢谢、

    Joseph  

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

    我做了更改、滑块工作正常。 值有时会发生变化、但没有什么不好的、最坏的读取电压为 3.0V。 但 SOC0 始终不变、只有 2.5V 有时是 0xfff、其他 0x000 或一个随机值。 我没有,如果它是引脚,也许我放了很多电压一次,它破坏了它,我改变了引脚,但另一个也是随机在数字之间或 0xfff。

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

    尝试将 SOC0 移动到其他通道。  SOC0 的电压源是什么、是否有与源(如 RC)相关的阻抗?  如果有、则必须在采样保持时间设置中将其考虑在内。  这将在 SysConfig SOC 设置中提供。  需要填写源电阻和电容、SysConfig 将确定输入电压稳定所需的采样时间。

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

    这是硬件问题。 我在 VREFHI 和 VREFLO 之间有电容器、但忘记将 VREFLO 连接到 GND。 我的错。 谢谢你的帮助,我为我的错误道歉。