共2条
1/1 1 跳转至页
LPC2210,ADC,BURST 请教LPC2210中ADC的BURST转换模式问题。
问
拿到2200开发实验板有一段时间了,最近想试试ADC的BURST模式到底是怎么回事,但是运行起来问题多多。还望大家多指点一下啊~~~~:(
具体是这样的:设置开发板上的AIN0~1进入BURST模式,进行AD转换,我试图在中断处理程序中,用一个数组ADCData[ADCChannel]来保存ADDR的值。但是调试起来却很奇怪。用DebugInExRam模式,在中断处理程序的最后设置断点,然后全速运行。此时观察ADCData[ADCChannel]值,发现数组中保存的通道没有规律,就是ADCData[0]保存的有可能是通道0的值0xc0004dc0或者通道1的值0xc1009b00,ADCData[1]也一样。
如果在中断处理程序中不设置断点,程序全速运行,通道倒是对了,但结果更奇怪。ADCData[0]的值居然是0xc0009b00,ADCData[1]的值是0xc1009b00。而ADCChannel的值最后始终是1。
真是让我非常郁闷啊~~~~周工救我~~!
相关代码如下:
/****************************************************************************
* 名称:ADCIRQ()
* 功能:ADC中断服务程序函数
* 入口参数:无。
* 出口参数:无。
* 全局变量:ADCChannel ADC通道号
* ADCData[] ADC结果缓存数组
****************************************************************************/
void __irq ADCIRQ()
{
ADCData[ADCChannel] = ADDR; //读取AD转换结果
if ((++ADCChannel) > 1)
{
ADCChannel = 0; //恢复ADC通道为0
ADCR = ADCR & 0xFFFEFF03; //停止BURST模式
}
VICVectAddr = 0;
}
主函数中的ADC设置代码:
ADCR = (0x03 << 0) | // SEL = 0x03 ,选择通道0~1
((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟 为1MHz
(1 << 16) | // BURST = 1 ,启用BURST模式
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(0 << 24) | // START = 0 ,不软件启动ADC转换
(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换),未使用。 答 1: 自己顶ADDR中的24~26位,CHN是不是就是AD转换通道的指示?感觉应该是吧。《ARM与嵌入式系统基础教程》上面写的是:“这些位包含的是LS位的转换通道”。不清不楚的,应该是转换通道哦。
BURST模式到底怎么用?可以用中断读取结果嘛?大家给点意见吧 答 2: 请教请问BURST=1时,置 START = 0 ,不软件启动ADC转换 那么ADC如何启动?若置START=001可以启动否?这个ADC好伤脑筋啊!
具体是这样的:设置开发板上的AIN0~1进入BURST模式,进行AD转换,我试图在中断处理程序中,用一个数组ADCData[ADCChannel]来保存ADDR的值。但是调试起来却很奇怪。用DebugInExRam模式,在中断处理程序的最后设置断点,然后全速运行。此时观察ADCData[ADCChannel]值,发现数组中保存的通道没有规律,就是ADCData[0]保存的有可能是通道0的值0xc0004dc0或者通道1的值0xc1009b00,ADCData[1]也一样。
如果在中断处理程序中不设置断点,程序全速运行,通道倒是对了,但结果更奇怪。ADCData[0]的值居然是0xc0009b00,ADCData[1]的值是0xc1009b00。而ADCChannel的值最后始终是1。
真是让我非常郁闷啊~~~~周工救我~~!
相关代码如下:
/****************************************************************************
* 名称:ADCIRQ()
* 功能:ADC中断服务程序函数
* 入口参数:无。
* 出口参数:无。
* 全局变量:ADCChannel ADC通道号
* ADCData[] ADC结果缓存数组
****************************************************************************/
void __irq ADCIRQ()
{
ADCData[ADCChannel] = ADDR; //读取AD转换结果
if ((++ADCChannel) > 1)
{
ADCChannel = 0; //恢复ADC通道为0
ADCR = ADCR & 0xFFFEFF03; //停止BURST模式
}
VICVectAddr = 0;
}
主函数中的ADC设置代码:
ADCR = (0x03 << 0) | // SEL = 0x03 ,选择通道0~1
((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟 为1MHz
(1 << 16) | // BURST = 1 ,启用BURST模式
(0 << 17) | // CLKS = 0 ,使用11clock转换
(1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式)
(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)
(0 << 24) | // START = 0 ,不软件启动ADC转换
(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换),未使用。 答 1: 自己顶ADDR中的24~26位,CHN是不是就是AD转换通道的指示?感觉应该是吧。《ARM与嵌入式系统基础教程》上面写的是:“这些位包含的是LS位的转换通道”。不清不楚的,应该是转换通道哦。
BURST模式到底怎么用?可以用中断读取结果嘛?大家给点意见吧 答 2: 请教请问BURST=1时,置 START = 0 ,不软件启动ADC转换 那么ADC如何启动?若置START=001可以启动否?这个ADC好伤脑筋啊!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |