打印
[技术问答]

M058S ADC转化问题

[复制链接]
4891|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bkn1860|  楼主 | 2014-3-13 17:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

代码如下:
void ADC_Init(void)
{
    P1->OFFD = (GPIO_OFFD_ENABLE(4)|GPIO_OFFD_ENABLE(5)|GPIO_OFFD_ENABLE(6)|GPIO_OFFD_ENABLE(7));//Disable digital input path to avoid the leakage current
    SYS->P1_MFP = SYS_MFP_P14_AIN4 | SYS_MFP_P15_AIN5 | SYS_MFP_P16_AIN6 | SYS_MFP_P17_AIN7 ;//Configure ADC analog input pins   
   
    P1->PMD = 0;
   
    // Set the ADC operation mode as single, input mode as single-end and enable the ADC converter
    ADC->ADCR = (ADC_ADCR_ADMD_SINGLE_CYCLE | ADC_ADCR_DIFFEN_SINGLE_END | ADC_ADCR_ADEN_CONVERTER_ENABLE | ADC_ADCR_TRGEN_DISABLE);//
    // Enable analog input channel 0 ~ 3
    ADC->ADCHER = 0xF0;

    // clear the A/D interrupt flag for safe
    ADC->ADSR = ADC_ADSR_ADF_Msk;   
    // Enable the ADC interrupt
    _ADC_ENABLE_ADC_INT();
    NVIC_EnableIRQ(ADC_IRQn);
}

INT16U wAdcResut = 0;
/*---------------------------------------------------------------------------------------------------------*/
/* ADC interrupt handler                                                                                   */
/*---------------------------------------------------------------------------------------------------------*/
void ADC_IRQHandler(void)
{   
    if(_ADC_IS_DATA_VALID(4)) // Check the VALID bits
    {
        wAdcResut = (uint16_t)_ADC_GET_CONVERSION_DATA(4);
        printf("Conversion result0: 0x%X\n", wAdcResut);      
    }
   
    if(_ADC_IS_DATA_VALID(5)) // Check the VALID bits
    {
        wAdcResut = (uint16_t)_ADC_GET_CONVERSION_DATA(5);
        printf("Conversion result1: 0x%X\n", wAdcResut);      
    }   
   
    if(_ADC_IS_DATA_VALID(6)) // Check the VALID bits
    {
        wAdcResut = (uint16_t)_ADC_GET_CONVERSION_DATA(6);
        printf("Conversion result2: 0x%X\n", wAdcResut);      
    }   
   
    if(_ADC_IS_DATA_VALID(7)) // Check the VALID bits
    {
        wAdcResut = (uint16_t)_ADC_GET_CONVERSION_DATA(7);
        printf("Conversion result3: 0x%X\n", wAdcResut);      
    }   

   
    ADC->ADSR = ADC_ADSR_ADF_Msk;      // clear the A/D conversion flag
}

在中断中读取转换的4个结果,全是0xFFF,AIN5我接入的是一个2.5V的电压
麻烦大家看一下设置有没有问题?
沙发
ZG11211| | 2014-3-13 19:20 | 只看该作者
接基准源没有?

使用特权

评论回复
板凳
ningling_21| | 2014-3-13 19:59 | 只看该作者
M052LAN,怎么下载程序?

使用特权

评论回复
地板
niuyaliang| | 2014-3-14 00:44 | 只看该作者
ningling_21 发表于 2014-3-13 19:59
M052LAN,怎么下载程序?

这个问题。。。有下载器就能下载

使用特权

评论回复
5
niuyaliang| | 2014-3-14 00:47 | 只看该作者
本帖最后由 niuyaliang 于 2014-3-14 00:58 编辑

楼主各种混合操作呀,我有几个疑问
1.楼主直接操作寄存器,我记得AD有转换时间的,记得要延时
2.中断里面放进printf了,会不会造成在中断中停留时间过长,而实际早就转换完毕的问题
3.说这么多都是废话,照着官方的例程修改肯定没错。。。

使用特权

评论回复
6
bkn1860|  楼主 | 2014-3-14 09:21 | 只看该作者
ZG11211 发表于 2014-3-13 19:20
接基准源没有?

新唐的M058S开发板,基准是连上的

使用特权

评论回复
7
bkn1860|  楼主 | 2014-3-14 09:24 | 只看该作者
niuyaliang 发表于 2014-3-14 00:47
楼主各种混合操作呀,我有几个疑问
1.楼主直接操作寄存器,我记得AD有转换时间的,记得要延时
2.中断里面放 ...

1.ADC中断是AD转换完毕才出发的,这个时候转换肯定完成了
2.printf只是用作串口看数据而已,两次AD转换中间有1S的时间
3.直接跑新唐的ADC例程转换结果也是全0xFFF

使用特权

