[DemoCode下载] MINI51系列的ADC转换操作方法

[复制链接]
 楼主| huangcunxiake 发表于 2017-3-18 23:06 | 显示全部楼层 |阅读模式
  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 2 $
  5. * $Date: 15/09/24 5:50p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate ADC function by repeatedly convert the input of ADC
  7. *           channel 5 (P1.5) and shows the result on UART console.
  8. *
  9. * @note
  10. * Copyright (C) 2015 Nuvoton Technology Corp. All rights reserved.
  11. *****************************************************************************/
  12. #include <stdio.h>
  13. #include "Mini51Series.h"

  14. void ADC_IRQHandler(void)
  15. {
  16.     uint32_t u32Flag;

  17.     // Get ADC comparator interrupt flag
  18.     u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);

  19.     // Get ADC convert result
  20.     printf("Convert result is %x\n", (uint32_t)ADC_GET_CONVERSION_DATA(ADC, 0));

  21.     ADC_CLR_INT_FLAG(ADC, u32Flag);
  22. }


  23. void SYS_Init(void)
  24. {
  25.     /*---------------------------------------------------------------------------------------------------------*/
  26.     /* Init System Clock                                                                                       */
  27.     /*---------------------------------------------------------------------------------------------------------*/

  28.     /* Unlock protected registers */
  29.     SYS_UnlockReg();

  30.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  31.     SYS->P5_MFP = SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2;

  32.     /* Enable external 12MHz XTAL, HIRC */
  33.     CLK->PWRCON = CLK_PWRCON_OSC22M_EN_Msk | CLK_PWRCON_HXT;

  34.     /* Waiting for clock ready */
  35.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk | CLK_CLKSTATUS_XTL_STB_Msk);

  36.     /* Switch HCLK clock source to XTL */
  37.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_XTAL,CLK_CLKDIV_HCLK(1));

  38.     /* Enable IP clock */
  39.     CLK_EnableModuleClock(UART_MODULE);
  40.     CLK_EnableModuleClock(ADC_MODULE);

  41.     /* Select IP clock source */
  42.     CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_XTAL,CLK_CLKDIV_UART(1));
  43.     CLK_SetModuleClock(ADC_MODULE,CLK_CLKSEL1_ADC_S_XTAL,CLK_CLKDIV_ADC(6));

  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init I/O Multi-function                                                                                 */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Set P0 multi-function pins for UART RXD, TXD */
  48.     SYS->P0_MFP = SYS_MFP_P00_TXD | SYS_MFP_P01_RXD;

  49.     /* Set P1 multi-function pin ADC channel 5 input*/
  50.     SYS->P1_MFP = SYS_MFP_P15_AIN5;

  51.     /* Analog pin OFFD to prevent leakage */
  52.     P1->OFFD |= (1 << 5) << GPIO_OFFD_OFFD_Pos;

  53.     /* To update the variable SystemCoreClock */
  54.     SystemCoreClockUpdate();

  55.     /* Lock protected registers */
  56.     SYS_LockReg();
  57. }

  58. int32_t main (void)
  59. {
  60.     /* Init System, IP clock and multi-function I/O
  61.        In the end of SYS_Init() will issue SYS_LockReg()
  62.        to lock protected register. If user want to write
  63.        protected register, please issue SYS_UnlockReg()
  64.        to unlock protected register if necessary */
  65.     SYS_Init();

  66.     /* Init UART to 115200-8n1 for print message */
  67.     UART_Open(UART0, 115200);

  68.     printf("\nThis sample code demonstrate ADC channel 5 conversion and printf the result on UART\n");

  69.     // Enable channel 5
  70.     ADC_Open(ADC, 0, 0, 0x01 << 5);

  71.     // Power on ADC
  72.     ADC_POWER_ON(ADC);


  73.     // Enable ADC convert complete interrupt
  74.     ADC_EnableInt(ADC, ADC_ADF_INT);
  75.     NVIC_EnableIRQ(ADC_IRQn);

  76.     while(1) {
  77.         // Trigger ADC conversion if it is idle
  78.         if(!ADC_IS_BUSY(ADC)) {
  79.             ADC_START_CONV(ADC);
  80.         }
  81.     }

  82. }

  83. /*** (C) COPYRIGHT 2015 Nuvoton Technology Corp. ***/



 楼主| huangcunxiake 发表于 2017-3-18 23:09 | 显示全部楼层
MINI51的ADC操作还是非常简单的。
643757107 发表于 2017-3-19 00:28 | 显示全部楼层
好像就是直接选择那个通道就行了,其他的跟那个外部一样了。
天灵灵地灵灵 发表于 2017-3-19 14:48 | 显示全部楼层
if(!ADC_IS_BUSY(ADC)) {
            ADC_START_CONV(ADC);
        }
如果不忙就转换,厉害。
zhuomuniao110 发表于 2017-3-19 22:35 | 显示全部楼层
就是检测那个标志位了,当忙的时候就是在转换,不忙了就转换完了,可以进入下次。
598330983 发表于 2017-3-31 22:09 来自手机 | 显示全部楼层
使用了外部晶振
zhuotuzi 发表于 2017-4-5 19:35 | 显示全部楼层
ADC的中断处理函数最后一个就是    ADC_CLR_INT_FLAG(ADC, u32Flag);
也就是退出时候才清理那个标志位。
天灵灵地灵灵 发表于 2017-4-6 18:33 | 显示全部楼层
时钟的设置,需要先使能后才能设置。
 楼主| huangcunxiake 发表于 2017-4-6 19:30 | 显示全部楼层
对于系统级的配置都需要开锁解锁配合。
wahahaheihei 发表于 2017-4-6 21:52 | 显示全部楼层
最好每个通道的都来一遍。。
yiyigirl2014 发表于 2017-4-7 12:41 | 显示全部楼层
   /* Analog pin OFFD to prevent leakage */
    P1->OFFD |= (1 << 5) << GPIO_OFFD_OFFD_Pos;
这个OFFD什么,谁给解释解释。
yiy 发表于 2017-4-8 15:14 | 显示全部楼层
    u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);

    ADC_CLR_INT_FLAG(ADC, u32Flag)
这两个好有趣,第一个是中断后获取那个标志位,但是后面那个标志位是不是直接就是用的ADC的哪个位的意思啊,所以可以通过后面的传递直接清理了。
yiy 发表于 2017-4-8 15:14 | 显示全部楼层
另外,可不可以这么写
ADC_CLR_INT_FLAG(ADC,  ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));
省略了一个参数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

3700

帖子

11

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

222

主题

3700

帖子

11

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