打印
[牛人杂谈]

新唐MINI51 ADC模块初始化设置及应用

[复制链接]
3137|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heisexingqisi|  楼主 | 2016-6-7 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "Register_Bit.h"   //包含位定义文件   


//ADC通道号定义  
#define     ADC_Chanel0         (uint8_t)CHEN0  
#define     ADC_Chanel1         (uint8_t)CHEN1  
#define     ADC_Chanel2         (uint8_t)CHEN2  
#define     ADC_Chanel3         (uint8_t)CHEN3  
#define     ADC_Chanel4         (uint8_t)CHEN4  
#define     ADC_Chanel5         (uint8_t)CHEN5  
#define     ADC_Chanel6         (uint8_t)CHEN6  
#define     ADC_Chanel7         (uint8_t)CHEN7  

#define     ADC_IEN_ENB         ADCR |= ADIE; NVIC_ISER |= ADC_INT   
#define     ADC_IEN_DIS         ADCR &= ~ADIE; NVIC_ISER &= ~ADC_INT   


//*************************************  
// 函数名称:Init_Adc  
// 函数功能:adc初始化  
// 入口参数:无  
// 出口参数:无  
//***************************************/  
void Init_Adc(void)  
{  
//ADC输入时钟除频    器分频 12M/2 = 6M  ADC最大频率为6M  
     uint8_t Tmp = 2 ;  

     /* Reset ADC IP */      
     IPRSTC2 |= ADC_RST;  
     IPRSTC2 &= ~ADC_RST;  

     /* ADC engine clock enable */         
     APBCLK |= ADC_CLKEN;  
     CLKSEL1 = CLKSEL1 & (~ADC_CLK) | ADC_12M_32K;  

     /* Set ADC divisor */  
//    CLKDIV |= 0x00050000;   
     Tmp = Tmp - 1 ;  
     CLKDIV = (CLKDIV & (~(255<<16))) | (Tmp<<16) ;   

     /* ADC enable */  
     ADCR |= ADEN;  

     /* Set the ADC channel */  
//    ADCHER |= CHEN0;  

     /* Clear the A/D interrupt flags for safe */  
     ADSR |= ADF;     //写1清除AD转换结束标志  

     ADC_IEN_DIS ; //AD中断不使能  
//  ADC_IEN_ENB ;   
}  
//*************************************  
// 函数名称:ADC_IoInit  
// 函数功能:ADC IO 初始化  
// 入口参数:无  
// 出口参数:无  
//***************************************/  
void ADC_AN0IoInit(void)  
{  
     /* Configure P5.3 as analog input pin */  
     P5_MFP = (P5_MFP & (~P53_MFSEL)) | P53_AIN0;  
     /* Disable P5.3 digital input path */  
     P5_OFFD |= OFFD3;  
     /* Configure P5.3 as input mode */  
     P5_PMD = P5_PMD & (~Px3_PMD) | Px3_IN;   
}  
//=====通道1 IO ============  
void ADC_AN1IoInit(void)  
{  
     /* Configure P1.0 as analog input pin */  
     P1_MFP = (P1_MFP & (~P10_MFSEL)) | P10_AIN1;  
     /* Disable P1.0 digital input path */  
     P1_OFFD |= OFFD0;  
     /* Configure P1.0 as input mode */  
     P1_PMD = P1_PMD & (~Px0_PMD) | Px0_IN;   
}  
//*************************************  
// 函数名称:ADC_Switch  
// 函数功能:ADC 通道转换使能  
// 入口参数:无  
// 出口参数:无  
//***************************************/  
uint16_t ADC_Switch(uint8_t Chanel)  
{  
     uint16_t   u16Tmp = 0 ;  

     ADCR &= ~ADST;    //清启动位  
     /* Set the ADC channel */  
     ADCHER = (ADCHER & (~(255))) | Chanel ;  
     /* StartADC */  
     ADCR |= ADST;   
//      P00_ON ;  
     while((ADSR & ADF)==0) ; //等待AD转换结束   
//      P00_OFF ;  
     ADSR |= ADF ;   //写1清除AD转换结束标志  

     u16Tmp = (uint16_t)(ADDR0 & 0x000003FF);      

     return  u16Tmp ;  
}  



//----实例应用-----  

     Init_Adc() ; //ADC初始化设置  
     ADC_AN0IoInit() ; //通道0 IO设置  
     ADC_AN1IoInit() ; //通道1 IO设置  

//---主程序-----  
void main(void)  
{  
     while(1)  
     {  
         while(!F_10MS); //10MS跑一次主程序  
         F_10MS = 0 ;  

         g_u16Tmp = ADC_Switch(ADC_Chanel0) ; //转换通道0      

     }  

}  

沙发
heisexingqisi|  楼主 | 2016-6-7 17:33 | 只看该作者

SmartMcu-基础实验ADC.zip (210.63 KB)



使用特权

