[活动专区] 【杰发科技AC7840x测评】+ ADC测试

[复制链接]
4833|6
 楼主| tlled 发表于 2023-12-6 14:55 | 显示全部楼层 |阅读模式
AC, AD, ADC, dc
测试ADC采集,调整开发板上的电位器,串口打印输出采集的电压值。

一、硬件部分电路

ADC硬件电路
电路板上有两个电位器,连接两路ADC接口
001.png

二、程序部分

2.1、adc.c
  1. #include "ac7840x.h"
  2. #include "adc_drv.h"
  3. #include "gpio_drv.h"
  4. #include "adc/adc.h"

  5. #define ADC_INDEX (0U)
  6. uint16_t g_adc_array[4] = {0};

  7. /*!
  8. * [url=home.php?mod=space&uid=247401]@brief[/url] ADCÊý¾Ýת»»´¥·¢²âÊÔ.
  9. *
  10. * @param[in]  none
  11. *
  12. * [url=home.php?mod=space&uid=266161]@return[/url] none
  13. */
  14. void ADC_TriggerTest(void)
  15. {
  16.     ADC_DRV_SoftwareStartRegularConvert(ADC_INDEX);              /*! ADCÈí¼þ´¥·¢*/
  17.     while (!ADC_DRV_GetConvCompleteFlag(ADC_INDEX, ADC_RSEQ_3)); /*! µÈ´ýADC×îºóÒ»¸öͨµÀת»»Íê³É*/

  18.     ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_0, &g_adc_array[0]); /*! »ñÈ¡¹æÔò×é0µÄת»»Öµ*/
  19.     ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_1, &g_adc_array[1]);
  20.     ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_2, &g_adc_array[2]);
  21.     ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_3, &g_adc_array[3]);

  22.     //printf("ADC_value:   VR1 = 0x%-5x VR2 = 0x%-5x TSENSOR = 0x%-5x SUPPLY = 0x%-5x \r\n", g_adc_array[0], g_adc_array[1], g_adc_array[2], g_adc_array[3]);
  23.                 printf("ADC_value:   VR1 = %2.2fV VR2 = %2.2fV \r\n", (float)(g_adc_array[0]*3.3/4096), (float)(g_adc_array[1]*3.3/4096) );
  24.        
  25. }

  26. /*!
  27. * @brief ÅäÖÃADCͨµÀ
  28. *
  29. * @param[in] instance: ADC instance number
  30. * @param[in] seq: adc sequence
  31. * @param[in] channel: adc channel
  32. * @return none
  33. */
  34. void ADC_ConfigChannel(const uint32_t instance, const adc_sequence_t seq, adc_inputchannel_t channel)
  35. {
  36.     adc_chan_config_t adcChConfig;

  37.     /*!
  38.     ADC²ÉÑùת»»Ê±¼ä¼ÆË㣺
  39.         FCLK ʱÖÓԴΪSPLLDIV2_CLK,ƵÂÊΪ60MHz
  40.         ADCCLK = FCLK/clockDivide = 60/6 = 10MHz
  41.         ×Üת»»Ê±¼ä = (SPT+ resolution£¨12/10/8£©)¡ÁADCCLKÖÜÆÚ+5¸öFCLK = (5+12)/10+5/60 ¡Ö 1.78us

  42.     ×¢Ò⣺12bit·Ö±æÂÊ×î´óת»»ÂÊΪ1Msps£¬10bit·Ö±æÂÊ×î´óת»»ÂÊΪ1.2Msps£¬8bit·Ö±æÂÊ×î´óת»»ÂÊΪ1.4Msps
  43.     */

  44.     ADC_DRV_InitChanStruct(&adcChConfig);            /*! ½á¹¹Ìå³õʼ»¯ÎªÄ¬ÈÏÖµ*/
  45.     adcChConfig.channel     = channel;               /*! ÊäÈëͨµÀÑ¡Ôñ*/
  46.     adcChConfig.spt         = ADC_SPT_CLK_5;         /*! ²ÉÑùʱ¼ä*/
  47.     adcChConfig.interruptEn = false;                 /*! EOCÖжÏʹÄÜ*/
  48.     ADC_DRV_ConfigChan(instance, seq, &adcChConfig); /*! Ó¦ÓÃͨµÀÅäÖÃ*/
  49. }

  50. void init_adc(void)
  51. {
  52.         adc_converter_config_t adcConfig;

  53.         /*! ADCÊäÈë¶Ë¿Ú£¨µçλÆ÷£©ÅäÖÃ*/
  54.         GPIO_DRV_SetMuxModeSel(VR1_PORT, VR1_PIN, PORT_PIN_DISABLED); /*! µçλÆ÷VR1*/
  55.         GPIO_DRV_SetMuxModeSel(VR2_PORT, VR2_PIN, PORT_PIN_DISABLED); /*! µçλÆ÷VR2*/

  56.         /*! ADCÅäÖÃ
  57.         ÅäÖÃADCΪ12λ·Ö±æÂÊ£¬¹¤×÷ģʽΪMODE3¹æÔò×éɨÃè+×¢Èë×éɨÃèģʽ¶àͨµÀµ¥´Îת»»£¬¹æÔò×鳤¶ÈΪ4¡£
  58.         ÿ´¥·¢Ò»´Î½øÐÐÒ»´ÎADCת»»£¬Ã¿´Îת»»¹æÔò×éÖеÄ4¸öͨµÀ¡£
  59.         */
  60.         ADC_DRV_Init(ADC_INDEX);
  61.         ADC_DRV_InitConverterStruct(&adcConfig);
  62.         adcConfig.clockDivide                = ADC_CLK_DIVIDE_6;     /*! ADCʱÖÓ·ÖÆµ¡£ADCʱÖÓÔ´Ñ¡ÔñÔÚʱÖÓ³õʼ»¯ÀïÅäÖ㬴ËÀý³ÌÑ¡ÔñΪSPLLDIV2_CLK,ƵÂÊΪ60MHz*/
  63.         adcConfig.resolution                 = ADC_RESOLUTION_12BIT; /*! ADC·Ö±æÂÊÉèÖÃ*/
  64.         adcConfig.regularTrigger             = ADC_TRIGGER_INTERNAL; /*! ¹æÔò×é´¥·¢Ô´ÀàÐÍÑ¡Ôñ*/
  65.         adcConfig.injectTrigger              = ADC_TRIGGER_INTERNAL; /*! ×¢Èë×é´¥·¢Ô´ÀàÐÍÑ¡Ôñ*/
  66.         adcConfig.dmaEnable                  = false;                /*! DMAʹÄÜλ*/
  67.         adcConfig.voltageRef                 = ADC_VOLTAGEREF_VREF;  /*! ADC²Î¿¼µçѹԴѡÔñ£¬VREF/VDDA*/
  68.         adcConfig.scanModeEn                 = true;                 /*! ¹¤×÷ģʽÅäÖãºÉ¨ÃèģʽʹÄÜ룬¶àͨµÀʱÐèҪʹÄÜɨÃèģʽ£¬µ¥¸öͨµÀʱ²»ÐèҪʹÄÜɨÃè*/
  69.         adcConfig.continuousModeEn           = false;                /*! ¹¤×÷ģʽÅäÖãºÁ¬ÐøÄ£Ê½Ê¹ÄÜ룬1£º´¥·¢ºó¿ÉÁ¬Ðø×ª»»£¬0£º´¥·¢Ò»´Îֻת»»Ò»´Î£¬×ª»»Íê³ÉºóÍ£Ö¹*/
  70.         adcConfig.regularDiscontinuousModeEn = false;                /*! ¹¤×÷ģʽÅäÖ㺹æÔò×é²»Á¬ÐøÄ£Ê½Ê¹ÄÜλ*/
  71.         adcConfig.injectDiscontinuousModeEn  = false;                /*! ¹¤×÷ģʽÅäÖãº×¢Èë×é²»Á¬ÐøÄ£Ê½Ê¹ÄÜλ*/
  72.         adcConfig.injectAutoModeEn           = false;                /*! ¹¤×÷ģʽÅäÖãº×Ô¶¯×¢ÈëģʽʹÄÜλ*/
  73.         adcConfig.intervalModeEn             = false;                /*! ¹¤×÷ģʽÅäÖ㺼ä¸ôģʽʹÄÜλ*/
  74.         adcConfig.regularDiscontinuousNum    = 0;                    /*! ¹æÔò×é×Ó×鳤¶È (ÓÃÓÚmode7)*/
  75.         adcConfig.regularSequenceLength      = 4;                    /*! ¹æÔò×鳤¶ÈÉèÖÃ*/
  76.         adcConfig.injectSequenceLength       = 0;                    /*! ×¢Èë×鳤¶ÈÉèÖÃ*/
  77.         adcConfig.powerEn                    = true;                 /*! ADCÉϵç*/
  78.         ADC_DRV_ConfigConverter(ADC_INDEX, &adcConfig);              /*! ³õʼ»¯ADCÅäÖÃ*/

  79.         /*! ADCͨµÀÅäÖÃ*/
  80.         ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_0, VR1_ADC_CH);     /*! µçλÆ÷VR1¶ÔӦͨµÀ*/
  81.         ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_1, VR2_ADC_CH);     /*! µçλÆ÷VR2¶ÔӦͨµÀ*/
  82.         ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_2, ADC_CH_TSENSOR); /*! ÄÚ²¿Î¶ȴ«¸ÐÆ÷ͨµÀ*/
  83.         ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_3, ADC_CH_SUPPLY);  /*! ÄÚ²¿¹©µçµçѹͨµÀ*/
  84. }



