[DemoCode下载] N79E715的ADC操作方法

[复制链接]
2234|12
 楼主| huangcunxiake 发表于 2017-1-10 22:51 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technology Corp.
  8. //  E-mail: MicroC-8bit@nuvoton.com
  9. //***********************************************************************************************************
  10. //  Application: ADC Function
  11. //  ADC Channel 0(P0.1 default) as ADC input
  12. //
  13. //  Output : UART show ADC output result on hyper-terminal
  14. //***********************************************************************************************************

  15. //------------------------- <<< Use Configuration Wizard in Context Menu >>> --------------------------------
  16. //     <o0.6> UART pin Select
  17. //          <0=> Select P1.0, P1.1 as UART pin(default)
  18. //          <1=> Select P2.6, P2.7 as UART pin(28 pin only)
  19. //-------------------------------- <<< end of configuration section >>> -------------------------------------

  20. #define Uart_Port_Sel   0x00

  21. #include "N79E715.h"
  22. #include "Typedef.h"
  23. #include "Define.h"
  24. #include "Common.h"
  25. #include "Delay.h"
  26. #include "ADC.h"
  27. #include "Version.h"
  28. #include <intrins.h>
  29. #include <stdio.h>
  30. #include <string.h>

  31. //-----------------------------------------------------------------------------------------------------------
  32. void Enable_ADC_Interrupt(void)
  33. {
  34.     EADC = 1;
  35.     EA = 1;
  36. }
  37. //-----------------------------------------------------------------------------------------------------------
  38. void ADC_Channel_Sel(E_ADCCNL_SEL channel)
  39. {
  40.     switch (channel)
  41.     {
  42.         case E_CHANNEL0:                                // P0.1 (default)
  43.             clr_AADR2;
  44.             clr_AADR1;
  45.             clr_AADR0;
  46.             break;
  47.         case E_CHANNEL1:                                // P0.2
  48.             clr_AADR2;
  49.             clr_AADR1;
  50.             set_AADR0;
  51.             break;
  52.         case E_CHANNEL2:                                // P0.3
  53.             clr_AADR2;
  54.             set_AADR1;
  55.             clr_AADR0;
  56.             break;
  57.         case E_CHANNEL3:                                // P0.4
  58.             clr_AADR2;
  59.             set_AADR1;
  60.             set_AADR0;
  61.             break;
  62.         case E_CHANNEL4:                                // P0.5
  63.             set_AADR2;
  64.             clr_AADR1;
  65.             clr_AADR0;
  66.             break;
  67.         case E_CHANNEL5:                                // P0.6
  68.             set_AADR2;
  69.             clr_AADR1;
  70.             set_AADR0;
  71.             break;
  72.         case E_CHANNEL6:                                // P0.7
  73.             set_AADR2;
  74.             set_AADR1;
  75.             clr_AADR0;
  76.             break;
  77.         case E_CHANNEL7:                                // P2.6
  78.             set_AADR2;
  79.             set_AADR1;
  80.             set_AADR0;
  81.             break;
  82.     }
  83. }
  84. //-----------------------------------------------------------------------------------------------------------
  85. void Set_ADC_Input_Mode(E_ADCCNL_SEL channel)
  86. {
  87.     switch (channel)
  88.     {
  89.         case E_CHANNEL0:                                // ADC0(P0.1) is input-only mode
  90.             P0DIDS |= SET_BIT1;                         // Disable digital function for P0.1
  91.             P0M1 |= SET_BIT1;
  92.             P0M2 &= CLR_BIT1;
  93.             break;
  94.         case E_CHANNEL1:                                // ADC1(P0.2) is input-only mode
  95.             P0DIDS |= SET_BIT2;                         // Disable digital function for P0.2
  96.             P0M1 |= SET_BIT2;
  97.             P0M2 &= CLR_BIT2;
  98.             break;
  99.         case E_CHANNEL2:                                // ADC2(P0.3) is input-only mode
  100.             P0DIDS |= SET_BIT3;                         // Disable digital function for P0.3
  101.             P0M1 |= SET_BIT3;
  102.             P0M2 &= CLR_BIT3;
  103.             break;
  104.         case E_CHANNEL3:                                // ADC3(P0.4) is input-only mode
  105.             P0DIDS |= SET_BIT4;                         // Disable digital function for P0.4
  106.             P0M1 |= SET_BIT4;
  107.             P0M2 &= CLR_BIT4;
  108.             break;
  109.         case E_CHANNEL4:                                // ADC4(P0.5) is input-only mode
  110.             P0DIDS |= SET_BIT5;                         // Disable digital function for P0.5
  111.             P0M1 |= SET_BIT5;
  112.             P0M2 &= CLR_BIT5;
  113.             break;
  114.         case E_CHANNEL5:                                // ADC5(P0.6) is input-only mode
  115.             P0DIDS |= SET_BIT6;                         // Disable digital function for P0.6
  116.             P0M1 |= SET_BIT6;
  117.             P0M2 &= CLR_BIT6;
  118.             break;
  119.         case E_CHANNEL6:                                // ADC6(P0.7) is input-only mode
  120.             P0DIDS |= SET_BIT7;                         // Disable digital function for P0.7
  121.             P0M1 |= SET_BIT7;
  122.             P0M2 &= CLR_BIT7;
  123.             break;
  124.         case E_CHANNEL7:                                // ADC7(P2.6) is input-only mode(28 pin only)
  125.             AUXR1 |= SET_BIT3;                          // Disable digital function for P2.6
  126.             P2M1 |= SET_BIT6;
  127.             P2M2 &= CLR_BIT6;
  128.             break;
  129.     }
  130. }
  131. //-----------------------------------------------------------------------------------------------------------
  132. void Trigger_ADC_Convertion(void)
  133. {
  134.     clr_ADCI;                                           // Clear ADC flag (ADCI=0)
  135.     set_ADCS;                                           // ADC run (ADCS = 1)
  136.     PCON |= SET_BIT0;                                   // Enter idle mode
  137. }
  138. //-----------------------------------------------------------------------------------------------------------
  139. void ADC_Init(void)
  140. {
  141.     Set_ADC_Input_Mode(E_CHANNEL0);                     // Set ADC0 (P0.1 default) is input only mode

  142.     ADC_Channel_Sel(E_CHANNEL0);                        // ADC Channel Select (P0.1 default)

  143.     Enable_ADC_Interrupt();

  144.     set_ADCEN;                                          // Enable ADC Function
  145. }
  146. //-----------------------------------------------------------------------------------------------------------
  147. void main(void)
  148. {
  149.     UINT16 u16ADCL;
  150.     UINT16 u16ADC;

  151.     AUXR1 |= Uart_Port_Sel;                             // Select P10/P11 as UART pin(default)
  152.     InitialUART0_Timer1(9600);                          // 9600 Baud Rate [url=home.php?mod=space&uid=72445]@[/url] 11.0592MHz
  153.     Show_Version_Number_To_PC();
  154.     printf ("\n*===================================================================");
  155.     printf ("\n*  Name: N79E715 Series ADC Sample Code.");
  156.     printf ("\n*===================================================================");

  157.     ADC_Init();
  158.     while(1)
  159.     {
  160.         Trigger_ADC_Convertion();

  161.         u16ADCL = ADCCON0;
  162.         u16ADCL = u16ADCL >> 6;                         // ADC[1:0]

  163.         u16ADC = ADCH;
  164.         u16ADC = (u16ADC << 2 ) + u16ADCL;              // ADC[9:2] + ADC[1:0]

  165.         printf ("\nADC Value = %d",u16ADC);             // Show 10 bit ADC

  166.         Delay1ms(500);
  167.     }
  168. }
  169. //-----------------------------------------------------------------------------------------------------------
  170. void ADC_ISR(void) interrupt 11                         // Vector @  0x5B
  171. {
  172.     clr_ADCI;                                           // Clear ADC flag (ADCI = 0)
  173.     clr_ADCS;                                           // ADC stop (ADCS = 0)
  174. }
  175. //-----------------------------------------------------------------------------------------------------------







 楼主| huangcunxiake 发表于 2017-1-10 22:52 | 显示全部楼层
