[新手园地] 傻瓜菜鸟第4帖——ADC

[复制链接]
 楼主| weshiluwei6 发表于 2011-4-18 13:16 | 显示全部楼层 |阅读模式
ADC, IO, UART, RS, TE
首先水王必须感谢菜农大叔的250计划
其次看见Swallow_0322写的学习笔记,收获很多啊。

最近看了ADC并且参照这神的讲课笔记,开始写了个小程序。
遇到了一些问题。
每次复位之后,第一次测量的数据总是偏大,
DrvADC_StartConvert()后加了很长延时还是没用有点不解

  1. /***************************************************************************:**************
  2. ** 文件名称:NUC120_HOT_UART.c
  3. ** 文件说明:NUC120助学板ADC练习程序
  4. ** 创建日期:2011-04-014
  5. ** 修改日期:
  6. ** 现    象:打开串口调试工具,会出现以下的几行字,
  7.              输入您想 测试的次数,遍开始转换,计算几次测量的平均值。
  8.             
  9. ** 备    注:利用Uart0的ADC练习
  10. ** 问    题:即使转换开始后,加了延时,第一次测量的数据还是很大,不解!!!
  11. ***********************************************************:****::************************/

  12. #include <stdio.h>
  13. #include "NUC1xx.h"
  14. #include "Driver\DrvGPIO.h"
  15. #include "Driver\DrvSYS.h"
  16. #include "Driver\DrvUART.h"
  17. #include "Driver\DrvADC.h"
  18. uint8_t ADC_ConversionCount;

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

  26. /*****************************************************************************************
  27. ** Function Name    :  UART_INT_HANDLE
  28. ** Descriptions     :  UART Callback function
  29. ** Input  parameters:  u32IntStatus
  30. ** OutPut parameters:    None
  31. ** Returned  value  :   
  32. *****************************************************************************************/
  33. void UART_INT_HANDLE(uint32_t u32IntStatus)
  34. {
  35.   uint8_t InChar[1]={0xFF};
  36. if(u32IntStatus & DRVUART_RDAINT)
  37. {
  38.   /* Get all the input characters */
  39.   while(UART0->ISR.RDA_IF==1)                   //字节数等于RFITL,RDA_if 1
  40.   {
  41.    /* Get the character from UART Buffer */
  42.    DrvUART_Read(UART_PORT0,InChar,1);      
  43.    /* 2-存放接受到的数据缓冲指针,3-要接收的字节数 */
  44.                
  45.    if(( InChar[0] <= '9')&&( InChar[0] >= '0' ))
  46.    {
  47.       ADC_Status          =   1;
  48.       ADC_ConversionCount =   (InChar[0] - 0x30);
  49.    
  50.    }
  51.       
  52.   }
  53. }
  54. }
  55. /****************************************************************************************
  56. ** Function Name    :  Init_System
  57. ** Descriptions     :  系统初始化函数
  58. ** Input  parameters:  None
  59. ** OutPut parameters:  None
  60. ** Returned  value  :      
  61. ****************************************************************************************/
  62. void Init_System(void)
  63. {
  64.     UNLOCKREG();
  65. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
  66. DrvSYS_Delay(5000);
  67. LOCKREG();
  68. }
  69. /***************************************************************************************
  70. ** Function Name    :  Init_Uart
  71. ** Descriptions     :  串口初始化函数
  72. ** Input  parameters:  None
  73. ** OutPut parameters:  None
  74. ** Returned  value  :        
  75. ***************************************************************************************/
  76. void Init_Uart(void)
  77. {
  78.    STR_UART_T  param;
  79.        /*  声明 UART设置的结构体 位于DRVUART.H
  80.         结构体如下
  81.         typedef  struct DRVUART_STRUCT
  82.      {
  83.             uint32_t                u32BaudRate;
  84.       E_DATABITS_SETTINGS     u8cDataBits;
  85.       E_STOPBITS_SETTINGS    u8cStopBits;
  86.       E_PARITY_SETTINGS       u8cParity;
  87.       E_FIFO_SETTINGS         u8cRxTriggerLevel;
  88.       uint8_t                 u8TimeOut;     
  89.      }STR_UAR_T;
  90.     */
  91.    DrvSYS_SelectIPClockSource( E_SYS_UART_CLKSRC,0 );               //设定IP时钟源,看门狗,模数,定时器,UART,CAN,PWM
  92.        /* UART时钟源选择. 00 =外部12MHz 晶振 01 = PLL 1x =内部 22MHz 振荡器 */
  93.    
  94.    DrvGPIO_InitFunction(E_FUNC_UART0);                   //GPB_MFP0-1-2-3置位 GPIO使能UART功能
  95.    param.u32BaudRate          =      115200;                    //波特率
  96.    param.u8cDataBits          =   DRVUART_DATABITS_8;     //数据位
  97.    param.u8cStopBits          =   DRVUART_STOPBITS_1;  //停止位
  98.    param.u8cParity            =   DRVUART_PARITY_NONE;  //校验位
  99.    param.u8cRxTriggerLevel    =   DRVUART_FIFO_1BYTES;     //FIFO存储深度 1 字节
  100.    param.u8TimeOut           =      0;       //FIFO超时设定
  101.    if( DrvUART_Open(UART_PORT0,&param) != E_SUCCESS)            //初始化串口错误
  102.    printf("UART0 open failed\n");
  103.    /* Enable Interrupt and install the call back function */
  104. DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT,UART_INT_HANDLE);//回调函数指针
  105.    /* DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT */
  106. }
  107. /***************************************************************************************
  108. ** Function Name    :  main
  109. ** Descriptions     :  主函数
  110. ** Input  parameters:  None
  111. ** OutPut parameters:  None
  112. ** Returned  value  :        
  113. ***************************************************************************************/
  114. int main (void)
  115. {
  116.     uint8_t test = 250;
  117. uint8_t temp;
  118. uint32_t ADC_ConversionData;
  119. uint32_t ADC_ConversionSum;
  120.   
  121.     Init_System();
  122.     Init_Uart();
  123.     DrvGPIO_Open  (E_GPA,2,E_IO_OUTPUT);    /* 打开GPA IO模式 */
  124.     DrvGPIO_ClrBit(E_GPA,2);       /* LE1运行指示灯 */
  125. printf("\n");
  126. printf("/*===========================\n");
  127. printf("======菜农 %d 助学计划=======\n",test);
  128. printf("========NUC120助学板========\n");
  129. printf("==程序参考Cube教程及BSP例程=\n");
  130. printf("=======2011年04月16日=======\n");
  131. printf("===========ADC实验==========\n");
  132. printf("====ADC_Driver version: %x===\n", DrvADC_GetVersion());
  133. printf("请输入1~9(转换次数)开始测试!\n");
  134. printf("==========================*/\n\n");

  135. while(1)
  136. {
  137.     if(ADC_Status == 1)
  138.     {
  139.      DrvGPIO_InitFunction(E_FUNC_ADC1);
  140.   DrvADC_Open(ADC_SINGLE_END,ADC_SINGLE_OP,0x02,EXTERNAL_12MHZ,3);
  141.       /*  
  142.        ADC_SINGLE_END --- 单端输入模式  
  143.        ADC_SINGLE_OP  --- 单次模式
  144.     EXTERNAL_12MHZ
  145.     3              --- ADC时钟频率12/(3+1) =3M
  146.       */
  147.   DrvADC_SetADCChannel(0x02,ADC_SINGLE_END);
  148.       /*
  149.       0x02 = ADC1:8421码
  150.    */
  151.   temp = ADC_ConversionCount;
  152.   ADC_ConversionSum = 0;
  153.   for(;temp>0;temp--)
  154.   {
  155.     DrvADC_StartConvert();   
  156.     DrvSYS_Delay(2000000);

  157.     while((DrvADC_IsConversionDone()) == FALSE);
  158.    
  159.        ADC_ConversionData = DrvADC_GetConversionData(1);
  160.     ADC_ConversionSum += ADC_ConversionData;
  161.       printf("第%d次转换结果为: 0x%X (%d)\n",(ADC_ConversionCount-temp+1) ,ADC_ConversionData, ADC_ConversionData);
  162.   }
  163.   
  164.   ADC_ConversionData = ADC_ConversionSum/ADC_ConversionCount;
  165.   printf("%d次转换结果的平均值为: 0x%X (%d)\n\n",ADC_ConversionCount ,ADC_ConversionData, ADC_ConversionData);
  166.   printf("计算输入的电压为%dmV!\n\n",(ADC_ConversionData*5000/4096));
  167.   printf("========共%d次转换结束!========\n\n",ADC_ConversionCount);
  168.   printf("请输入1~9(转换次数)再次开始测试!\n");
  169.   ADC_ConversionSum = 0;
  170.   DrvADC_Close();
  171.   ADC_Status = 0;
  172. }   
  173.    }
  174. }

lixupengarm 发表于 2011-5-23 17:50 | 显示全部楼层
:victory:mark
wangjia2000 发表于 2011-9-29 11:13 | 显示全部楼层
误差大,因为设置的AD口不对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

1126

帖子

1

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

7

主题

1126

帖子

1

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