新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2019-3-12
- 在线时间
- 2 小时
|

楼主 |
发表于 2019-3-17 15:14:01
|
显示全部楼层
#include "ADC.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_dma.h"
#include "delay.h"
#define N 101
uint16_t RegularConvData_Tab[101][4];
void ADC_NAN_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//GPIOC Periph clock enable
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
//ADC1 Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
//DMA
DMA_DeInit(DMA1_Channel1); //DMAí¨μà
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//ADC1_DR_Address;//íaéèμØÖ·&ADC1->DR
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RegularConvData_Tab;//Äú′æμØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//íaéè×÷Îaêy¾Y′«êäμÄà′Ô′
DMA_InitStructure.DMA_BufferSize = 404;//»o3åÇøμÄ′óD¡óëêy×éμĸöêyò»Ñù
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéèμØÖ·¼Ä′æÆ÷2»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//Äú′æμØÖ·¼Ä′æÆ÷μYÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//êy¾Y¿í¶èÎa16λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//êy¾Y¿í¶èÎa16λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//á¬Dø2»¶Ï1¤×÷Ä£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA_Priorityé趨DMAí¨μàxμÄèí¼tóÅÏè¼¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);// DMA1 Channel1 enable
//Configure ADC Channel11 as analog input
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//ADC1 Configuration
//ADCs DeInit
ADC_DeInit(ADC1);
ADC_StructInit(&ADC_InitStructure);//???ADC??
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//ADC·Ö±æÂê
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//1¤×÷Ôúá¬Dø×a»»Ä£ê½
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//×a»»óéèí¼t¶ø2»êÇía2¿′¥·¢Æô¶ˉ
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADCêy¾Yóò¶ÔÆë
//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;//äˉàà·½Ïò
ADC_Init(ADC1, &ADC_InitStructure);
//ADC1×a»»í¨μ࣬ÖüÆú2éÑùê±¼ä
ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);//PA1
ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_239_5Cycles);//PA2
ADC_ChannelConfig(ADC1, ADC_Channel_3 , ADC_SampleTime_239_5Cycles);//PA3
ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_239_5Cycles);//PA4
ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); // Enable ADC_DMA
ADC_GetCalibrationFactor(ADC1);//ADCD£×¼
ADC_Cmd(ADC1, ENABLE); //ÆôóÃADCíaéè
ADC_DMACmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); //μè′yADC1D£×¼íê3é
//ADC_SoftwareStartConvCmd(ADC1, ENABLE);
ADC_StartOfConversion(ADC1);
}
uint32_t count,i,j,a,temp;
uint32_t ResultVolt[4];
//ch:í¨μàÖμ 1~4w
Get_Adc()
{
for(a=0;a<4;a++)//M-í¨μàêy
{
ResultVolt[a]=0;
for(j=0;j<N;j++)
{
ResultVolt[a]+=RegularConvData_Tab[j][a];
}
ResultVolt[a]=ResultVolt[a]/N;
/*for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( RegularConvData_Tab[i][a]>RegularConvData_Tab[i+1][a] )
{
temp = RegularConvData_Tab[i][a];
RegularConvData_Tab[i][a] = RegularConvData_Tab[i+1][a];
RegularConvData_Tab[i+1][a] = temp;
}
}
} */
//ResultVolt[a]=RegularConvData_Tab[(N-1)/2][a];
//return ResultVolt[a];
}
}
|
|