[活动] 【APM32F107VC MINIBOARD开发板测评】2.ADC与DAC

[复制链接]
933|0
 楼主| xld0932 发表于 2023-2-19 17:25 | 显示全部楼层 |阅读模式
本帖最后由 xld0932 于 2023-2-19 17:27 编辑

在极海的官网上,还没有发布APM32F107VC芯片的数据手册和用户手册,所以就先参考官方的SDK软件包的示例功能来对APM32F107和这MINI Board进行熟悉了……在官方最新的APM32F10x_SDK_V1.8软件包中ADC实现了模拟看门狗、连续采样模式、DMA方式、双ADC单元采样、以及多通道扫描采样这几个示例功能,在DAC中实现了噪声波形和DAC输出电压,ADC再进行采样的功能……我们对照DAC_ADC的功能进行熟悉和测试……

首先是配置ADC:将PA0配置为ADC功能的模拟采样端口引脚、然后对ADC1的功能参数进行初始化配置,因为只使用了一个ADC采样通道,所以配置为独立通道采样,使能连续采样模式,这样在开始ADC采样后,就会不停的去循环采样这一个通道的ADC数值了;不使用ADC触发采样的功能,采样的ADC结果使用右对齐的方式……然后将ADC通道的采样时间配置为ADC_SAMPLETIME_239CYCLES5,并使能ADC采样完成/结束的中断功能,最后使能并开始ADC采样,参考代码如下:
  1. /*!
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]       ADC Init
  3.   *
  4.   * @param       None
  5.   *
  6.   * @retval      None
  7.   *
  8.   */
  9. void ADC_Init(void)
  10. {
  11.     ADC_Config_T  ADC_ConfigStruct;
  12.     GPIO_Config_T GPIO_ConfigStruct;

  13.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);

  14.     GPIO_ConfigStructInit(&GPIO_ConfigStruct);
  15.     GPIO_ConfigStruct.pin   = GPIO_PIN_0;
  16.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  17.     GPIO_ConfigStruct.mode  = GPIO_MODE_ANALOG;
  18.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  19.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);

  20.     ADC_Reset(ADC1);

  21.     ADC_ConfigStructInit(&ADC_ConfigStruct);
  22.     ADC_ConfigStruct.mode               = ADC_MODE_INDEPENDENT;
  23.     ADC_ConfigStruct.scanConvMode       = DISABLE;
  24.     ADC_ConfigStruct.continuosConvMode  = ENABLE;
  25.     ADC_ConfigStruct.externalTrigConv   = ADC_EXT_TRIG_CONV_None;
  26.     ADC_ConfigStruct.dataAlign          = ADC_DATA_ALIGN_RIGHT;
  27.     ADC_ConfigStruct.nbrOfChannel       = 1;
  28.     ADC_Config(ADC1, &ADC_ConfigStruct);

  29.     ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_239CYCLES5);

  30.     ADC_EnableInterrupt(ADC1, ADC_INT_EOC);

  31.     NVIC_EnableIRQRequest(ADC1_2_IRQn, 1, 1);

  32.     ADC_Enable(ADC1);

  33.     ADC_EnableSoftwareStartConv(ADC1);
  34. }

其次是配置DAC:将PA4配置为DAC功能的模拟输出端口引脚,然后对DAC的功能参数进行初始化配置,不使用触发的方式和自生成的波形、配置输出BUFFER使能及DAC_LFSR_MASK_BIT11_1的功能位,最后使能DAC,参考代码如下……
  1. /*!
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]       DAC Init
  3.   *
  4.   * @param       None
  5.   *
  6.   * @retval      None
  7.   *
  8.   */
  9. void DAC_Init(void)
  10. {
  11.     DAC_Config_T  DAC_ConfigStruct;
  12.     GPIO_Config_T GPIO_ConfigStruct;

  13.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);

  14.     GPIO_ConfigStructInit(&GPIO_ConfigStruct);
  15.     GPIO_ConfigStruct.pin   = GPIO_PIN_4;
  16.     GPIO_ConfigStruct.mode  = GPIO_MODE_ANALOG;
  17.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  18.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_DAC);

  19.     DAC_ConfigStructInit(&DAC_ConfigStruct);
  20.     DAC_ConfigStruct.trigger             = DAC_TRIGGER_NONE;
  21.     DAC_ConfigStruct.outputBuffer        = DAC_OUTPUT_BUFFER_ENBALE;
  22.     DAC_ConfigStruct.waveGeneration      = DAC_WAVE_GENERATION_NONE;
  23.     DAC_ConfigStruct.maskAmplitudeSelect = DAC_LFSR_MASK_BIT11_1;
  24.     DAC_Config(DAC_CHANNEL_1, &DAC_ConfigStruct);

  25.     DAC_Enable(DAC_CHANNEL_1);
  26. }

最后我们看一下在ADC通道采样完成中断函数中的处理:通过DAC_ConfigChannel1Data函数配置DAC通道引脚输出不同电压值,为下次的ADC采样作准备;然后ADC读取上次ADC转换完成的转换结果,将其换算成对应的电压值,将其通过串口把结果打印出来……根据换算的电压值对其电压所处的范围进行判断,然后通过LED显示其对应的状态……最后清除此次的ADC中断标志位,ADC将继续下一循的采样处理,参考代码数下:
  1. /*!
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]     This function handles ADC interrupt Handler
  3.   *
  4.   * @param     None
  5.   *
  6.   * @retval    None
  7.   *
  8.   * @note
  9.   */
  10. void ADC1_2_IRQHandler(void)
  11. {
  12.     uint16_t ADC_Data = 0;
  13.     uint16_t Voltage  = 0;

  14.     DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, DAC_Data);

  15.     DAC_Data = (DAC_Data + 0x7F) % 0x0FFF;

  16.     if (ADC_ReadStatusFlag(ADC1, ADC_FLAG_EOC))
  17.     {
  18.         ADC_Data = ADC_ReadConversionValue(ADC1);

  19.         Voltage = (ADC_Data * 3300) / 4095;

  20.         printf("\r\nVoltage : %d mV\r\n", Voltage);

  21.         if (Voltage > 2000)            /* Voltage greater than 2000mv */
  22.         {
  23.             LED_Enable(2, ENABLE);
  24.             LED_Enable(3, DISABLE);
  25.         }
  26.         else if (Voltage < 800)        /* Voltage less than 800mv */
  27.         {
  28.             LED_Enable(2, DISABLE);
  29.             LED_Enable(3, ENABLE);
  30.         }
  31.         else                           /* 800mv <= Voltage <= 2000 */
  32.         {
  33.             LED_Enable(2, ENABLE);
  34.             LED_Enable(3, ENABLE);
  35.         }

  36.         for(uint32_t i = 0; i < 0xFFFFF; i++)
  37.         {
  38.         }

  39.         ADC_ClearStatusFlag(ADC1, ADC_FLAG_EOC);
  40.     }
  41. }

测试时我们将编译无误的程序下载到开发板,然后将PA0的ADC采样引脚与PA4的DAC输出引脚通过排线进行短接在一起,这样才能够正常测试其功能,通过LED灯的显示状态查看运行结果……
软件工程源代码:
Project_ADC_DAC.zip (483.83 KB, 下载次数: 8)

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

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

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