打印
[NUC120]

HOT大叔NUC120助学板第四贴----ADC小练

[复制链接]
6921|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swallow_0322|  楼主 | 2011-3-30 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 缥缈九哥 于 2012-9-14 12:07 编辑
/**************************************************
** 文件名称:NUC120_HOT_ADC.c
** 文件说明:NUC120助学板练习程序
** 创建日期:2011-03-30
** 修改日期:
** 备    注:ADC程序练习
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvUART.h"
#include "Driver\DrvADC.h"


#define  Run_Led  2                                 //2----LED1  3----LED2          4----LED3  5----LED4
#define  IDLE          0
#define  BUSY     1

uint8_t  ADC_Status = IDLE;
uint8_t  ADC_Cnt    = 0;

/***************
**  函数声明  **
***************/
void Init_System (void);
void Init_Uart (void);
void UART_INT_HANDLE(uint32_t u32IntStatus);


/*****************************
** Name:      UART_INT_HANDLE
** Function:  UART Callback function
** Input:     u32IntStatus
** OutPut:    None
** Data:      2011-03-17
** Note:      
****************************/
void UART_INT_HANDLE(uint32_t u32IntStatus)
{

        uint8_t bInChar[1]={0xFF};

        if(u32IntStatus & DRVUART_RDAINT)
        {
                /* Get all the input characters */
                while(UART0->ISR.RDA_IF==1)
                {
                        /* Get the character from UART Buffer */
                        DrvUART_Read(UART_PORT0,bInChar,1);

                        if ((ADC_Status==IDLE)&&(bInChar[0]<='9')&&(bInChar[0]>'0'))
                        {
                                ADC_Status = BUSY;
                                ADC_Cnt = (bInChar[0]-0x30);
                        }
                }
        }
}

/*****************************
** Name:      Init_System
** Function:  系统初始化函数
** Input:      None
** OutPut:     None
** Data:       2011-03-17
** Note:      
****************************/
void Init_System(void)
{
        /* Unlock the locked registers before access */
    UNLOCKREG(x);        //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
                                    //这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
        /* Enable the 12MHz oscillator oscillation */
        DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);                                                                //SYSCLK->WRCON.XTL12M_EN = 1;

        /* Waiting for 12M Xtal stable */
        //while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);                //SYSCLK->CLKSTATUS.XTL12M_STB
        /*eClkSrc  - [in]  E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL    */
        // Note: Only some of NuMicro NUC100 Series support this function.

        DrvSYS_Delay(5000);
        LOCKREG(x);
        //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
}

/*****************************
** Name:      Init_Uart
** Function:  UART初始化函数
** Input:      None
** OutPut:     None
** Data:       2011-03-17
** Note:      
****************************/
void Init_Uart(void)
{
        STR_UART_T param;
        /*
        声明 UART设置的结构体 位于DRVUART.H
        结构体如下
        typedef struct DRVUART_STRUCT
        {
                uint32_t            u32BaudRate;                        
                E_DATABITS_SETTINS  u8cDataBits;                        
                E_STOPBITS_SETTINS  u8cStopBits;                        
                E_PARITY_SETTINS         u8cParity;                                 
                E_FIFO_SETTINGS     u8cRxTriggerLevel;                 
                uint8_t             u8TimeOut ;                                 
      }STR_UART_T;
        */
        DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);                    //使能UART时钟
        //SYSCLK->CLKSEL1.UART_S = 0;                //UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器

        DrvGPIO_InitFunction(E_FUNC_UART0);                                                    //GPB_MFP0-1-2-3置位 GPIO使能UART功能
        //outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) | (0xF<<0));

        param.u32BaudRate        = 115200;                                                        //         波特率
        param.u8cDataBits        = DRVUART_DATABITS_8;                                //         数据位
        param.u8cStopBits        = DRVUART_STOPBITS_1;                                //         停止位
        param.u8cParity          = DRVUART_PARITY_NONE;                                //         校验位
        param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;                                //         FIFO存储深度 1 字节
        param.u8TimeOut                 = 0;                                                                //         FIFO超时设定
        /* Set UART Configuration */
        if(DrvUART_Open(UART_PORT0,&param) != E_SUCCESS)                        //         串口开启、结构体整体赋值
                printf("UART0 open failed\n");                                                
        /* u32Port -[in] UART Channel:  UART_PORT0 / UART_PORT1 /UART_PORT2        */
        /* sParam  -[in] the struct parameter to configure UART                         */   

        /* Enable Interrupt and install the call back function */
        DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT,UART_INT_HANDLE);
        /*u32Port                   -[in] UART Channel:  UART_PORT0 / UART_PORT1 / UART_PORT2                                               */
        /*u32InterruptFlag -[in] DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSINT                          */
        /*                                                                                DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT          */
        /*pfncallback      -[in] A function pointer for callback function                                                   */
}

