[应用方案] 新唐芯片学习笔记——ADC

[复制链接]
 楼主| 逢dududu必shu 发表于 2021-3-29 23:47 | 显示全部楼层
CMPCOND(ADCMPRx[2]) 位指定比较条件。如果CMPCOND(ADCMPRx[2]) 位为0,当转换结果小于CMPD[11:0](NUC029xAN)/ CMPD[9:0](NUC029xAN)的值时,内部匹配计数器将加1;如果CMPCOND(ADCMPRx[2]) 位为 1 ,当转换结果大于或等于 CMPD[11:0] ( NUC029xAN ) /CMPD[9:0](NUC029xAN)的值时,内部匹配计数器将减1。当CMPCH(ADCMPRx[5:3])指定的通道转换完成时,将自动触发一次比较。当比较结果和设定值相匹配,比较匹配寄存器加1,否则比较匹配计数器将清0。当匹配计数器到达(CMPMATCNT+1) 设置的值时,CMPF 位将置1,如果CMPIE(ADCMPRx[1])位设置为1,将产生一个ADC_INT 中断。在扫描模式,软件可以通过该功能监控外部输入引脚电压变化而不会增加软件负载。详细逻辑框图如下:
 楼主| 逢dududu必shu 发表于 2021-3-29 23:47 | 显示全部楼层
 楼主| 逢dududu必shu 发表于 2021-3-29 23:48 | 显示全部楼层
中断源
ADC 中断有 3 个中断源。当 ADC 完成转换, A/D 转换完成标志 ADF(ADSR[0]) 将被置 1 。
CMPF0(ADSR[1])和CMPF1(ADSR[2])为比较功能的比较标志位。当转换结果与ADCMPR0/1设置的条件匹配时,相应的位将置1。当ADF(ADSR[0]), CMPF0(ADSR[1]) 和 CMPF1(ADSR[2])标志有一个置1且相应中断使能位ADIE(ADCR[1])和CMPIE(ADCMPRx[1])置1,ADC中断将产生。软件可以清除这些标志位来取消中断请求。
 楼主| 逢dududu必shu 发表于 2021-3-29 23:48 | 显示全部楼层
 楼主| 逢dududu必shu 发表于 2021-3-29 23:49 | 显示全部楼层

  1. /*************************ADC配置大体如下************************************************/
  2. ADC:
  3.         配置ADC:
  4.         /* Enable ADC module clock */
  5.     CLK_EnableModuleClock(ADC_MODULE);

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

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

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

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

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

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

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

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

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

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

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

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

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

  65.     /* Disable External Interrupt */
  66.     NVIC_DisableIRQ(ADC_IRQn);       
x史可法 发表于 2021-3-29 23:55 | 显示全部楼层
讲得满详细的 适合刚入门小白了解adc的原理
gwsan 发表于 2021-4-8 15:46 | 显示全部楼层
非常感谢楼主分享的资料啊
coshi 发表于 2021-4-8 15:47 | 显示全部楼层
最常用什么模式啊
aoyi 发表于 2021-4-8 15:48 | 显示全部楼层
讲解的非常的详细啊
drer 发表于 2021-4-8 15:57 | 显示全部楼层
是用的中断还是轮询啊
kxsi 发表于 2021-4-8 16:00 | 显示全部楼层
精度还是不错的
caigang13 发表于 2021-4-8 18:55 来自手机 | 显示全部楼层
10位有效位应该很少用吧?
caigang13 发表于 2021-4-8 18:56 来自手机 | 显示全部楼层
10位有效位应该很少用吧?
mintspring 发表于 2021-4-8 20:53 | 显示全部楼层
029SG的用过,非常给力。
便携手到老 发表于 2021-4-8 22:32 | 显示全部楼层
感谢楼主分享,很基础的知识,不错的。谢谢。
gejigeji521 发表于 2021-4-8 23:01 | 显示全部楼层
学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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