[技术问答]

ML51 IAR: ADC 输出始终是0xFFF

[复制链接]
2264|26
手机看帖
扫描二维码
随时随地手机跟帖
superdos|  楼主 | 2019-10-24 18:06 | 显示全部楼层 |阅读模式
多数模块用Nuvoton提供的参考代码就可以调试通过了。但是ADC一直工作不正常。

1. 使用VREF(1.538V)作为参考电压。
2. 根据手册的要求,当VREF用作内部参考电压时,在VREF pin上加了1uF电容。
2. ADC single mode。
3. 要测量的信号大概1.12V左右。

但是结果ADCRH一直是0xFF,ADCRL一直是0x0F。而且不管怎么设置,VRFCON的值读出来一直是0x00。也不知道VRFCON有没有在正常工作。

不知道哪位有过类似的经历?

代码在Nuvoton参考代码ADC_Simple基础上改的。代码本身没有对VREF的设置,加上了这部分。

    VREF_Open(LEVEL1);
    ENABLE_VREF_1538MV;
   
    ENABLE_ADC_AIN4;
  
    SFRS = 0;
    ADCCON1|=0x20;
    ADCCON2|=0x0E;
                                                                                                                                                
    while(1)
    {
    clr_ADCCON0_ADCF;
    set_ADCCON0_ADCS;

    while(ADCCON0&0x80 == 0);
    ADCdataH = ADCRH;
    ADCdataL = ADCRL;

    };

使用特权

评论回复
jasontu| | 2019-10-25 08:08 | 显示全部楼层
VREF 最低需1.8V.
Capture.JPG

使用特权

评论回复
dongnanxibei| | 2019-10-25 10:31 | 显示全部楼层
这参考电压,太低了,没法驱动。

使用特权

评论回复
dongnanxibei| | 2019-10-25 10:31 | 显示全部楼层
另外楼主的电路应该至少3V供电的吧,怎么搞这么低的参考,不科学。

使用特权

评论回复
superdos|  楼主 | 2019-10-25 11:17 | 显示全部楼层
dongnanxibei 发表于 2019-10-25 10:31
另外楼主的电路应该至少3V供电的吧,怎么搞这么低的参考,不科学。

感谢回复!

我给VREF上供了3.0V,不去enable VRFCON的ENVRF位,现在能采样到数据了。
但我还是不太理解,所谓的internal analog reference voltage到底指的是什么?我的理解是,用作internal reference时,VREF不需要外接电压,而是ML51内部产生一个参考电压提供给ADC用。在这种情况下,VREF pin需要外接一个1uF电容。
是这样吗?还是我理解错了?

谢谢!

使用特权

评论回复
dongnanxibei| | 2019-10-25 20:02 | 显示全部楼层
525635db2e456d88a6.png

使用特权

评论回复
dongnanxibei| | 2019-10-25 20:04 | 显示全部楼层
设置ENVRF = 1,
这个要设置啊,才能使用内部。然后外部加个电容。

使用特权

评论回复
dongnanxibei| | 2019-10-25 21:20 | 显示全部楼层
363775db2f6b19fefd.png

使用特权

评论回复
dongnanxibei| | 2019-10-25 21:21 | 显示全部楼层
建议用BSP库函数,不要直接用寄存器那个。

使用特权

评论回复
dongnanxibei| | 2019-10-25 21:22 | 显示全部楼层
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: ML51 series ADC software trigger on shot demo code
//***********************************************************************************************************
#include "ML51.h"

/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main ()
{
  unsigned int ADCRESULT;
/*
For UART0 P0.5 TXD output setting
* include gipo.c in Library for GPIO mode setting
* include uart.c in Library Setting for UART0
*/
    MFP_P31_UART0_TXD;                              // UART0 TXD use P0.5
    P31_QUASI_MODE;                                 // set P0.5  as Quasi mode for UART0 trasnfer
    UART_Open(24000000,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
    ENABLE_UART0_PRINTF;  
/*
  ADCS to trig ADC convert
  * include adc.c in Library for ADC initial setting
*/  
    VREF_Reload(LEVEL1);
    VREF_Open(LEVEL1);
    ADC_Open(ADC_SINGLE,1);                                        //Enable ADC_CH4
    ADC_ConvertTime(3,7);
  
/* find ADC result in ADC interrupt*/
                                            
    while(1)
    {
        set_ADCCON0_ADCS;                           // Software trig adc start
        while((ADCCON0|CLR_BIT7)==CLR_BIT7);         // wait ADCF = 1;
        ADCRESULT = (ADCRH<<4)+ADCRL;
        printf("\n ADC result = 0x%X  ", ADCRESULT);
        Timer0_Delay(24000000,100,1000);
    }
  
}

使用特权

评论回复
xuanhuanzi| | 2019-10-26 21:01 | 显示全部楼层
这个要掌握好手册里介绍的结构。

使用特权

评论回复
xuanhuanzi| | 2019-10-26 21:24 | 显示全部楼层
ML系列的提供的有库函数版本,

使用特权

评论回复
玛尼玛尼哄| | 2019-10-27 00:06 | 显示全部楼层
没做对,楼主解决好了没,这个开发还是比003方便的。

使用特权

评论回复
viva911| | 2020-3-23 11:04 | 显示全部楼层

直接用官方这个示例工程也是无法正常输出的

楼主已经调用了同样的函数 VREF_Open( );

我认为是芯片自身Bug,实际只能接外部参考电压操作ADC

坛子里有新唐工作人员吗,,可以帮忙验证一下

使用特权

评论回复
jasontu| | 2020-3-24 07:56 | 显示全部楼层
sample code path
/SampleCode/StdDriver/ADC_InternalVref

拿ml51 nutiny , L1電感移除。
跑sample code,量32pin vref,可以輸出1.9V
ADC輸入腳為p2.4
讀adcresult變數即可
test.JPG

使用特权

评论回复
viva911| | 2020-3-26 10:14 | 显示全部楼层
jasontu 发表于 2020-3-24 07:56
sample code path
/SampleCode/StdDriver/ADC_InternalVref

十分感谢工作人员给予回复这就换用32-Pin演示板验证……之前的测试是在 28-Pin ML51E 上进行的

使用特权

评论回复
HuangHongLun| | 2020-3-26 23:02 | 显示全部楼层
跑官方的例程也是这样的吗?官方回复用的是繁体字,果然是台湾同胞。

使用特权

评论回复
viva911| | 2020-3-27 17:15 | 显示全部楼层
HuangHongLun 发表于 2020-3-26 23:02
跑官方的例程也是这样的吗?官方回复用的是繁体字,果然是台湾同胞。

嗯,哈哈哈,原厂大神

使用特权

评论回复
viva911| | 2020-3-27 17:22 | 显示全部楼层
jasontu 发表于 2020-3-24 07:56
sample code path
/SampleCode/StdDriver/ADC_InternalVref

经过验证,相同的程序设置,

在 32-Pin 封装 ML51P 第32脚 上可以测量得到 2.049V(标称挺准的 ^_^);

但在 28-Pin 封装 ML51E 对应 第11脚 测量始终无输出…………可能部分型号Bug了

使用特权

评论回复
darklighttt| | 2020-3-29 22:39 | 显示全部楼层
viva911 发表于 2020-3-27 17:22
经过验证,相同的程序设置,

在 32-Pin 封装 ML51P 第32脚 上可以测量得到 2.049V(标称挺准的 ^_^);

也有可能是芯片什么的损坏了,部分型号的bug这个倾向于没有。

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