主题中讨论的其他器件: SysConfig
工具与软件:
尊敬的 TI:
我正在尝试使用比较器输出来触发 ADC 采样。 此部件正常工作。 但我需要在应用期间的特定时间禁用采样功能。 当重新启用采样回时、ADC 对不正确的结果进行采样。
以下是如何在 LP-MSPM0L1306上复制此问题。
SysConfig (请参阅随附的照片):
使用 PWM 在 PA3上生成1kHz、50%占空比方波
设置比较器、以将 PA26用作正输入、内部电压基准作为负输入。 使用 DL_COMP_EVENT_OUTPUT_EDGE 生成事件信号以触发 ADC
将 ADC 设置为事件触发器、单次转换、禁用重复模式、对 PA15进行采样
连接到比较器正输入和 ADC 通道。




将板载 PA3、PA15、PA26连接在一起
在调试模式下运行附加的代码、该代码应在5秒后停止、ADC_RAW 缓冲区将填充3300。 这是正确的、因为当 ADC 采样时、PWM 处于逻辑高电平。
#include "ti_msp_dl_config.h"
#include "main.h"
volatile uint16_t adc_raw[32];
volatile uint8_t debugCnt=0;
void record_ADC_res(){
uint16_t res = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
adc_raw[debugCnt]=res*3300/1023;
debugCnt++;
if(debugCnt>=32) {
debugCnt=0;
__BKPT();
}
}
bool adcTriggered=false;
int main(void)
{
SYSCFG_DL_init();
for(uint16_t i=0;i<5000;i++){
delay_cycles(32000);//1ms delay
}
DL_COMP_enableEvent(COMP_0_INST, (DL_COMP_EVENT_OUTPUT_EDGE));
DL_ADC12_enableConversions(ADC12_0_INST);
NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
while (1) {
if(adcTriggered){
adcTriggered=false;
record_ADC_res();
//DL_COMP_disableEvent(COMP_0_INST, (DL_COMP_EVENT_OUTPUT_EDGE));
//delay_cycles(32*1500);
//DL_COMP_clearEventsStatus(COMP_0_INST, (DL_COMP_EVENT_OUTPUT_EDGE));
//DL_COMP_enableEvent(COMP_0_INST, (DL_COMP_EVENT_OUTPUT_EDGE));
DL_ADC12_enableConversions(ADC12_0_INST);
}
}
}
void ADC12_0_INST_IRQHandler(void)
{
switch(DL_ADC12_getPendingInterrupt(ADC12_0_INST))
{
case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
adcTriggered=true;
break;
}
}
然后、取消"delay_cycles (32*1500);"的注释。 这会模拟禁用采样、因为只有在这个延迟之后才会启用 ADC 转换。
当运行代码时、您可以看到结果有时会变为逻辑0。

我的问题是:
- 是什么导致 ADC 采样的值错误?
- 如何正确配置 ADC、比较器或事件、以便在 重新启用采样后采样结果仍然正确
请注意、我无法使用 PWM 来触发 ADC、因为 PWM 只是为了模拟外部信号、以便于排除故障。
我使用的是 CCS 12.8.1、SysConfig 1.21.0、SDK 2.2.0.05
感谢您的及时响应。 谢谢!


