我在使用TM4C123G launchpad的时候,想使用ADC内部的数字比较器的功能,我设置比较器为中值带模式,现在实验结果是能正常的触发比较器中断,但是我想在这个中断中读取ADC的采样值,但是ROM_ADCSequenceDataGet函数返回的一直是0,是不是TIVA数字比较器不能这样操作,只能进行比较判断。
看这副ADC的结构图,数据同时传进了比较器与FIFO,所以我自己猜测应该是可以取到这个值的,有没有做过的高手指点一下,实在不行的话我只能再把ADC切回采样模式,重新采一次值这样来回切换了。
xyz549040622:
在中断中直接看ADC结果寄存器中的值,看看可不可以取到。手册上好像真没说这个东东
tanxiaoyao:
回复 xyz549040622:
按照您所说的,发现使用不同的电压值触发中断寄存器值始终没变,一直为100000100000,我设置了断点自动刷新,发现每次中断都只有图2中所示的3个寄存器值有变化,这三个基本都是中断标志位,与采样结果没有关系。。。
xyz549040622:
回复 tanxiaoyao:
看来,这个结果是不会放在中断寄存器中的,自动比较了。
tanxiaoyao:
回复 xyz549040622:
这两天又重新折腾了一下这个东西,我重新下载了芯片的英文手册,发现了这么一段话:
ADC conversions can either be stored in the ADC Sample Sequence FIFOs or compared using thedigital comparator resources
这个词表明这两条路径只能二选一了,我一直参照的是另一款TM4C123的中文手册,中文翻译没有体现出这个,原文如下:
“取决于 ADC 采样序列 n 操作 (ADCCSOPn) 寄存器中的 SnDCOP 位的设置,ADC 转换结果可以保存到 ADC 采样序列 FIFO 中,也可以供给数字比较器进行比较。”
也字换成“或者”应该就意思明确了,然后我继续实验,使用下面的代码对同一个通道多次采样:
ROM_ADCSequenceStepConfigure(ADC0_BASE, key_sequence, 0, ADC_CTL_CH0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, key_sequence, 0, ADC_CTL_CH0 | ADC_CTL_CMP0);
ROM_ADCSequenceStepConfigure(ADC0_BASE, key_sequence, 0, ADC_CTL_CH0 | ADC_CTL_END);
这个的结果是在进入中断后成功采样到了触发中断的电压值,但是惊讶的发现,采样结果有一个周期的延迟,比如我分别用1V,1.5V,3V,2V,1V这样的序列触发,中断里采到的是RANDOM,1V,1.5V,3V,2V,我是想用ADC的这个特性做一个按键电压判断,这样一来本次触发得到的都是上一个按键的值,这导致按键功能完全没法实现,翻阅手册暂时没有看到这方面的描述,但是偶然中我发现驱动库函数手册ADCComparatorReset()函数介绍里面是这样写的:
“Because the digital comparator uses current and previous ADC values, this function allows the comparator to be reset to its initial value to prevent stale data from being used when a sequence is enabled.”
使用了前一次和本次的采样值?是怎样使用的?是否这就是产生延迟的原因?
感觉追踪到这已经超出手册所能提供的支持范围了,不知道有没有对这个具体细节了解的大大,希望看到了能不吝指教,虽然用曲线救国的方法在ADC比较中断后马上切回普通采样模式也能在按键没松开的时间段内采到按键值,但是我很看好这个功能,要是能直接采到就完美了。希望有共同关注这个问题的朋友<_>
xyz549040622:
回复 tanxiaoyao:
不知道楼主验证的咋样了,由于手头没有板子了,也无法验证。在涉及到细微功能的时候,还是以英文的手册为准,因为那个一般是最新版本的,而中文的翻译版是很早的版本。