找回密码
 立即注册

只需一步,快速开始

搜索

【FM33LG0系列开发板测评】ADC、DAC

0
回复
1950
查看
[复制链接]

166

主题

343

帖子

3076

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3076
QQ
2022-1-5 16:31:11 显示全部楼层 |阅读模式
【FM33LG0系列开发板测评】ADC&DAC

原帖地址:【FM33LG0系列开发板测评】03.ADC、DAC - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

1、简介

FM33LG0带有最高采样率达到2Msps的12bit SAR-ADC,支持单端输入和差分输入,可以自由选择VREFP或者VDDA作为REF+参考电压,方便灵活;带有一个最高输出率为1Msps,12位的电压输出型数模转换器,需要注意的是DAC使用VREF+作为参考基准,所以在开发板上需要将J40的VP与V用跳帽进行短接!


2、实现功能

使用板载的ADC和DAC扩展接口进行功能验证,ADC使用单通道采集的方式,依次对CH15、CH16、CH17进行采样,计算并打印出电压值;DAC输出通道使用软件写入数据的方式实现正弦波形的输出;最后通过接线的方式,将CH15接VCC、CH16接DAC输出、CH17接GND,来测试在相邻通道的电压值快速变化的情况下,是否会对相邻通道的采样值产生影响。


3、代码实现

  1. /*******************************************************************************
  2. * @file    ADC.c
  3. * @author  King
  4. * @version V1.00
  5. * @date 27-Nov-2021
  6. * @brief ......
  7. *******************************************************************************/


  8. /* Define to prevent recursive inclusion -------------------------------------*/
  9. #define __ADC_C__


  10. /* Includes ------------------------------------------------------------------*/
  11. #include "ADC.h"


  12. /* Private typedef -----------------------------------------------------------*/
  13. /* Private define ------------------------------------------------------------*/
  14. /* Private macro -------------------------------------------------------------*/
  15. /* Private variables ---------------------------------------------------------*/
  16. /* Private function prototypes -----------------------------------------------*/
  17. /* Private functions ---------------------------------------------------------*/


  18. /* Exported variables --------------------------------------------------------*/
  19. /* Exported function prototypes ----------------------------------------------*/


  20. /*******************************************************************************
  21. * @brief      
  22. * @param      
  23. * @retval      
  24. * @attention *******************************************************************************/
  25. void ADC_Configure(void)
  26. {
  27.     FL_GPIO_InitTypeDef      GPIO_InitStruct;
  28.     FL_ADC_CommonInitTypeDef ADC_CommonInitStruct;
  29.     FL_ADC_InitTypeDef       ADC_InitStruct ;

  30.     FL_GPIO_StructInit(&GPIO_InitStruct);
  31.     GPIO_InitStruct.pin        = FL_GPIO_PIN_10 | FL_GPIO_PIN_11 | FL_GPIO_PIN_12;
  32.     GPIO_InitStruct.mode       = FL_GPIO_MODE_ANALOG;
  33.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  34.     FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  35.     FL_ADC_CommonStructInit(&ADC_CommonInitStruct);
  36.     ADC_CommonInitStruct.operationSource   = FL_ADC_CLK_SOURCE_ADCCLK;
  37.     ADC_CommonInitStruct.clockSource       = FL_CMU_ADC_CLK_SOURCE_RCHF;
  38.     ADC_CommonInitStruct.clockPrescaler    = FL_CMU_ADC_PSC_DIV8;
  39.     ADC_CommonInitStruct.APBClockPrescaler = FL_ADC_APBCLK_PSC_DIV1;
  40.     ADC_CommonInitStruct.referenceSource   = FL_ADC_REF_SOURCE_VDDA;
  41.     ADC_CommonInitStruct.bitWidth          = FL_ADC_BIT_WIDTH_12B;
  42.     FL_ADC_CommonInit(&ADC_CommonInitStruct);

  43.     FL_ADC_StructInit(&ADC_InitStruct);
  44.     ADC_InitStruct.conversionMode        = FL_ADC_CONV_MODE_SINGLE;
  45.     ADC_InitStruct.autoMode              = FL_ADC_SINGLE_CONV_MODE_AUTO;
  46.     ADC_InitStruct.waitMode              = FL_ENABLE;
  47.     ADC_InitStruct.overrunMode           = FL_ENABLE;
  48.     ADC_InitStruct.scanDirection         = FL_ADC_SEQ_SCAN_DIR_FORWARD;
  49.     ADC_InitStruct.externalTrigConv      = FL_ADC_TRIGGER_EDGE_NONE;
  50.     ADC_InitStruct.triggerSource         = FL_ADC_TRGI_LUT0;
  51.     ADC_InitStruct.fastChannelTime       = FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK;
  52.     ADC_InitStruct.lowChannelTime        = FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK;
  53.     ADC_InitStruct.oversamplingMode      = FL_ENABLE;
  54.     ADC_InitStruct.overSampingMultiplier = FL_ADC_OVERSAMPLING_MUL_8X;
  55.     ADC_InitStruct.oversamplingShift     = FL_ADC_OVERSAMPLING_SHIFT_3B;
  56.     FL_ADC_Init(ADC, &ADC_InitStruct);

  57.     TASK_Append(TASK_ID_ADC, ADC_Handler, 500);
  58. }


  59. /*******************************************************************************
  60. * @brief      
  61. * @param      
  62. * @retval      
  63. * @attention   
  64. *******************************************************************************/
  65. uint32_t ADC_GetSingleChannelSample(uint32_t Channel)
  66. {
  67.     uint16_t Data = 0;

  68.     FL_CMU_SetADCPrescaler(FL_CMU_ADC_PSC_DIV1);
  69.     FL_ADC_EnableSequencerChannel(ADC, Channel);

  70.     FL_ADC_ClearFlag_EndOfConversion(ADC);
  71.     FL_ADC_Enable(ADC);

  72.     FL_ADC_EnableSWConversion(ADC);
  73.     while(FL_ADC_IsActiveFlag_EndOfConversion(ADC) == FL_RESET);

  74.     FL_ADC_ClearFlag_EndOfConversion(ADC);
  75.     Data = FL_ADC_ReadConversionData(ADC);

  76.     FL_ADC_Disable(ADC);
  77.     FL_ADC_DisableSequencerChannel(ADC, Channel);

  78.     return Data;
  79. }


  80. /*******************************************************************************
  81. * @brief      
  82. * @param      
  83. * @retval      
  84. * @attention   
  85. *******************************************************************************/
  86. void ADC_Handler(void)
  87. {
  88.     uint32_t CH15_Data = 0, CH16_Data = 0, CH17_Data = 0;

  89.     CH15_Data = ADC_GetSingleChannelSample(FL_ADC_EXTERNAL_CH15);
  90.     CH16_Data = ADC_GetSingleChannelSample(FL_ADC_EXTERNAL_CH16);
  91.     CH17_Data = ADC_GetSingleChannelSample(FL_ADC_EXTERNAL_CH17);

  92.     printf("\r\nCH15 : %0.1fV, CH16 : %0.1fV, CH17 : %0.1fV",
  93.             (float)CH15_Data / 4095 * 3.3,
  94.             (float)CH16_Data / 4095 * 3.3,
  95.             (float)CH17_Data / 4095 * 3.3);
  96. }


  97. /******************* (C) COPYRIGHT 2021 *************************END OF FILE***/