int main (void)
{
        uint8_t test = 250;
        uint8_t tmp;
        uint32_t i32ConversionData;
        uint32_t i32ConversionData_Sum;
        uint8_t IsFirst = 1;
        
        Init_System();
        
        Init_Uart();

        DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT);                                  //程序运行指示
        DrvGPIO_ClrBit(E_GPA,Run_Led);

        printf("\n");
        printf("/*===========================\n");
        printf("======菜农 %d 助学计划=======\n",test);
        printf("========NUC120助学板========\n");
        printf("==程序参考Cube教程及BSP例程=\n");
        printf("=======2010年03月30日=======\n");
        printf("===========ADC实验==========\n");
        printf("====ADC_Driver version: %x===\n", DrvADC_GetVersion());
        printf("请输入1~9(转换次数)开始测试!\n");
        printf("==========================*/\n\n");

        
    while(1)
    {
            if ( ADC_Status == BUSY)
                {
                    DrvGPIO_InitFunction(E_FUNC_ADC1);                        //注:使能 ADC功能前,模拟输入引脚输入类型.  助学板上与电位器相连
                    DrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_OP, 0x02, EXTERNAL_12MHZ, 3);         
                                   //  单端输入      单一转换      通道1   外部12M      分频3
                        /* Parameters:                                                                                                               */
                        /*InputMode[in]:  模拟信号输入类型 It might be ADC_SINGLE_END or ADC_DIFFERENTIAL.                                     */
                        /*OpMode   [in]:  操作模式         It might be ADC_SINGLE_OP、ADC_SINGLE_CYCLE_OP or ADC_CONTINUOUS_OP.                */
                        /*u8ChannelSelBitwise[in]: 输入通道 For example, "u8ChannelSelBitwise=0x1(00000001b)" means the ADC channel 0 is enabled;
                                                "u8ChannelSelBitwise=0x19(00011001b)" means the ADC channel 0, 3 and 4 are enabled.         */
                        /*ClockSrc[in]:  ADC时钟源  It might be  EXTERNAL_12MHZ、INTERNAL_PLL or INTERNAL_RC22MHZ.                                                 */                                                                                                      
                        /*u8AdcDivisor[in]:  决定ADC时钟频率   ADC clock frequency = ADC clock source frequency / ( u8AdcDivisor + 1 )          */
                        /*                            最大 ADC 时钟频率 20MHz                                                                                                                                    */

                        if (IsFirst)
                        {
                                DrvADC_EnableSelfCalibration();                                                        //使能自校正功能
                                while(DrvADC_IsCalibrationDone()==FALSE);                                //检查是否自校正功能已经完成
                                DrvADC_DisableSelfCalibration();                                                //关闭自校正功能
                                IsFirst = 0;
                        }
                                          
                        tmp = ADC_Cnt;
                        i32ConversionData_Sum = 0;
                        for (;tmp>0;tmp--)
                    {
                            DrvADC_StartConvert();                                                             //Set the ADST bit of ADCR to start the A/D conversion action
        
                                while(DrvADC_IsConversionDone()==FALSE);                        // Check whether the conversion action is finished or not  

                                i32ConversionData = DrvADC_GetConversionData(1);        //Get the conversion result of the specified ADC channel
                                /* Parameters:                                                                                                              */
                                /*    u8ChannelNum [in]:  Specify the ADC channel.                                                                    */
                                i32ConversionData_Sum += i32ConversionData;
                                
                                printf("第%d次转换结果为: 0x%X (%d)\n",(ADC_Cnt-tmp+1) ,i32ConversionData, i32ConversionData);
                    }
                        
                        i32ConversionData = i32ConversionData_Sum/ADC_Cnt;
                        printf("%d次转换结果的平均值为: 0x%X (%d)\n\n",ADC_Cnt ,i32ConversionData, i32ConversionData);
                        printf("计算输入的电压为%dmV!\n\n",(i32ConversionData*5000/4096));
                        printf("========共%d次转换结束!========\n\n",ADC_Cnt);
                        printf("请输入1~9(转换次数)再次开始测试!\n");

                        ADC_Status = IDLE;
                        i32ConversionData_Sum = 0;
                        DrvADC_Close();
            }
    }
}