评论回复
板凳
heisexingqisi|  楼主 | 2016-6-7 17:35 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvUART.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvADC.h"
void Delay(int count)
{
    while(count--)
    {
        __NOP;
    }
}
int main (void)
{
    /* 配置 GPIOA.0 脚 功能口为  ADC0 */
    DrvGPIO_InitFunction(E_FUNC_ADC0);
    /* ADC 时钟源 = HIRC (22.1184 MHz), 单端模拟输入模式 */
    DrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_CYCLE_OP, 1, INTERNAL_HCLK, 0);
    ADC->ADSR.ADF  = 1;                 // 保险起见,清除A/D转换结束标志
    ADC->ADCR.ADIE = 1;
    ADC->ADCR.ADST = 1;                 // 开始A/D转换
    while(1)
    {
        while(ADC->ADSR.ADF==0);
        ADC->ADSR.ADF=1;                // 清除A/D转换结束标志
        printf("%d\n\r",ADC->ADDR[0].RSLT);

        // 计算实际A/D转换值
        printf("%f\n\r",(float)(ADC->ADDR[0].RSLT-2200)/(float)1600);
        Delay(60000);
        Delay(60000);
        Delay(60000);
        ADC->ADCR.ADST=1;               // 重新开始A/D转换
    }
}






使用特权

评论回复
地板
heisexingqisi|  楼主 | 2016-6-7 17:36 | 只看该作者

    
文件信息
  
    
概要
      
使用ADC转换出输入端对应数据
  
    
适用范围
      
NUC100 系列
  



    
目录
  
    
                  
  



1      简述
使用ADC转换出输入端的电压值, 再经由转换公式获取实际对应的数据.


1.1     环境需求与设定
  • 需搭配NUC100SeriesBSP_CMSIS_V1.05.003 (可至新唐公司网站下载 , http://www.nuvoton.com/NuvotonMOSS/Community/ProductInfo.aspx?tp_GUID=4b47b09d-b116-4ccd-aa85-31e261a87d30), 将此范例放至\\NuvotonPlatform_Keil\Sample\Driver目录下.
  • 需要使能SEMIHOST功能, 经由KEIL Serial Windows打印信息
  • 脚位连接:
    • GPIOA.0à 待测模块的输出电压端




1.2     芯片设定
  • HCLK =HIRC (22.11884 MHz)
  • GPIOA.0配置成ADC模式
  • ADC设定:
    • ADC 时钟源 = HIRC (22.1184 MHz)
    • 单端输入方式
    • 单次循环扫描模式



2      程序介绍

2.1     Main 函数
初始化ADC, 设置成单端输入模式与单次循环模式

    /* 配置 GPIOA.0 功能口为  ADC0 */
    DrvGPIO_InitFunction(E_FUNC_ADC0);
    /* ADC 时钟源 = HIRC (22.1184 MHz), 单端模拟输入模式 */
    DrvADC_Open(ADC_SINGLE_END,ADC_SINGLE_CYCLE_OP, 1, INTERNAL_HCLK, 0);
    ADC->ADSR.ADF  = 1;                 // 保险起见,清除A/D转换结束标志
    ADC->ADCR.ADIE = 1;



待ADC转换完成, 读取出ADC转换后的值. 再通过转换公式, 计算出实际的对应值, 然后重复上述动作.

此范例的转换公式为: 计算结果= (ADC转换值 –2200) / 1600

        while(ADC->ADSR.ADF==0);
        ADC->ADSR.ADF=1;                // 清除A/D转换结束标志
       printf("%d\n\r",ADC->ADDR[0].RSLT);
        // 计算实际A/D转换值
       printf("%f\n\r",(float)(ADC->ADDR[0].RSLT-2200)/(float)1600);
        Delay(60000);
        Delay(60000);
        Delay(60000);
        ADC->ADCR.ADST=1;               // 重新开始A/D转换



3     运行结果
KEIL 串行 串口所打印出的信息, 分别显示出ADC转换后的数据以及再通过公式转换后的数据.

显示结果如下:

                              



    
版本历史
      
  
    
Revision
      
Date
      
Description
  
    
1.00
      
Aug. 15, 2013
      
初始发布.
  



Important Notice



Nuvoton products arenot designed, intended, authorized or warranted for use as components insystems or equipment intended for surgical implantation, atomic energy controlinstruments, airplane or spaceship instruments, transportation instruments,traffic signal instruments, combustion control instruments, or for otherapplications intended to support or sustain life. Furthermore, Nuvoton productsare not intended for applications wherein failure of Nuvoton products couldresult or lead to a situation wherein personal injury, death or severe propertyor environmental damage could occur.

Nuvoton customersusing or selling these products for use in such applications do so at their ownrisk and agree to fully indemnify Nuvoton for any damages resulting from suchimproper use or sales.



Pleasenote that all data and specifications are subject to change without notice. Allthe trademarks of products and companies mentioned in this datasheet belong totheir respective owners.

文件信息.pdf (633.99 KB)



使用特权

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

本版积分规则

131

主题

2604

帖子

2

粉丝