|
发表于 2020-7-7 16:35:50
|
显示全部楼层
这是STM32F205的ADC,采集程序,希望有用。
#include "use.h"
float Get_Temper(unsigned int Temper);
//**************************************************************
#define Max_U_5V (5.02)
#define Max_U_ao (0.47)
//**************************************************************
#define U_K ((float)Max_U_5V/(float)Max_U_ao) //分压比!
//*********************************************************************
#define ADC_Converted_cnt 202 //公用64个数据运行算+2个极值数据(去掉)
#define ADC_CH 9 //1,2,...8, 9=dc,10=wendu 通道数
static unsigned short ADC_Value[ ADC_CH*ADC_Converted_cnt ]; //adc获取的原始数据
static float Uo[ADC_CH]; //数据:12v电压,电池电压,基准电压,温度
/*********************************************************************************************************
************************************************************
**函数名称:uint8 SetADnCH()
**函数功能:设置AD转换通道
**入口参数:CHn AD通道(10-13)
**出口参数:
**说明: ad=10,11,12,13 对应:PC0,1,2,3口
********************************************************************************************************/
//********************************************************************************************************/
void SetAD_CH(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_1 | GPIO_Pin_5;// | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure); //用PC口
}
//**************************************************************
//个模式先读取Ad的值处理
/**
* @brief ADC1 Channel Vbat configuration (DMA, ADC, CLK)
* @param None
* @retval None
*/
void Init_AD(void){
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
/* Enable peripheral clocks *************************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* DMA2_Stream0 channel0 configuration **************************************/
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr =(unsigned int)&(ADC1->DR);// (uint32_t)ADC1_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC_Value;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = ADC_CH*ADC_Converted_cnt;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
/* DMA2_Stream0 enable */
DMA_Cmd(DMA2_Stream0, ENABLE);
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode =ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC1 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //关闭外部触发源!!!
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; //这个没有用啊。
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = ADC_CH;
ADC_Init(ADC1, &ADC_InitStructure);
/* Enable ADC1 DMA */
// ADC_DMACmd(ADC1, ENABLE);
/* ADC1 regular channel18 (VBAT) configuration ******************************/
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_480Cycles); //NTC电压!!
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_480Cycles); //工作电压
ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 7, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 8, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_Vbat, 9, ADC_SampleTime_480Cycles);
/* Enable VBAT channel */
ADC_VBATCmd(ENABLE);
ADC_TempSensorVrefintCmd(ENABLE);
/* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
/* Enable ADC3 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 **************************************************************/
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv(ADC1);
}
//***************************************************************************************************
//模拟读AD值! 参考电压=3.3v U=Val*1000/1024*3.3
//***************************************************************************************************
void AD_Start(void){
SetAD_CH();
Init_AD();
}
//******************************************************************************
//AD数据转换处理!
void Get_ADC_Covert_Value(unsigned int *p){
unsigned char i,j;
unsigned int MAX ;
unsigned int MIN ;
unsigned int adc_temp;
unsigned int adc_sum;
for(j=0;j<ADC_CH;j++){ //读取4个通道数据
adc_sum = 0; //总数值初始化
MAX = 0; //最大值初始化
MIN = 0xffffffff; //最小值初始化
for(i=0;i<ADC_Converted_cnt;i++){
adc_temp = ADC_Value[j+i*ADC_CH];
adc_sum += adc_temp; //累加
if( adc_temp > MAX ) MAX = adc_temp;
if( adc_temp < MIN ) MIN = adc_temp;
}
adc_sum -= MAX ; //去掉最大值
adc_sum -= MIN ; //去掉最小值
p[j] = adc_sum / (ADC_Converted_cnt - 2); //求均值
}
}
//**********************************************************************************
void Get_Value_AD(void){
unsigned int u[ADC_CH];
unsigned char i;
Get_ADC_Covert_Value(u);
//**************************************************
//2013-5-13 添加处理
for(i=0;i<ADC_CH;i++){
Uo[i]=(float)u[i]*MAX_U_VREF/(1024*4);//得到电压值 MV
}
}
//********************************************************************
//传出数据 2014-1-18
void HW_CpuHeatInit( void ){ // CPU内部温度检测初始化
AD_Start();
}
//**********************************************************************
//温度处理
// Uo[1] = (Uo[1]-760)/2.5 + 25; //760
signed char HW_GetCpuHeat( void ){ // 获取CPU内部温度值
return (signed char )((Uo[6]-760)/2.5 + 25);
}
//************************************************************************
//稳压电源输入的电源
float HW_GetWorkVoltage( void ){ // 获取工作值 v
return Uo[5]*U_K/1000;
}
//************************************************************************
float HW_GetBatteryVoltage( void ){ // 获取电池值 v
return Uo[8]*2/1000; //VBAT要乘以2 500=>U*2/1000;
}
//*****************************************************************************
//计算NTC的电压值,单位MV
float Get_NTC_Value(void){
return Uo[4];
}
//*****************************************************************************
//4路ADC采集数据处理,注意分清楚是电压分压还是电流分流
//初始电压在变量Uo[0-3] 内 分压比是1:1
//*****************************************************************************
void Get_ADC_Value_U (float *p){
*p++ =Uo[0]/1000/I1_k; //得到V!值之后,转换成电流!!
*p++ =Uo[1]/1000/I2_k; //得到V!值之后,转换成电流!!
*p++ =Uo[2]/1000/I3_k; //得到V!值之后,转换成电流!!
*p =Uo[3]/1000/I4_k; //得到V!值之后,转换成电流!!
}
|
|