[MM32硬件] 【灵动微电子MM32F0121测评】7.ADC采集

[复制链接]
 楼主| 阿源玩电子 发表于 2025-6-30 21:01 | 显示全部楼层 |阅读模式
ADC采集

1.原理图

ADC原理图.jpg

2. 电位器(Potentiometer)
符号:电位器在原理图中通常表示为一个可变电阻,具有三个端子。
连接:
  • 端子 1 连接到地(GND)。
  • 端子 3 连接到电源(3V3)。
  • 端子 2(滑动端)作为电位器的输出端,连接到后续电路。
3.adc_dsp.c
  1. #include "adc_dsp.h"
  2. #include <stdio.h>

  3. volatile uint32_t ADC_DMA_InterruptFlag;
  4. uint16_t ADC_Buffer[10];

  5. void ADC_Configure(void)
  6. {
  7.     ADC_InitTypeDef  ADC_InitStruct;
  8.     DMA_InitTypeDef  DMA_InitStruct;
  9.     GPIO_InitTypeDef GPIO_InitStruct;
  10.     NVIC_InitTypeDef NVIC_InitStruct;

  11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);

  12.     ADC_StructInit(&ADC_InitStruct);
  13.     ADC_InitStruct.ADC_Resolution       = ADC_Resolution_12b;
  14.     ADC_InitStruct.ADC_Prescaler        = ADC_Prescaler_16;
  15.     ADC_InitStruct.ADC_Mode             = ADC_Mode_Continue;
  16.     ADC_InitStruct.ADC_DataAlign        = ADC_DataAlign_Right;
  17.     ADC_Init(ADC1, &ADC_InitStruct);

  18.     ADC_DMACmd(ADC1, ENABLE);

  19.     ADC_SampleTimeConfig(ADC1, ADC_Channel_3, ADC_SampleTime_240_5);
  20.     ADC_AnyChannelNumCfg(ADC1, 0);
  21.     ADC_AnyChannelSelect(ADC1, ADC_AnyChannel_0, ADC_Channel_3);
  22.     ADC_AnyChannelCmd(ADC1, ENABLE);

  23.     RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);

  24.     GPIO_StructInit(&GPIO_InitStruct);
  25.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_3;
  26.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  27.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AIN;
  28.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  29.     ADC_Cmd(ADC1, ENABLE);

  30.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);

  31.     DMA_DeInit(DMA_Channel1);

  32.     DMA_StructInit(&DMA_InitStruct);
  33.     DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->ADDATA);
  34.     DMA_InitStruct.DMA_MemoryBaseAddr     = (uint32_t)ADC_Buffer;
  35.     DMA_InitStruct.DMA_DIR                = DMA_DIR_PeripheralSRC;
  36.     DMA_InitStruct.DMA_BufferSize         = 30;
  37.     DMA_InitStruct.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
  38.     DMA_InitStruct.DMA_MemoryInc          = DMA_MemoryInc_Enable;
  39.     DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  40.     DMA_InitStruct.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;
  41.     DMA_InitStruct.DMA_Mode               = DMA_Mode_Circular;
  42.     DMA_InitStruct.DMA_Priority           = DMA_Priority_High;
  43.     DMA_InitStruct.DMA_M2M                = DMA_M2M_Disable;
  44.     DMA_InitStruct.DMA_Auto_Reload        = DMA_Auto_Reload_Disable;
  45.     DMA_Init(DMA_Channel1, &DMA_InitStruct);

  46.     DMA_ClearFlag(DMA_FLAG_TC1);
  47.     DMA_ITConfig(DMA_Channel1, DMA_IT_TC, ENABLE);

  48.     NVIC_InitStruct.NVIC_IRQChannel = DMA_Channel1_IRQn;
  49.     NVIC_InitStruct.NVIC_IRQChannelPriority = 0x01;
  50.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  51.     NVIC_Init(&NVIC_InitStruct);

  52.     DMA_Cmd(DMA_Channel1, ENABLE);
  53. }

  54. void ADC_AnyChannel_ContinuousScan_DMA_Interrupt_Sample(void)
  55. {
  56.     uint8_t  i   = 0;
  57.     uint32_t Sum = 0;
  58.     float    Voltage;

  59.     printf("\r\nTest %s", __FUNCTION__);

  60.     ADC_Configure();

  61.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  62.     while (1)
  63.     {
  64.         if (0 != ADC_DMA_InterruptFlag)
  65.         {
  66.             ADC_DMA_InterruptFlag = 0;

  67.             Sum = 0;

  68.             for (i = 0; i < 10; i++)
  69.             {
  70.                 Sum += ADC_Buffer[i];
  71.             }

  72.             Voltage = (float)Sum / (float)10.0 * (float)3.3 / (float)4096.0;

  73.             printf("\r\nPOT Voltage = %0.2f", Voltage);
  74.         }
  75.     }
  76. }


  77. void DMA_Channel1_IRQHandler(void)
  78. {
  79.     if (RESET != DMA_GetITStatus(DMA_IT_TC1))
  80.     {
  81.         ADC_DMA_InterruptFlag = 1;

  82.         DMA_ClearITPendingBit(DMA_IT_TC1);
  83.     }
  84. }
4.adc_dsp.h
  1. #include "hal_conf.h"

  2. void GPIO_Configure(void);
  3. extern volatile uint32_t ADC_DMA_InterruptFlag;
  4. void ADC_AnyChannel_ContinuousScan_DMA_Interrupt_Sample(void);
5.实验现象
ADC.gif



MM32F0121C6PV_07ADC.zip

6.32 MB, 下载次数: 1

jf101 发表于 2025-6-30 23:36 | 显示全部楼层
ADC非常不错的案例分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

33

帖子

0

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