评论回复
8
niuyaliang| | 2014-3-14 10:24 | 只看该作者
bkn1860 发表于 2014-3-14 09:24
1.ADC中断是AD转换完毕才出发的,这个时候转换肯定完成了
2.printf只是用作串口看数据而已,两次AD转换中 ...

跑例程也有问题,肯定是你的硬件问题吧,AD的所有电源,地,基准都接好了?上电路图

使用特权

评论回复
9
bkn1860|  楼主 | 2014-3-14 12:53 | 只看该作者
niuyaliang 发表于 2014-3-14 10:24
跑例程也有问题,肯定是你的硬件问题吧,AD的所有电源,地,基准都接好了?上电路图 ...

新唐研讨会送的板子,AD相关的我都测量过了

使用特权

评论回复
10
ZG11211| | 2014-3-14 20:32 | 只看该作者
没这么复杂吧,我也测试过MO58S开发板的ADC
/***************************************************************************************
描述 :  ADC初始化函数

****************************************************************************************/
void adc_init()
{   IPRSTC2 |= ADC_RST;                                    //复位ADC外设                 置1
    IPRSTC2 &= ~ADC_RST;                                   //ADC模块从复位状态恢复到正常工作状态   置0
    APBCLK  |= ADC_CLKEN;                                  //使能ADC时钟
    CLKSEL1  = CLKSEL1 & (~ADC_CLK) | ADC_12M;             //选择外部晶振作为ADC时钟源
    CLKDIV  |= 0x00050000;                                 //ADC时钟6分频
    ADCR    |= ADEN;                                       //使能ADC

    ADCALR |= CALEN;                                       //使能ADC自校验功能
    while(!(ADCALR & CALDONE));                            //等待校验完成

        ADCR     = ADCR & (~ADMD) | MD_SIG;        //设定AD转换器为单次模式              
    ADCR    &= ~DIFFEN;                        //设定AD模拟电压输入模式为单端输入
    P1_MFP   = P1_MFP & (~P10_AIN0_T2) | AIN0; //设置P1.0为ADC0模拟输入通道
   // P1_OFFD |= OFFD0;                          //禁止P1.0数字输入通道
   // P1_PMD   = P1_PMD & (~Px0_PMD) | Px0_IN;   //配置P1.0为输入功能
    ADSR    |= ADF;                            //开始转换前先清除ADC中断标志,防止中断意外触发      

}


/**********************************/
uint16_t adc_on(void)
{
        uint16_t adcn;
          ADCHER  = CHEN0;                          //使能模拟输入通道0
      ADCR |= ADST;                          //启动AD开始转换  
      while((ADSR&ADF) == 0);                //采用轮询模式等待AD转换完成
      ADSR |= ADF;                           //清除转换完成标志

     // adcn = (ADDR0&0xFFF);
        adcn = (ADDR0&0xFFF);        
   return adcn;
}

使用特权

评论回复
11
niuyaliang| | 2014-3-14 21:05 | 只看该作者
bkn1860 发表于 2014-3-14 12:53
新唐研讨会送的板子,AD相关的我都测量过了

你说,研讨会送的板子,配套原版的程序,放上去不运行,不是硬件错误是什么呀:lol

使用特权

评论回复
12
zxf0168| | 2014-3-16 10:44 | 只看该作者
niuyaliang 发表于 2014-3-14 21:05
你说,研讨会送的板子,配套原版的程序,放上去不运行,不是硬件错误是什么呀 ...

硬件错误?基本不大可能

使用特权

评论回复
13
wangch_sh| | 2014-7-8 08:52 | 只看该作者
我也试了,都是4095,搞不懂。

使用特权

评论回复
14
北斗stone| | 2014-8-19 10:02 | 只看该作者
我也遇到同样的问题,用的是M054的,ADC跑例程全是4095

使用特权

评论回复
15
HORSE7812| | 2014-11-6 10:46 | 只看该作者
mark

使用特权

评论回复
16
wlhnqwnjz| | 2014-11-13 10:22 | 只看该作者
请问楼主:M058LBN用什么型号板开发?

使用特权

评论回复
17
zxf0168| | 2014-11-14 11:25 | 只看该作者
wangch_sh 发表于 2014-7-8 08:52
我也试了,都是4095,搞不懂。

到底是怎么回事啊

使用特权

评论回复
18
wangch_sh| | 2014-11-14 11:53 | 只看该作者
搞不懂。这么长时间了,我也忘了怎么回事了。

使用特权

评论回复
19
mintspring| | 2014-11-15 23:21 | 只看该作者
干嘛不用提供的库函数,例子里没你这么复杂啊,直接调用初始化函数,别管底层

使用特权

评论回复
20
springvirus| | 2015-1-16 16:50 | 只看该作者
楼主解决了吗,后面计划用M058S的ADC

使用特权

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

本版积分规则

7

主题

278

帖子

4

粉丝