[应用方案] NUC029xAN的ADC代码

[复制链接]
904|6
 楼主| benjaminka 发表于 2023-7-14 21:00 | 显示全部楼层 |阅读模式
  1. ADC:
  2.         配置ADC:
  3.         /* Enable ADC module clock */
  4.     CLK_EnableModuleClock(ADC_MODULE);

  5.     /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */
  6.     CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));
  7.        
  8.         配置ADC时一定要端口的数字输入功能禁止
  9.     /* Disable the P1.0 - P1.3 digital input path to avoid the leakage current */
  10.     GPIO_DISABLE_DIGITAL_PATH(P1, 0xF);        //0000 1111
  11.        
  12.     /* Configure the P1.0 - P1.3 ADC analog input pins */
  13.     SYS->P1_MFP &= ~(SYS_MFP_P10_Msk | SYS_MFP_P11_Msk | SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
  14.     SYS->P1_MFP |= SYS_MFP_P10_AIN0 | SYS_MFP_P11_AIN1 | SYS_MFP_P12_AIN2 | SYS_MFP_P13_AIN3 ;       
  15.        
  16. GPIO  IP有个寄存器叫OFFD(OFF  Digital),关闭相应管脚的数字通路的意思。如果某个管脚配置
  17. 为模拟功能,例如:ADC、DAC、ACMP、SEG、COM、DH1、DH2、V1、V2、V3等功能,这
  18. 些管脚对应的OFFD  bit应该使能,关闭到数字区域的通路,避免内部数字器件不停的打开、关闭
  19. 而漏电       
  20.        
  21.        
  22.        
  23. NUC029xAN  A/D转换器支持四种操作模式:  单次模式,  Burst模式,  单周期扫描模式和连续扫描模

  24. ADC continuous scan mode sample code :       
  25.         //开启ADC
  26.     /* Power on ADC module */
  27.     ADC_POWER_ON(ADC);

  28.     /* Set the ADC operation mode as continuous scan, input mode as single-end and
  29.      enable the analog input channel 0, 1, 2 and 3 */
  30.     ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_CONTINUOUS, 0xF);

  31.     /* clear the A/D interrupt flag for safe */
  32.     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);

  33.     /* start A/D conversion */
  34.     ADC_START_CONV(ADC);

  35.     /* Wait conversion done */
  36.     while(!ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));
  37.         //转换结束后的值会放在使能通道对应的A/D寄存器中。

  38.     /* clear the A/D interrupt flag for safe */
  39.     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);

  40.     for(u32ChannelCount = 0; u32ChannelCount < 4; u32ChannelCount++)
  41.     {
  42.      i32ConversionData = ADC_GET_CONVERSION_DATA(ADC, u32ChannelCount);
  43.      printf("Conversion result of channel %d: 0x%X (%d)\n", u32ChannelCount, i32ConversionData, i32ConversionData);
  44.     }

  45.     /* Wait conversion done */  ADC_ADF_INT: Convert complete interrupt flag
  46.     while(!ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));

  47.     /* Stop A/D conversion */
  48.     ADC_STOP_CONV(ADC);

  49.     for(u32ChannelCount = 0; u32ChannelCount < 4; u32ChannelCount++)
  50.     {
  51.      i32ConversionData = ADC_GET_CONVERSION_DATA(ADC, u32ChannelCount);
  52.      printf("Conversion result of channel %d: 0x%X (%d)\n", u32ChannelCount, i32ConversionData, i32ConversionData);
  53.     }

  54.     /* clear the A/D interrupt flag for safe */
  55.     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);       
  56.        
  57.        
  58.        
  59.         //关闭ADC
  60.     /* Disable ADC module */
  61.     ADC_Close(ADC);

  62.     /* Disable ADC IP clock */
  63.     CLK_DisableModuleClock(ADC_MODULE);

  64.     /* Disable External Interrupt */
  65.     NVIC_DisableIRQ(ADC_IRQn);       
  66.        


tpgf 发表于 2024-2-4 16:48 | 显示全部楼层
ad转换的四种模式楼主选用的是哪种模式呢
晓伍 发表于 2024-2-4 17:27 | 显示全部楼层
关闭数字通路的功能应该在什么位置进行呢
wowu 发表于 2024-2-4 22:02 | 显示全部楼层
如何操作才可以动态的更改采样的频率呢
xiaoqizi 发表于 2024-2-4 22:38 | 显示全部楼层
相关引脚的配置代码好像没有贴上来啊
木木guainv 发表于 2024-2-4 23:07 | 显示全部楼层
如何通过软件对adc的采集数据进行滤波呢
磨砂 发表于 2024-2-4 23:46 | 显示全部楼层
关于adc的采集模式选取 有没有指导性的意见呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

1629

帖子

0

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