打印
[ZLG-ARM]

今天问题比较多:)关于AD转换BURST的问题。

[复制链接]
3113|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
malaohu|  楼主 | 2007-9-12 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//利用查询方式,BURST转换获取AD转换值。

#include  "config.h"
uint32  ADC_Data;

//延时
void  DelayNS(uint32  dly)
{  uint32  i;
   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}


#define  UART_BPS    115200            /* 定义通讯波特率 */
//初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
void  UART0_Ini(void)
{    uint16  Fdiv;
    U0LCR = 0x83;                        // DLAB = 1,可设置波特率
    Fdiv = (Fpclk >> 4) / UART_BPS;      // 设置波特率
    U0DLM = Fdiv >> 8;                            
    U0DLL = Fdiv % 256;                        
    U0LCR = 0x03;
}
                
//向串口发送字节数据,并等待发送完毕。
void  UART0_SendByte(uint8 data)
{    U0THR = data;                 // 发送数据
    while( (U0LSR&0x40)==0 );            // 等待数据发送完毕
}

//ADC初始化
void ADC_Init(void)
{    ADCR =    (3 << 2)        |        // 选择通道AIN2,AIN3
    ((Fpclk / 10000 - 1) << 8)    |         // CLKDIV = Fpclk / 10000 - 1 ,即转换时钟为10KHz
    //如果这儿设定为11kHz的话,下面这样就得不到正确结果,看来这个时钟对芯片还是有影响的。
    (1 << 16)            |        // BURST = 1 ,硬件控制转换操作
    (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转换)
}


int  main(void)
{
    uint8    data[2];
   
    PINSEL0 = 0x00000005;                  // 设置P0.0、P0.1连接到UART0的TXD、RXD
    PINSEL1 = 0x14000000;                // 设置P0.29、P0.30连接到AIN2、AIN3
    UART0_Ini();                    // 初始化UART0
    ADC_Init();
      
    while(1)
    {    
        while( (ADDR&0x80000000)==0 );                // 等待转换结束
        ADC_Data = ADDR;                    // 读取ADC结果
        ADC_Data = (ADC_Data>>6) & 0x3FF;
    
        data[0] = ADC_Data >> 8;
        data[1] = ADC_Data;
        UART0_SendByte(data[0]);
        UART0_SendByte(data[1]);
       
        DelayNS(10);    
    }
       return(0);
}

//为什么串口发出的数不是A,B,A,B,A……这样的两个通道轮换采集的数,而是没有规律的两个通道的数?

相关帖子

沙发
malaohu|  楼主 | 2007-9-12 23:29 | 只看该作者

还有一个问题:)

如果done位不清零,比如不读ADDR,ADDR内的10位AD值会不会改变为下一次AD转换的值啊?

使用特权

评论回复
板凳
malaohu|  楼主 | 2007-9-13 19:52 | 只看该作者

谁能帮我解答一下:)

为什么不是按顺序发送ad采集的数值啊

使用特权

评论回复
地板
malaohu|  楼主 | 2007-9-21 20:44 | 只看该作者

无人关注……,我再顶

大虾们呢:(

使用特权

评论回复
5
zlgARM| | 2007-9-21 23:28 | 只看该作者

to malaohu

你的程序操作有问题,ADC使用burst模式的时候,硬件是自动扫描需要进行转换的通道(用户设定好)进行转换,转换是先转换同道号低的,再到高的;而读取结果应该先等待转换完成,接着读取低通道号的值,再等待下一次转换完成,再读取通道号高的。
建议使用中断方式实现burst模式的ADC。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

95

帖子

0

粉丝