9-STM32的ADC采样和DAM配置

发布于:2025-07-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

STM32的ADC采样和DAM配置

	Adc_Init();																				//ADC初始化
	My_DMA_Config (DMA1_Channel1,(u32)&ADC1->DR,(u32)& ADC1_Value,ADC_CHANNEL_NUM*ADC_C_VAL_TIMES );//配置DMA通道
	DMA_Cmd ( DMA1_Channel1, ENABLE );          			//启动DMA通道
	ADC_SoftwareStartConvCmd ( ADC1, ENABLE );  			//启动ADC1软件转换
void Adc_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
  ADC_InitTypeDef  ADC_InitStructure;  
	
  RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA  | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC| RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO, ENABLE );
  RCC_ADCCLKConfig ( RCC_PCLK2_Div6 );		// 72M / 6 = 12M  ADC最大不能超过14M
    
    // ADC1 --- ADC8
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_6| GPIO_Pin_7 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init ( GPIOA, &GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init ( GPIOB, &GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2|GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init ( GPIOC, &GPIO_InitStructure );
	
  ADC_DeInit ( ADC1 );
   
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					//独立模式
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;						//扫描模式
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					//连续转换
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				//数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = ADC_CHANNEL_NUM;								//ADC通道数
  ADC_Init ( ADC1, &ADC_InitStructure );
    
    //规则通道配置
  ADC_RegularChannelConfig ( ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
  ADC_RegularChannelConfig ( ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );
  ADC_RegularChannelConfig ( ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );
  ADC_RegularChannelConfig ( ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );
//    ADC_RegularChannelConfig ( ADC1, ADC_Channel_5, 5, ADC_SampleTime_239Cycles5 );
//    ADC_RegularChannelConfig ( ADC1, ADC_Channel_5, 6, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_6, 5, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_7, 6, ADC_SampleTime_239Cycles5 );
//    ADC_RegularChannelConfig ( ADC1, ADC_Channel_8, 9, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_9, 7, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_10, 8, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_11, 9, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_12, 10, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_13, 11, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_14, 12, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig ( ADC1, ADC_Channel_15, 13, ADC_SampleTime_239Cycles5 );
    
  ADC_DMACmd ( ADC1, ENABLE );					//使能ADC DMA传输
  ADC_Cmd ( ADC1, ENABLE );							//使能ADC1
	
  ADC_ResetCalibration ( ADC1 );					//使能复位校准
  while ( ADC_GetResetCalibrationStatus ( ADC1 ) );	//等待复位校准结束
	
  ADC_StartCalibration ( ADC1 );					//开启AD校准
  while ( ADC_GetCalibrationStatus ( ADC1 ) );	//等待校准结束
//  ADC_SoftwareStartConvCmd ( ADC1, ENABLE );	//启动转换
}
/*DMA初始化函数*****************************************************************************/
void My_DMA_Config ( DMA_Channel_TypeDef *DMA_CHx, u32 cpar, u32 cmar, u16 cndtr )
{
	DMA_InitTypeDef DMA_InitStructure;
  RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1, ENABLE );
	
  DMA_DeInit ( DMA_CHx );
	
  DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;			//外设基地址
  DMA_InitStructure.DMA_MemoryBaseAddr = cmar;				//内存基地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;			//数据传输从外设到内存
  DMA_InitStructure.DMA_BufferSize = cndtr;					//DMA缓存
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;	//外设地址不变
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;				//内存地址递增
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据16位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;			//内存地址1位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;				//循环工作模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;			//高优先级
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;				//没有设置内存到内存传输
	
  DMA_Init ( DMA_CHx, &DMA_InitStructure );
}
/*获取ADC的电压值***************************************************************************/
void ADC_Convert_val()
{
	u8 i, j;
	memset((u8*)ADC1_Value_SUM,0x00,sizeof(ADC1_Value_SUM));
	for(i=0;i<ADC_CHANNEL_NUM;i++)
	{
		for(j=0;j<ADC_C_VAL_TIMES;j++)
		{
			ADC1_Value_SUM[i] += ADC1_Value[j][i];
		}
	}
	for(i=0;i<ADC_CHANNEL_NUM;i++)
	{
		ADC1_Value_reg[i]=ADC1_Value_SUM[i]/ADC_C_VAL_TIMES;
		ADC1_Value_Vol[i] = ADC1_Value_reg[i] *ADC_REF_V / ADC_MAX_NUM;
	}
}
/*******************************************************************************************/
/*******************************************************************************************/

网站公告

今日签到

点亮在社区的每一天
去签到