完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我在使用TM4C123G launchpad的时候,想使用ADC内部的数字比较器的功能,我设置比较器为中值带模式,现在实验结果是能正常的触发比较器中断,但是我想在这个中断中读取ADC的采样值,但是ROM_ADCSequenceDataGet函数返回的一直是0,是不是tiVA数字比较器不能这样操作,只能进行比较判断。
看这副ADC的结构图,数据同时传进了比较器与FIFO,所以我自己猜测应该是可以取到这个值的,有没有做过的高手指点一下,实在不行的话我只能再把ADC切回采样模式,重新采一次值这样来回切换了。 |
|
相关推荐
6个回答
|
|
在中断中直接看ADC结果寄存器中的值,看看可不可以取到。手册上好像真没说这个东东
|
|
|
|
按照您所说的,发现使用不同的电压值触发中断寄存器值始终没变,一直为100000100000,我设置了断点自动刷新,发现每次中断都只有图2中所示的3个寄存器值有变化,这三个基本都是中断标志位,与采样结果没有关系。。。 |
|
|
|
weierda 发表于 2018-6-7 03:43 看来,这个结果是不会放在中断寄存器中的,自动比较了。 |
|
|
|
这两天又重新折腾了一下这个东西,我重新下载了芯片的英文手册,发现了这么一段话: ADC conversions can either be stored in the ADC Sample Sequence FIFOs or compared using the digital 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比较中断后马上切回普通采样模式也能在按键没松开的时间段内采到按键值,但是我很看好这个功能,要是能直接采到就完美了。希望有共同关注这个问题的朋友<_> |
|
|
|
weierda 发表于 2018-6-7 04:09 不知道楼主验证的咋样了,由于手头没有板子了,也无法验证。在涉及到细微功能的时候,还是以英文的手册为准,因为那个一般是最新版本的,而中文的翻译版是很早的版本。 |
|
|
|
ljmlvmd 发表于 2018-6-7 04:22 现在我是确实没办法直接得到,然后采用的是折中的办法,先用比较器检测到后切回软件触发重新采样然后再切换到比较器模式,由于速度比较快,这样并看不出来切换,实际用起来也是不错的。大致的代码如下,可以一起看看^_^ /****************************adc mode switch***********************************/void keyADCModeSet(uint8_t adcMode) [ switch (adcMode) [ case mode_init:// ROM_ADCSequenceDisable(ADC0_BASE, key_sequence); //暂时禁止ADC采样序列 //复位比较器 ROM_ADCComparatorReset(ADC0_BASE, 0, true, true); //绑定比较器 ROM_ADCSequenceStepConfigure(ADC0_BASE, key_sequence, 0, ADC_CTL_CH4 | ADC_CTL_CMP0 | ADC_CTL_END);// ROM_ADCIntEnable(ADC0_BASE, key_sequence);// ROM_ADCIntClear(ADC0_BASE, key_sequence); //清零中断标志 //设置触发 ROM_ADCSequenceConfigure(ADC0_BASE, key_sequence, ADC_TRIGGER_ALWAYS, 0); //配置AD采样序列,持续触发采样 ROM_ADCSequenceEnable(ADC0_BASE, key_sequence); //使能ADC_IN使用的采样序列 ROM_ADCComparatorIntEnable(ADC0_BASE, key_sequence); ROM_IntEnable(INT_ADC0SS0); break; case mode_samp: //重新配置AD采样序列,处理器触发采样 ROM_ADCSequenceDisable(ADC0_BASE, key_sequence); //暂时禁止ADC采样序列 ROM_ADCSequenceConfigure(ADC0_BASE, key_sequence, ADC_TRIGGER_PROCESSOR, 0); ROM_ADCSequenceStepConfigure(ADC0_BASE, key_sequence, 0, ADC_CTL_CH4 | ADC_CTL_IE | ADC_CTL_END); //接收产生中断信号 ROM_ADCSequenceEnable(ADC0_BASE, key_sequence); //重新开启采样序列 break; case mode_comp: ROM_ADCSequenceDisable(ADC0_BASE, key_sequence); //暂时禁止ADC采样序列 //重新绑定比较器 ROM_ADCSequenceStepConfigure(ADC0_BASE, key_sequence, 0, ADC_CTL_CH4 | ADC_CTL_CMP0 | ADC_CTL_END); //设置触发 ROM_ADCSequenceConfigure(ADC0_BASE, key_sequence, ADC_TRIGGER_ALWAYS, 0); //配置AD采样序列,持续触发采样 ROM_ADCSequenceEnable(ADC0_BASE, key_sequence); //使能ADC_IN使用的采样序列 break; default: break; ]]//init the hardware of key such as adc & gpiovoid initKeypad(void) [// 初始化设置ADC以及比较器模块 ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 64); //64位的硬件平均值滤波 ROM_ADCComparatorConfigure(ADC0_BASE, 0, ADC_COMP_TRIG_NONE | ADC_COMP_INT_MID_ONCE); //比较器中值带工作 //设置比较器门限 ROM_ADCComparatorRegionSet(ADC0_BASE, 0, 150, 3950);// 默认初始化模式 keyADCModeSet(mode_init);// 使能全局中断 ROM_IntMasterEnable();]/** * get the raw value of key adc */void keypadGet(uint32_t *keypad_value) [ ROM_ADCProcessorTrigger(ADC0_BASE, key_sequence); //处理器触发采样 while (!ROM_ADCIntStatus(ADC0_BASE, key_sequence, false)) //等待采样结束 [ ] ROM_ADCIntClear(ADC0_BASE, key_sequence); //清除中断标志 ROM_ADCSequenceDataGet(ADC0_BASE, key_sequence, keypad_value); //获取采样值]/********************************按键中断处理函数****************************/void keyIntHandler() [// led_1_on; //比较器中断处理 ROM_ADCIntClear(ADC0_BASE, key_sequence); //清除ADC中断标志 uint32_t DCStatus = ROM_ADCComparatorIntStatus( ADC0_BASE); ROM_ADCComparatorIntClear( ADC0_BASE, DCStatus); //清除比较器中断标志 //切换为采样模式 keyADCModeSet(mode_samp); //软件触发采样,等待返回 keypadGet(&keypad_value); //重新配置回比较器模式 keyADCModeSet(mode_comp); //键值处理 getKeyCode();// led_1_off;] |
|
|
|
只有小组成员才能发言,加入小组>>
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
563 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1013 浏览 1 评论
647 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
488 浏览 1 评论
1011 浏览 0 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
111浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
86浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
104浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
95浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
118浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-1 09:51 , Processed in 0.932697 second(s), Total 90, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号