打印
[微控制器/MCU]

LPC11C14 的AD转换结果与实际值相差比较大

[复制链接]
4844|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heng1386|  楼主 | 2011-3-6 08:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC在11个时钟,10位精度下工作,负载为电机,待测值为:70mv,VREF为:3.22mvAD0DR0应该为20到23,可实际上AD0DR0从10到30之间不断变化,每次AD转换的值都不同,这是为什么,难道LPC11C14的AD对mv的转换不行

  程序如下:

void ADCInit( uint32_t ADC_Clk )
{
  uint32_t i;
  LPC_IOCON->R_PIO1_0  = 0x02;  // ADC IN1 //
  LPC_IOCON->PIO1_11  = 0x01;  // ADC IN7 //
  
  LPC_SYSCON->PDRUNCFG &= ~(0x1<<4);
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13);
   for ( i = 0; i < 8; i++ ) //
    {
   ADCValue = 0x0;
    }
   //------------------------------硬件扫描模式------------------------------------------
   LPC_ADC->CR = ( 0x82 << 0 ) |  // SEL=1,select channel 0~7 on ADC0 ADC7
( ( SystemAHBFrequency / ADC_Clk - 1 ) << 8 ) |  // CLKDIV = Fpclk / 1000000 - 1  
( 1 << 16 ) |   // BURST = 0, no BURST, software controlled
( 1 << 17 ) |    // CLKS = 0, 11 clocks/10 bits   9/8 bit
( 0 << 24 ) |    // START = 0 A/D conversion stops
( 0 << 27 );  // EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion)
   //-------------------------------------------------------------------------------------
  return;
}

uint32_t ADCRead( uint8_t channelNum )
{
  uint32_t regVal=0, ADC_Data=0;
  
   if ( channelNum >= ADC_NUM )
   {
   channelNum = 0;
   }

  //------------------------------硬件扫描模式------------------
    while((LPC_ADC->DR[channelNum] & 0x80000000) == 0);
    regVal = LPC_ADC->DR[channelNum];
     if ( regVal & ADC_OVERRUN )
     {
  return ( 0 );
     }
     ADC_Data  = ( regVal >> 6 ) & 0x3FF;  
  //---------------------------------------------------------
  return ( ADC_Data );

}
ad1=0,ad7=0; adv=0;
  for(k=0;k<10;k++)
  {
    ad1 = ADCRead(7);
    ad7 = ad7 + ad1;
  }
  adv=ad7/10;

AD引脚上有3个分支,一是接到采样电阻上,以测量电流;二是接到74HC04反相器上;三是接了个5.6V的稳压管
在采样电阻之前是H桥电机电路

相关帖子

沙发
12812ty| | 2011-3-9 08:18 | 只看该作者
1# heng1386
待测值不是不能超过Vref的么
公式U=(valur/1024)×VREF    在11个时钟的情况下

使用特权

评论回复
板凳
12812ty| | 2011-3-9 08:19 | 只看该作者
另外请问遇到过这种情况的么?
https://bbs.21ic.com/frame.php?fr ... .com/iclist-17.html

使用特权

评论回复
地板
huzixian| | 2011-3-9 18:36 | 只看该作者
是你的程序有问题一定,或者是硬件电路的问题

使用特权

评论回复
5
heng1386|  楼主 | 2011-3-9 20:10 | 只看该作者
待测值很小,都不够100mv在电机空载的时候,  我用LED发光二极代替电机作H桥的负载时,经AD转换的值比实测值小,可是比较稳定,误差在,10mv左右,没有用电机作负载时AD转换的误差这么大

使用特权

评论回复
6
lo_xiaohua_ve| | 2011-5-7 11:45 | 只看该作者
也许和内部上拉有关,我的配置如下,测出来还是比较准的,希望对你有帮助
        /* Disable Power down bit to the ADC block.   ADC Power UP*/
        LPC_SYSCON->PDRUNCFG &= ~(0x1<<4);

        /* Enable AHB clock to the ADC. */
        LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13);

//#if        0
        //LPC_IOCON->JTAG_TDI_PIO0_11    &= ~0x9F; /* Clear bit7, change to analog mode. */
        //LPC_IOCON->JTAG_TDI_PIO0_11    |= 0x02;  /* ADC IN0 */
        LPC_IOCON->JTAG_TMS_PIO1_0   &= ~0x9F; /* Clear bit7, change to analog mode. */
        LPC_IOCON->JTAG_TMS_PIO1_0   |= 0x02;  /* ADC IN1 */
        LPC_IOCON->JTAG_TDO_PIO1_1   &= ~0x9F; /* Clear bit7, change to analog mode. */
        LPC_IOCON->JTAG_TDO_PIO1_1   |= 0x02;  /* ADC IN2 */
        LPC_IOCON->JTAG_nTRST_PIO1_2   &= ~0x9F; /* Clear bit7, change to analog mode. */
        LPC_IOCON->JTAG_nTRST_PIO1_2   |= 0x02;  /* ADC IN3 */
//#endif
        //LPC_IOCON->PIO1_11   &= ~0x9F; /* Clear bit7, change to analog mode. */
        //LPC_IOCON->PIO1_11   |= 0x02;  /* ADC IN7 */

        LPC_ADC->CR = ((SystemAHBFrequency / ADC_Clk - 1 ) << 8 );  /* CLKDIV = Fpclk / 1000000 - 1        */

#ifdef        ADC_TIME_DRIVER
        NVIC_EnableIRQ(ADC_IRQn);
        LPC_ADC->INTEN = 0x00F;                /* Enable all interrupts */

        LPC_ADC->CR &=        ~(( 0x01 << 17 ) | ( 1 << 18 ) | ( 1 << 19 )        |        /* CLKS = 0, 11 clocks/10 bits */
                                        ( 1 << 24 ) | ( 1 << 25 ) | ( 1 << 16 ));         /* START = 0 A/D conversion stops  BURST=0*/

        /*  Channel select CH-0,1,2,3,7, BURST = 1,  hardware controlled   26-24: 100 Timer320-MAT0 , 27:1 MAT0 Falling edge*/
        LPC_ADC->CR |= (( 0x1 << 1 ) | ( 1 << 2 ) | ( 1 << 3 ) | /*( 1 << 7 ) | */( 1 << 26 ) | (1<<27));                /*  ( 0x01 << 0 ) 定时器32-0的MAT0下沿时启动转换*/

使用特权

评论回复
7
ration| | 2011-5-7 22:52 | 只看该作者
读LPC1114 的AD转换值,必须去掉读出来的前两个值,不去的话,和真正的值会相差很大!去掉前两个值,然后再软件滤波,此时的结果就可以用“精确”来形容了!你可以试试!
http://ration.5d6d.com/thread-93-1-1.html

使用特权

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

本版积分规则

4

主题

125

帖子

2

粉丝