2.2、adc.h
  1. #ifndef _ADC_H
  2. #define _ADC_H

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif /* __cplusplus */

  6. #define VR1_PORT   (PORTC)
  7. #define VR1_PIN    (2)
  8. #define VR1_ADC_CH (ADC_CH_10)

  9. #define VR2_PORT   (PORTC)
  10. #define VR2_PIN    (3)
  11. #define VR2_ADC_CH (ADC_CH_11)


  12. void init_adc(void);
  13. void ADC_TriggerTest(void);


  14. #ifdef __cplusplus
  15. }
  16. #endif

  17. #endif


2.3、main.c
  1. int main(void)
  2. {
  3.         SystemClock_Config();
  4.         init_led();
  5.         init_key();
  6.         init_adc();
  7.         InitDebug();

  8.         while (1)
  9.         {
  10.                 led3_on();
  11.                 OSIF_TimeDelay(100);
  12.                 led3_off();
  13.                 OSIF_TimeDelay(100);
  14.                 ADC_TriggerTest();

  15.         }
  16. }



三、程序运行

编译后下载程序运行,串口输出
002.png
调整电位器VR1和VR2,相应通道的输出电压发生变化。

tpgf 发表于 2023-12-12 17:19 | 显示全部楼层
这种方式的话 是不是对电位器的调压速度有要求呢
qcliu 发表于 2023-12-12 22:22 | 显示全部楼层
如何确定一个合适的采集速度呢
drer 发表于 2023-12-13 09:34 | 显示全部楼层
因为adc采集是有电压上限的 需要加限压电阻吗
coshi 发表于 2023-12-13 09:58 | 显示全部楼层
外加电容过大会不会导致采样数据滞后啊
wiba 发表于 2023-12-13 22:45 | 显示全部楼层
这个型号的有多少路adc啊  是12位的吗
kxsi 发表于 2023-12-13 23:23 | 显示全部楼层
本身adc就有内阻 这样会不会导致采样不准啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

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