[技术问答] 请大家帮忙看下ADC配置是否有问题?

[复制链接]
1084|5
 楼主| zzzxiao 发表于 2021-12-24 10:04 | 显示全部楼层 |阅读模式
ADC, ck, se, rc, TI, TE
请大家帮忙看下,我的这个ADC配置是否有问题,我要采集一段采样值逐渐下降的信号。但是目前ADC采样的话是会存在两秒钟采样值相同的结果。while中是简单些的测量,可能比较乱,还请见谅。

  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: 10 $
  5. * $Date: 15/06/16 7:23p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Convert ADC channel 0 in Single mode and print conversion results.
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include <stdio.h>
  12. #include "Nano100Series.h"
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <stdint.h>
  16. #include "lcd.h"
  17. #include "uart.h"
  18. #include "sys.h"
  19. #include "clk.h"
  20. #include "LCDLIB.h"
  21. #define LCD_ALPHABET_NUM        7
  22. #define LCD_DIGIT_NUM           4
  23. uint32_t u32Result;
  24. uint32_t times_us=0,time_delay=0;
  25. unsigned int jidi=0,jieguo=0;
  26. unsigned int shuzu[33]={0};
  27. unsigned int resul[3]={0};
  28. unsigned int i=0;
  29. unsigned char cCountI , cCountJ ;       
  30. unsigned int k ,n;
  31. unsigned int sum;
  32. unsigned int m;
  33. unsigned char delay_time=0;
  34. volatile uint8_t u8ADF,u8ADF1,u8ADF2;
  35. static unsigned char test=0;
  36. void ADC_IRQHandler(void);
  37. void ADC_IRQHandler(void)
  38. {
  39.    uint32_t u32Flag;
  40.     // Get ADC conversion finish interrupt flag
  41.     u32Flag = ADC_GET_INT_FLAG(ADC, ADC_ADF_INT);

  42.     if(u32Flag & ADC_ADF_INT)
  43.         u8ADF = 1;

  44.     ADC_CLR_INT_FLAG(ADC, u32Flag);
  45. }

  46. /*---------------------------------------------------------------------------------------------------------*/
  47. /* Init System Clock                                                                                       */
  48. /*---------------------------------------------------------------------------------------------------------*/
  49. void SYS_Init(void)
  50. {
  51.     /* Unlock protected registers */
  52.     SYS_UnlockReg();

  53.     /* Set HCLK source form HXT and HCLK source divide 1  */
  54.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC,CLK_HCLK_CLK_DIVIDER(1));

  55.     /* Enable external 12MHz HXT, 32KHz LXT and HIRC */
  56.     CLK_EnableXtalRC( CLK_PWRCTL_LXT_EN_Msk | CLK_PWRCTL_HIRC_EN_Msk);

  57.     /* Waiting for clock ready */
  58.     CLK_WaitClockReady( CLK_CLKSTATUS_LXT_STB_Msk | CLK_CLKSTATUS_HIRC_STB_Msk);

  59.    
  60.     CLK_SetCoreClock(1000000);

  61.     /* Enable IP clock */
  62.     CLK_EnableModuleClock(UART0_MODULE);
  63.                 CLK_EnableModuleClock(TMR0_MODULE);
  64.     /* Enable ADC clock */
  65.     CLK_EnableModuleClock(ADC_MODULE);
  66.                 CLK->APBCLK |= CLK_APBCLK_LCD_EN;
  67.     /* Select IP clock source */
  68.     CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART_S_HIRC,CLK_UART_CLK_DIVIDER(1));
  69.                 CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HIRC, 0);

  70.                 CLK->CLKSEL1 &= ~CLK_CLKSEL1_LCD_S_Msk;
  71.     CLK->CLKSEL1 |= (0x0 << CLK_CLKSEL1_LCD_S_LXT);// Clock source from external 12 MHz or 32 KHz crystal clock
  72.                
  73.                
  74.                
  75.     /*---------------------------------------------------------------------------------------------------------*/
  76.     /* Init I/O Multi-function                                                                                 */
  77.     /*---------------------------------------------------------------------------------------------------------*/
  78.     /* Set PA multi-function pins for UART0 RXD and TXD */

  79.                 SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA14_MFP_Msk|SYS_PA_H_MFP_PA15_MFP_Msk);
  80.     SYS->PA_H_MFP |=  (SYS_PA_H_MFP_PA14_MFP_UART0_RX|SYS_PA_H_MFP_PA15_MFP_UART0_TX);
  81.                
  82.     /* Set PB multi-function pins for Clock Output */
  83.     SYS->PB_H_MFP = ( SYS->PB_H_MFP & ~SYS_PB_H_MFP_PB12_MFP_Msk ) |  SYS_PB_H_MFP_PB12_MFP_CKO;
  84.                 SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB8_MFP_Msk;
  85.     SYS->PB_H_MFP |= SYS_PB_H_MFP_PB8_MFP_TMR0_EXT;
  86.                


  87.     /* Set PA.0 multi-function pin for ADC channel 0 */
  88.    SYS->PD_L_MFP = (SYS->PD_L_MFP & ~SYS_PD_L_MFP_PD2_MFP_Msk) | SYS_PD_L_MFP_PD2_MFP_ADC_CH10;
  89.                
  90.                
  91.                 //SYS->PE_L_MFP = (SYS->PE_L_MFP & ~ SYS_PE_L_MFP_PE0_MFP_Msk ) | SYS_PE_L_MFP_PE0_MFP_GPE0;
  92.     /* Disable PA.0 digital input path */
  93.                 SYS->Int_VREFCTL = 0x00000F07;
  94.                  PD->OFFD |= (((1<<1)|(1<<2)) << GP_OFFD_OFFD_Pos);
  95.                         SystemCoreClockUpdate();
  96.        
  97.     /* Lock protected registers */
  98.     SYS_LockReg();
  99. }

  100. void UART0_Init()
  101. {
  102.     /*---------------------------------------------------------------------------------------------------------*/
  103.     /* Init UART                                                                                               */
  104.     /*---------------------------------------------------------------------------------------------------------*/
  105.     UART_Open(UART0, 9600);
  106. }
  107. void TMR0_IRQHandler(void)
  108. {
  109.         times_us=1;
  110.         // 清除中断标志
  111.         TIMER_ClearIntFlag(TIMER0);
  112. }
  113. int32_t main (void)
  114. {
  115.    
  116.     SYS_Init();
  117.     /* Init UART0 for printf */
  118.     UART0_Init();
  119.                 GPIO_SetMode(PA, BIT3, GPIO_PMD_OUTPUT);
  120.                 GPIO_SetMode(PE, BIT6, GPIO_PMD_OUTPUT);
  121.     GPIO_SetMode(PC, BIT8, GPIO_PMD_OUTPUT);
  122.                 GPIO_SetMode(PE, BIT3, GPIO_PMD_OUTPUT);
  123.                         PE3=0;
  124.     // Enable channel 0

  125.                 ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_SINGLE, ADC_CH_10_MASK);
  126.     /* ADC工作在单端single模式,并使能通道0准备采样 */
  127.     // Power on ADC
  128.     ADC_POWER_ON(ADC);

  129.                 /* 使用AVDD电压作为参考*/
  130.                  ADC_SET_REF_VOLTAGE(ADC,ADC_REFSEL_INT_VREF);
  131.                 /* 使能ADC 中断,转换完成将发生中断*/
  132.                 ADC_EnableInt(ADC, ADC_ADF_INT);
  133.                 NVIC_EnableIRQ(ADC_IRQn);
  134.                 /* 初始化Timer0,周期模式,每秒发生一次中断*/
  135.                 TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 100);
  136.          /* 使能Timer0中断 */
  137.          TIMER_EnableInt(TIMER0);
  138.          NVIC_EnableIRQ(TMR0_IRQn);
  139.          // 启动 Timer 0
  140.          TIMER_Start(TIMER0);               
  141.                         PA3=0;
  142.                         PE6=1;
  143.                         PC8=0;
  144.        
  145.     while(1)
  146.                 {
  147.                                 if(times_us==1)//每10ms进入一次
  148.                                 {
  149.                                         PE6=0;            //LED灭
  150.                                         for(m=250;m>0;m--);//等待硬件开关
  151.                                        
  152.                                         u8ADF = 0;                               
  153.                                         ADC_START_CONV(ADC);
  154.                                         while (u8ADF == 0);
  155.                                         jidi = ADC_GET_CONVERSION_DATA(ADC, 10);//测出灯灭的ADC值
  156.                                        
  157.                                        
  158.                                         PE6=1;        //LED亮
  159.                                         for(m=250;m>0;m--);//等待硬件开关
  160.                                        
  161.                                         u8ADF = 0;                               
  162.                                         ADC_START_CONV(ADC);
  163.                                         while (u8ADF == 0);
  164.                                         jieguo  = ADC_GET_CONVERSION_DATA(ADC, 10);                        //灯亮的LED值                       
  165.                                        
  166.                                                 if(jieguo>jidi)
  167.                                         {
  168.                                                 jieguo=jieguo-jidi;
  169.                                         }                                               
  170.                                         else
  171.                                         {
  172.                                                 jieguo=1;               
  173.                                         }
  174.                                         shuzu[i]=jieguo;//存储32次的ADC值
  175.                                         PE6=0;                                                               
  176.                                         i++;
  177.                                         times_us=0;               
  178.                                 }
  179.                                        
  180.                                         if(i==33)
  181.                                                 {               
  182.                                                          for(cCountI = 0 ; cCountI < 32 ; cCountI ++)//排序
  183.                                                                  {
  184.                                                                                 for(cCountJ = cCountI+1 ; cCountJ < 32 ; cCountJ ++)
  185.                                                                                 {
  186.                                                                                                 if(shuzu[cCountI] < shuzu[cCountJ] )
  187.                                                                                                 {
  188.                                                                                                                 k = shuzu[cCountI] ;
  189.                                                                                                                 shuzu[cCountI] = shuzu[cCountJ] ;
  190.                                                                                                                 shuzu[cCountJ] = k ;
  191.                                                                                                 }
  192.                                                                                 }
  193.                                                                  }
  194.                                                                  
  195.                                                 sum = 0 ;
  196.                                                                  for(cCountI = 4 ; cCountI < 28 ; cCountI++)
  197.                                                                  {   
  198.                                                                                  sum += shuzu[cCountI] ;
  199.                                                                  }
  200.                                          sum = (unsigned int)(sum / (24));        //        按照大小排序后,取中间24的数的平均值                                                 
  201.                                                                 resul[test] =sum;
  202.                                                                  test++;
  203.                                                                  if(test==3)//此时是一秒,输出一次结果
  204.                                                                  {
  205.                                                                         // sum=(unsigned int)(shuzu1[0]+shuzu1[1]+shuzu1[2])/3;
  206.                                                                          printf("%5d",resul[1]);
  207.                                                                          test=0;
  208.                                                                  }                                                                                  
  209.                                                                         i=0;        //次数清零
  210.                                                                         times_us=0;        //时间清零                                 
  211.                                                 }                                                                                                                                 
  212.                 }                                       
  213. }


cen9ce 发表于 2023-8-4 14:06 | 显示全部楼层
用官方的demo基本就不会错
q1ngt12 发表于 2023-8-4 15:12 | 显示全部楼层
这咋看,你把工程压缩出来多好
t1ngus4 发表于 2023-8-4 17:08 | 显示全部楼层
一般就用官方的例子就好了,你这ADC跟他例程讲的也差不多
w2nme1ai7 发表于 2023-8-4 18:21 | 显示全部楼层
话说,新唐没有那种可视化配置的软件么?
lamanius 发表于 2023-8-4 19:35 | 显示全部楼层
这不执行一下,也不知道有没有啥问题,你有啥问题就说,帮你分析就是了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

24

帖子

1

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