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

[复制链接]
 楼主| Swallow_0322 发表于 2011-3-30 16:34 | 显示全部楼层 |阅读模式
本帖最后由 缥缈九哥 于 2012-9-14 12:07 编辑
  1. /**************************************************
  2. ** 文件名称:NUC120_HOT_ADC.c
  3. ** 文件说明:NUC120助学板练习程序
  4. ** 创建日期:2011-03-30
  5. ** 修改日期:
  6. ** 备    注:ADC程序练习
  7. **************************************************/
  8. #include <stdio.h>
  9. #include "NUC1xx.h"
  10. #include "Driver\DrvGPIO.h"
  11. #include "Driver\DrvSYS.h"
  12. #include "Driver\DrvUART.h"
  13. #include "Driver\DrvADC.h"


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

  17. uint8_t  ADC_Status = IDLE;
  18. uint8_t  ADC_Cnt    = 0;

  19. /***************
  20. **  函数声明  **
  21. ***************/
  22. void Init_System (void);
  23. void Init_Uart (void);
  24. void UART_INT_HANDLE(uint32_t u32IntStatus);


  25. /*****************************
  26. ** Name:      UART_INT_HANDLE
  27. ** Function:  UART Callback function
  28. ** Input:     u32IntStatus
  29. ** OutPut:    None
  30. ** Data:      2011-03-17
  31. ** Note:      
  32. ****************************/
  33. void UART_INT_HANDLE(uint32_t u32IntStatus)
  34. {

  35.         uint8_t bInChar[1]={0xFF};

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

  43.                         if ((ADC_Status==IDLE)&&(bInChar[0]<='9')&&(bInChar[0]>'0'))
  44.                         {
  45.                                 ADC_Status = BUSY;
  46.                                 ADC_Cnt = (bInChar[0]-0x30);
  47.                         }
  48.                 }
  49.         }
  50. }

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

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

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

  74. /*****************************
  75. ** Name:      Init_Uart
  76. ** Function:  UART初始化函数
  77. ** Input:      None
  78. ** OutPut:     None
  79. ** Data:       2011-03-17
  80. ** Note:      
  81. ****************************/
  82. void Init_Uart(void)
  83. {
  84.         STR_UART_T param;
  85.         /*
  86.         声明 UART设置的结构体 位于DRVUART.H
  87.         结构体如下
  88.         typedef struct DRVUART_STRUCT
  89.         {
  90.                 uint32_t            u32BaudRate;                        
  91.                 E_DATABITS_SETTINS  u8cDataBits;                        
  92.                 E_STOPBITS_SETTINS  u8cStopBits;                        
  93.                 E_PARITY_SETTINS         u8cParity;                                 
  94.                 E_FIFO_SETTINGS     u8cRxTriggerLevel;                 
  95.                 uint8_t             u8TimeOut ;                                 
  96.       }STR_UART_T;
  97.         */
  98.         DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);                    //使能UART时钟
  99.         //SYSCLK->CLKSEL1.UART_S = 0;                //UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器

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

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

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

  120. int main (void)
  121. {
  122.         uint8_t test = 250;
  123.         uint8_t tmp;
  124.         uint32_t i32ConversionData;
  125.         uint32_t i32ConversionData_Sum;
  126.         uint8_t IsFirst = 1;
  127.         
  128.         Init_System();
  129.         
  130.         Init_Uart();

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

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

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

  159.                         if (IsFirst)
  160.                         {
  161.                                 DrvADC_EnableSelfCalibration();                                                        //使能自校正功能
  162.                                 while(DrvADC_IsCalibrationDone()==FALSE);                                //检查是否自校正功能已经完成
  163.                                 DrvADC_DisableSelfCalibration();                                                //关闭自校正功能
  164.                                 IsFirst = 0;
  165.                         }
  166.                                           
  167.                         tmp = ADC_Cnt;
  168.                         i32ConversionData_Sum = 0;
  169.                         for (;tmp>0;tmp--)
  170.                     {
  171.                             DrvADC_StartConvert();                                                             //Set the ADST bit of ADCR to start the A/D conversion action
  172.         
  173.                                 while(DrvADC_IsConversionDone()==FALSE);                        // Check whether the conversion action is finished or not  

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

  187.                         ADC_Status = IDLE;
  188.                         i32ConversionData_Sum = 0;
  189.                         DrvADC_Close();
  190.             }
  191.     }
  192. }






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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
weshiluwei6 发表于 2011-3-30 16:59 | 显示全部楼层
顶顶 菜鸟的领头羊啊
 楼主| Swallow_0322 发表于 2011-3-30 17:26 | 显示全部楼层
领头羊可不敢当,我现在还在学最最基础的,其它人都已经在玩高端的了!:P
U灬U 发表于 2011-3-30 20:18 | 显示全部楼层
选你当课代表了
红舞林檬浩 发表于 2011-3-30 23:36 | 显示全部楼层
牛人啊 课代表 推选你
 楼主| Swallow_0322 发表于 2011-3-31 08:04 | 显示全部楼层
多谢大叔深夜发裤子!
 楼主| Swallow_0322 发表于 2011-3-31 08:06 | 显示全部楼层
课代表可胜任不了,俺深知自己基础知识薄弱,多谢#4 #5楼抬举鄙人!
plc_avr 发表于 2011-3-31 08:46 | 显示全部楼层
顶,谢谢,要学习一下。
wang0225 发表于 2011-4-13 11:47 | 显示全部楼层
我试下这个程序有问题啊
一直在AD采集并且只采集2次
 楼主| Swallow_0322 发表于 2011-4-13 14:31 | 显示全部楼层
9# wang0225

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
weshiluwei6 发表于 2011-4-14 09:23 | 显示全部楼层
指示灯亮 串口没反应啊
 楼主| Swallow_0322 发表于 2011-4-14 11:30 | 显示全部楼层
11# weshiluwei6

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

串口没反应先想办法确认是软件问题还是硬件问题,然后再逐步解决!
weshiluwei6 发表于 2011-4-15 19:46 | 显示全部楼层
再顶顶 准备看ADC了哦:victory:
lixupengarm 发表于 2011-5-23 18:02 | 显示全部楼层
学习!!
tao560532 发表于 2011-8-13 08:49 | 显示全部楼层
讲的很细致,MARK@@@
cgd 发表于 2012-12-5 14:34 | 显示全部楼层
a437916817 发表于 2013-4-11 09:53 | 显示全部楼层
受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

1393

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

121

主题

1393

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部