您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 技术讨论区 -> 请教一下bf506的adc采样模块
本帖共有1053个阅读者
发表帖子 发表投票 回复主题
请教一下bf506的adc采样模块
lauffer(论坛新手)
lauffer
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:157
积分:9
注册时间:2013/9/5
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
请教一下bf506的adc采样模块
你好:

我们板卡是根据官方ADI-BF506的EVM板画的,现在在调试AD采样的是后遇到一些问题:下面是原理图


上传的图片
  201312311012743.jpg [ 164.83 KB 1118×364 ] (缩略时请点击查看原图)

 


上传的图片
  201312311013543.jpg [ 53.50 KB 838×345 ] (缩略时请点击查看原图)

 


我的主要代码是参考的Power_On_Self_Test中的adc_test.c
已经把IF_I拉高到3.3v, 但是没有数据采集到?

能帮我看一下是什么原因吗?
谢谢

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/12/31 10:03:57
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
官方的板子运行AD采集时,需要使用SPORT接口读取数据,板卡上需要做跳线,不知你的图是否按跳线后画的。

BF506内部集成的AD是独立的,可以把它当做独立AD调试,你可以尝试读一些AD寄存器,看是否有数据。另外,BF506芯片下面有两个大焊盘,是需要连接的。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/12/31 13:00:31
lauffer(论坛新手)
lauffer
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:157
积分:9
注册时间:2013/9/5
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
Hi, Andy

谢谢你的快速回复,是按照跳线后画的,但原理图没有 http://www.openadsp.com/bbs/Topic.asp?id=1945&BoardID=3&TB=1 上面的模块,应该影响不大。

BF506芯片下面有两个大焊盘,是接地的,已连上。

1. 用示波器量信号,没有量到CS信号,

2. 怎么来读取一些AD寄存器?

谢谢支持


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/12/31 13:46:30
lauffer(论坛新手)
lauffer
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:157
积分:9
注册时间:2013/9/5
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你好

我们后来用其他的代码,没有用官方的代码,来实现了ADC的采集, 但是采集到的数据和实际的输入对不起来。
ADC_A和ADC_B,2个通道,ADC_A接入3.3v,ADC_B没有接信号。

代码如下:
        register_handler(ik_ivg9, Sport1_RX_ISR);
register_handler(ik_ivg10, EVENT_STATUS_INTERRUPT);
register_handler(ik_ivg12, Timer7_ISR);

*pSIC_IMASK0 = 0x00040000; /*DMA4 (SPORT1 RX); IVG9*/
*pSIC_IMASK1 = 0x00010080; /*ACM Interr upt,IVG10; Timer 7,IVG12*/

        *pPORTG_MUX = 0x0040;  

*pPORTG_FER |= PG5 | PG6 | PG7 | PG8 | PG9 | PG10 | PG11;

*pPORTH_FER |= PH0 | PH1 | PH2;

//Timer7 Config for trigger
*pTIMER7_CONFIG = PERIOD_CNT | PWM_OUT | PULSE_HI;// | IRQ_ENA;
*pTIMER7_PERIOD = 128;//Sampling freq = SCLK / Period
*pTIMER7_WIDTH = 5;

/****************************************************************/
/***WAVEFORM GENERATION USING TIMER0*****************************/
/****************************************************************/
*pPORTG_FER |= PG14;
*pPORTG_MUX |= 0x8000;
//Timer0 Config for trigger
*pTIMER0_CONFIG = PERIOD_CNT | PWM_OUT | EMU_RUN ;
*pTIMER0_PERIOD = 64000;
*pTIMER0_WIDTH = 32000;
*pTIMER_ENABLE = TIMEN0;

*pSPORT1_RCR2 = RXSE | SLEN(11);/* RX Secondary Enable */
*pSPORT1_RCR1 = RCKFE | LRFS | RFSR | 0x4;//Sign extended

T = 100;

N = 1;
*pACM_ET0 = 0;
*pACM_ER0 = 0x31;//single, 2Vref, channel 1

*pACM_TC1 = 0x200D;
*pACM_TC0 = 0x0001;//ADCLK = SCLK / 2/(CKDIV+1) = 31.25MHz

