ADC采集
1.原理图
2. 电位器(Potentiometer)
符号:电位器在原理图中通常表示为一个可变电阻,具有三个端子。
连接:
- 端子 1 连接到地(GND)。
- 端子 3 连接到电源(3V3)。
- 端子 2(滑动端)作为电位器的输出端,连接到后续电路。
3.adc_dsp.c
#include "adc_dsp.h"
#include <stdio.h>
volatile uint32_t ADC_DMA_InterruptFlag;
uint16_t ADC_Buffer[10];
void ADC_Configure(void)
{
ADC_InitTypeDef ADC_InitStruct;
DMA_InitTypeDef DMA_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);
ADC_StructInit(&ADC_InitStruct);
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_Prescaler = ADC_Prescaler_16;
ADC_InitStruct.ADC_Mode = ADC_Mode_Continue;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_DMACmd(ADC1, ENABLE);
ADC_SampleTimeConfig(ADC1, ADC_Channel_3, ADC_SampleTime_240_5);
ADC_AnyChannelNumCfg(ADC1, 0);
ADC_AnyChannelSelect(ADC1, ADC_AnyChannel_0, ADC_Channel_3);
ADC_AnyChannelCmd(ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
ADC_Cmd(ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
DMA_DeInit(DMA_Channel1);
DMA_StructInit(&DMA_InitStruct);
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->ADDATA);
DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStruct.DMA_BufferSize = 30;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
DMA_InitStruct.DMA_Auto_Reload = DMA_Auto_Reload_Disable;
DMA_Init(DMA_Channel1, &DMA_InitStruct);
DMA_ClearFlag(DMA_FLAG_TC1);
DMA_ITConfig(DMA_Channel1, DMA_IT_TC, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = DMA_Channel1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x01;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
DMA_Cmd(DMA_Channel1, ENABLE);
}
void ADC_AnyChannel_ContinuousScan_DMA_Interrupt_Sample(void)
{
uint8_t i = 0;
uint32_t Sum = 0;
float Voltage;
printf("\r\nTest %s", __FUNCTION__);
ADC_Configure();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (1)
{
if (0 != ADC_DMA_InterruptFlag)
{
ADC_DMA_InterruptFlag = 0;
Sum = 0;
for (i = 0; i < 10; i++)
{
Sum += ADC_Buffer[i];
}
Voltage = (float)Sum / (float)10.0 * (float)3.3 / (float)4096.0;
printf("\r\nPOT Voltage = %0.2f", Voltage);
}
}
}
void DMA_Channel1_IRQHandler(void)
{
if (RESET != DMA_GetITStatus(DMA_IT_TC1))
{
ADC_DMA_InterruptFlag = 1;
DMA_ClearITPendingBit(DMA_IT_TC1);
}
}
4.adc_dsp.h
#include "hal_conf.h"
void GPIO_Configure(void);
extern volatile uint32_t ADC_DMA_InterruptFlag;
void ADC_AnyChannel_ContinuousScan_DMA_Interrupt_Sample(void);
5.实验现象
|