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.

[参考译文] TMS570LS1224:Hercules ADC -多通道的单个呼叫读取

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1440453/tms570ls1224-hercules-adc---single-call-read-of-multiple-channels

器件型号:TMS570LS1224
主题中讨论的其他器件:HALCOGEN

工具与软件:

尊敬的社区:

我有以下适用于 Hercules ADC 的 HALCoGen 配置... 正如预期的那样、图像中选择的引脚会影响 s_adcSelect[2U][3U]的值:

然后,我正按照官方的例子,建议:

Fullscreen
1
2
3
adcStartConversion(adcREG1, adcGROUP1);
while(!adcIsConversionComplete(adcREG1, adcGROUP1));
adcGetData(adcREG1, adcGROUP1, &adc_data);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


adcStartConversion 生成的代码使用2d 数组(s_adcSelect)、这使我认为所有已配置的通道都可以在一次调用中处理。 我想这可以生成 ADC 序列发生器 跳过所有选定通道、并将结果保存到键值对样式的某个数组中( PinID 转换后的值)。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void adcStartConversion(adcBASE_t *adc, uint32 group)
{
uint32 index = (adc == adcREG1) ? 0U : 1U;
/* USER CODE BEGIN (7) */
/* USER CODE END */
/** - Setup FiFo size */
adc->GxINTCR[group] = s_adcFiFoSize[index][group];
/** - Start Conversion */
adc->GxSEL[group] = s_adcSelect[index][group];
/** @note The function adcInit has to be called before this function can be used. */
/* USER CODE BEGIN (8) */
/* USER CODE END */
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

然而、在 adcGetData 实现中、我没有看到对通道(引脚)有任何迭代、仅在 FIFO 大小上出现了迭代(至少我可以观察到这个情况 UINT32计数  将变量设置为等于 HALCoGen 中配置的 FIFO 大小):

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uint32 adcGetData(adcBASE_t *adc, uint32 group, adcData_t * data)
{
uint32 i;
uint32 buf;
uint32 mode;
uint32 index = (adc == adcREG1) ? 0U : 1U;
uint32 intcr_reg = adc->GxINTCR[group];
uint32 count = (intcr_reg >= 256U) ? s_adcFiFoSize[index][group] : (s_adcFiFoSize[index][group] - (uint32)(intcr_reg & 0xFFU));
adcData_t *ptr = data;
/* USER CODE BEGIN (16) */
/* USER CODE END */
mode = (adc->OPMODECR & ADC_12_BIT_MODE);
if(mode == ADC_12_BIT_MODE)
{
/** - Get conversion data and channel/pin id */
for (i = 0U; i < count; i++)
{
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

即使仅设置时也是如此 通道6 作为一个有源缓冲区(Launchpad 上的光晶体管连接在此处)、我得到 adcData_t->id 字段为零:

Fullscreen
1
2
3
4
5
6
7
8
adcStartConversion(adcREG1, adcGROUP1);
while(!adcIsConversionComplete(adcREG1, adcGROUP1));
adcGetData(adcREG1, adcGROUP1, &adc_data);
printf("Pin: %u ADC: %u\n", adc_data.id, adc_data.value);
And below is my printf log:
Pin: 0 ADC: 806
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我的问题是:考虑到 API 的架构、是否可以向 ADC 发送单个"调用"并让序列发生器跳过每个选定通道并返回每个通道的 PinID-AdcValue (如果可能、使用 HALCoGen 配置中的实际引脚 ID)?

谢谢!

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

    您好、Varban、

    如果您希望转换结果中包含信道编号、那么您应该启用以下选项:

    有关更多详细信息、我建议您参阅以下 ADC 示例:

    首先浏览 HALCoGen 中的"帮助主题"部分:

    现在、浏览示例部分、在那里可以找到 ADC 显示示例:

    基本上、在本示例中、他们给出了使用单次触发来转换两个通道的分步过程和代码、并读取这两个通道并通过 UART 显示值。

    您可以参考以下示例代码、了解他们如何从 FIFO 读取通道 ID 和转换后的数据、以及如何提取相应的数据。

    如果您需要更多示例、也可以参阅以下常见问题解答:

    (+)[常见问题解答] TMS570LC4357:适用于 Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    ——
    谢谢、此致、
    Jagadish。

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

    非常感谢  Jagadish!