官方提供的例程,是不是很有特点。
 楼主| huangcunxiake 发表于 2017-1-10 22:53 | 显示全部楼层
这里的switch case 分支用的很好,值得学习。
gejigeji521 发表于 2017-1-11 19:29 | 显示全部楼层
原来程序可以这么写。
643757107 发表于 2017-1-11 23:57 | 显示全部楼层
8个通道的都可以通过一个函数调用实现。
 楼主| huangcunxiake 发表于 2017-1-13 22:02 | 显示全部楼层
这个就是所有的端口的PWM都可以参考这个例程来实现。
yiyigirl2014 发表于 2017-1-17 21:36 | 显示全部楼层
  u16ADCL = ADCCON0;
        u16ADCL = u16ADCL >> 6;                         // ADC[1:0]

        u16ADC = ADCH;
        u16ADC = (u16ADC << 2 ) + u16ADCL;              // ADC[9:2] + ADC[1:0]
从这里看出,ADC是10BIT
 楼主| huangcunxiake 发表于 2017-1-17 22:28 | 显示全部楼层
大家根据这个例子就可以掌握好这个ADC的操作技巧了
wanfeng362 发表于 2017-3-19 15:51 | 显示全部楼层
每个通道不能同时进行转换吗?
zhuomuniao110 发表于 2017-3-19 23:50 | 显示全部楼层
怎么可能同时,时钟是单线的,是通过选择器逐个选择通道转换。
wahahaheihei 发表于 2017-3-20 18:23 | 显示全部楼层
这种操作起来很方便,例子很 容易学会。
heisexingqisi 发表于 2017-3-20 22:27 | 显示全部楼层
通过中断实现这些外设。
数传无线 发表于 2019-5-8 19:32 来自手机 | 显示全部楼层
看资料时16位ADC,不知大家实际使用的时候精度如何?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3760

帖子

11

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