//Sport 1
//clk polarity falling edge
//active low CS
//rising edge for ACM-timer0
//ACM timer0 enabled with TMR7 external trigger
*pACM_CTL = 0x401A;

*pACM_CTL |= 0x01;//enable ACM
// *pDMA4_CONFIG |= DMAEN;//enable DMA4(sport1 rx)
*pSPORT1_RCR1 |= RSPEN;//enable sport1 rx
*pTIMER_ENABLE = TIMEN7;//enable timer7 for trigger

-------------------------------------------------------------------------------
采集到的数据是这样的:
Rx_Buffer_A[0]= 31f
Rx_Buffer_A[1]= 31f
Rx_Buffer_A[2]= 31f
Rx_Buffer_A[3]= 31f
Rx_Buffer_A[4]= 31e
Rx_Buffer_A[5]= 31e
Rx_Buffer_A[6]= 31e
Rx_Buffer_A[7]= 31e
Rx_Buffer_A[8]= 31e
Rx_Buffer_A[9]= 31e
Rx_Buffer_A[10]= 31e

Rx_Buffer_B[1]= fffff83e
Rx_Buffer_B[2]= fffff83e
Rx_Buffer_B[3]= fffff83e
Rx_Buffer_B[4]= fffff854
Rx_Buffer_B[5]= fffff854
Rx_Buffer_B[6]= fffff854
Rx_Buffer_B[7]= fffff854
Rx_Buffer_B[8]= fffff854
Rx_Buffer_B[9]= fffff854
Rx_Buffer_B[10]= fffff854

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/3 9:23:45
lauffer(论坛新手)
lauffer
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:157
积分:9
注册时间:2013/9/5
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
已调通,上述数据正确,代码可用!

解释下, 0x31f = 799, 799*2*2.5/4096 = 0.975     0.975+2.5 = 3.47 v
        0xffff83e&0FFF = 0x83e, 0x83e&0x7FF = 0x83,  ---> 131*2*2.5/4096 = 0.16  = 0v

over
                                                

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/6 11:45:14
lauffer(论坛新手)
lauffer
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:157
积分:9
注册时间:2013/9/5
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
Hi,

针对上面的代码,我能采集到数据,但是采样频率我还是没算出来,能帮我看看吗?

目前的设置: 400MHZ_CCLK_80MHZ_SCLK_20MHZ_RSI

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/8 13:27:43
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
采样频率通常是看SPORT接口采集数据的次数,你可以用示波器测量SPORT接口的同步信号线,通常一个同步信号会采集一个数据。另外我看你配置了定时器,不知道你是否为每次中断后进行数据采集,如果是那样,你的采样率就是中断的频率。你的系统时钟100M,定时器周期为
64000,则每秒会产生1562个中断,如果你是定时器中断后采集,采样率就是1.5K。如果你测采样率,不要打印,那样太慢,直接把数据写入大的buffer即可,然后再看采了多少。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/1/12 18:27:33
lauffer(论坛新手)
lauffer
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:157
积分:9
注册时间:2013/9/5
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
Hi, Andy

谢谢你的回复,我确实是用中断做的,我的CCLK = 400MHZ; SCLK = 80MHZ; RSI = 20MHZ;
再看数据手册的时候,对TIMERX_PERIOD 和TIMERX_WIDTH之间的关系不是很清楚。能帮我解释下吗?

按照你的描述,理论上我的采样率 = 400000/64 = 6250 ?





这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/13 22:37:27
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
周期指的是一个完整波形的时间。这个波形由波峰和波谷组成。
脉宽指的是波峰或者波谷的宽度,如你波形默认输出1,则脉宽就是产生的低电平的宽度,反之则为高电平宽度。在PWM模式时会使用到脉宽,如果你只用定时,配置一个比周期小的值就可以了,通常是1/2周期。
通用定时器是和系统时钟挂钩的,你的400M是内核时钟,只有内核定时器使用内核时钟。
你看一下你的PLL配置,如果是16,4 。则系统时钟为100M,计算定时器频率要用系统时钟计算。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/1/18 22:24:02
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154184 Call, 1 Queries, Processed in 0.047119 second(s),