第一次打开ADC时增加延时即可解决第一次测试时数据波动比较大的问题。


工程文件(内含1~4贴的源文件)

NUC120_HOT_Project.rar

1.18 MB

相关帖子

沙发
weshiluwei6| | 2011-3-30 16:59 | 只看该作者
顶顶 菜鸟的领头羊啊

使用特权

评论回复
板凳
Swallow_0322|  楼主 | 2011-3-30 17:26 | 只看该作者
领头羊可不敢当,我现在还在学最最基础的,其它人都已经在玩高端的了!:P

使用特权

评论回复
地板
U灬U| | 2011-3-30 20:18 | 只看该作者
选你当课代表了

使用特权

评论回复
5
红舞林檬浩| | 2011-3-30 23:36 | 只看该作者
牛人啊 课代表 推选你

使用特权

评论回复
6
Swallow_0322|  楼主 | 2011-3-31 08:04 | 只看该作者
多谢大叔深夜发裤子!

使用特权

评论回复
7
Swallow_0322|  楼主 | 2011-3-31 08:06 | 只看该作者
课代表可胜任不了,俺深知自己基础知识薄弱,多谢#4 #5楼抬举鄙人!

使用特权

评论回复
8
plc_avr| | 2011-3-31 08:46 | 只看该作者
顶,谢谢,要学习一下。

使用特权

评论回复
9
wang0225| | 2011-4-13 11:47 | 只看该作者
我试下这个程序有问题啊
一直在AD采集并且只采集2次

使用特权

评论回复
10
Swallow_0322|  楼主 | 2011-4-13 14:31 | 只看该作者
9# wang0225

请问您是完全使用的我的工程吗?没理解你的问题!
方便的话可以把你的工程给我试试!
你也可以下载我的目标文件到学习板试试!
我的ADC练习目标程序:
NUC120_HOT_ADC.rar (15.06 KB)

使用特权

评论回复
11
weshiluwei6| | 2011-4-14 09:23 | 只看该作者
指示灯亮 串口没反应啊

使用特权

评论回复
12
Swallow_0322|  楼主 | 2011-4-14 11:30 | 只看该作者
11# weshiluwei6

这个程序是串口+AD的练习,你首先只调串口,先把串口调通。

串口没反应先想办法确认是软件问题还是硬件问题,然后再逐步解决!

使用特权

评论回复
13
weshiluwei6| | 2011-4-15 19:46 | 只看该作者
再顶顶 准备看ADC了哦:victory:

使用特权

评论回复
14
lixupengarm| | 2011-5-23 18:02 | 只看该作者
学习!!

使用特权

评论回复
15
tao560532| | 2011-8-13 08:49 | 只看该作者
讲的很细致,MARK@@@

使用特权

评论回复
16
cgd| | 2012-12-5 14:34 | 只看该作者

使用特权

评论回复
17
a437916817| | 2013-4-11 09:53 | 只看该作者
受教了

使用特权

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

本版积分规则

121

主题

1393

帖子

4

粉丝