复制代码
  1. /*******************************************************************************
  2. * @file    DAC.c
  3. * @author  King
  4. * @version V1.00
  5. * @date    27-Nov-2021
  6. * @brief   ......
  7. *******************************************************************************/


  8. /* Define to prevent recursive inclusion -------------------------------------*/
  9. #define __DAC_C__


  10. /* Includes ------------------------------------------------------------------*/
  11. #include "DAC.h"


  12. /* Private typedef -----------------------------------------------------------*/
  13. /* Private define ------------------------------------------------------------*/
  14. /* Private macro -------------------------------------------------------------*/
  15. /* Private variables ---------------------------------------------------------*/
  16. /* Private function prototypes -----------------------------------------------*/
  17. /* Private functions ---------------------------------------------------------*/


  18. /* Exported variables --------------------------------------------------------*/
  19. /* Exported function prototypes ----------------------------------------------*/


  20. /*******************************************************************************
  21. * @brief      
  22. * @param      
  23. * @retval      
  24. * @attention   
  25. *******************************************************************************/
  26. void DAC_Configure(void)
  27. {
  28.     FL_GPIO_InitTypeDef GPIO_InitStruct;
  29.     FL_DAC_InitTypeDef  DAC_InitStruct;

  30.     FL_GPIO_StructInit(&GPIO_InitStruct);
  31.     GPIO_InitStruct.pin        = FL_GPIO_PIN_5;
  32.     GPIO_InitStruct.mode       = FL_GPIO_MODE_ANALOG;
  33.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  34.     FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  35.     FL_DAC_StructInit(&DAC_InitStruct);
  36.     DAC_InitStruct.sampleHoldMode = FL_DISABLE;
  37.     DAC_InitStruct.sampleTime     = 0xFF;
  38.     DAC_InitStruct.holdTime       = 0x00;
  39.     DAC_InitStruct.triggerMode    = FL_DISABLE;
  40.     DAC_InitStruct.triggerSource  = FL_DAC_TRGI_SOFTWARE;
  41.     DAC_InitStruct.bufferMode     = FL_DISABLE;
  42.     DAC_InitStruct.switchMode     = FL_ENABLE;
  43.     FL_DAC_Init(DAC, &DAC_InitStruct);

  44.     FL_DAC_Enable(DAC);
  45.     FL_DAC_WriteData(DAC, 2047);

  46.     TASK_Append(TASK_ID_DAC, DAC_Handler, 1);
  47. }


  48. /*******************************************************************************
  49. * @brief      
  50. * @param      
  51. * @retval      
  52. * @attention   
  53. *******************************************************************************/
  54. void DAC_Handler(void)
  55. {
  56.     uint16_t WaveData[1284] =
  57.     {
  58.         2047,2147,2248,2347,2446,2545,2641,2737,2831,2922,
  59.         3012,3100,3185,3267,3346,3422,3495,3564,3630,3692,
  60.         3749,3803,3853,3898,3939,3975,4006,4033,4055,4072,
  61.         4085,4092,4095,4092,4085,4072,4055,4033,4006,3975,
  62.         3939,3898,3853,3803,3749,3692,3630,3564,3495,3422,
  63.         3346,3267,3185,3100,3012,2922,2831,2737,2641,2545,
  64.         2446,2347,2248,2147,2047,1947,1846,1747,1648,1549,
  65.         1453,1357,1263,1172,1082, 994, 909, 827, 748, 672,
  66.          599, 530, 464, 402, 345, 291, 241, 196, 155, 119,
  67.           88,  61,  39,  22,   9,   2,   0,   2,   9,  22,
  68.           39,  61,  88, 119, 155, 196, 241, 291, 345, 402,
  69.          464, 530, 599, 672, 748, 827, 909, 994,1082,1172,
  70.         1263,1357,1453,1549,1648,1747,1846,1947
  71.     };

  72.     static uint8_t WaveIndex = 0;

  73.     FL_DAC_WriteData(DAC, WaveData[WaveIndex]);

  74.     WaveIndex = (WaveIndex + 1) % 128;
  75. }


  76. /******************* (C) COPYRIGHT 2021 *************************END OF FILE***/

复制代码

4、测试数据

DAC初始化完成后,设定输出VREF+一半的电压值:

11111.jpg

软件方式实现正弦波输出:

2222.jpg

各个通道采样稳定,没有受到相邻通道的影响:

3333.jpg

5、工程源码

Project_ADC_DAC.zip (356.96 KB, 下载次数: 157)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

返回顶部