uint16_t AdcMcuRead( Adc_t *obj, uint8_t channel ) { uint16_t adcData = 0; /* Enable The HSI (16Mhz) */ RCC_HSICmd( ENABLE ); /* Check that HSI oscillator is ready */ while( RCC_GetFlagStatus( RCC_FLAG_HSIRDY ) == RESET ); RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE ); // Temperature or Vref measurement if( ( channel == ADC_Channel_16 ) || ( channel == ADC_Channel_17 ) ) { // Yes, enable temperature sensor and internal reference voltage ADC_TempSensorVrefintCmd( ENABLE ); } // Configure selected channel ADC_RegularChannelConfig( ADC1, channel, 1, ADC_SampleTime_192Cycles ); /* Define delay between ADC1 conversions */ ADC_DelaySelectionConfig( ADC1, ADC_DelayLength_Freeze ); /* Enable ADC1 Power Down during Delay */ ADC_PowerDownCmd( ADC1, ADC_PowerDown_Idle_Delay, ENABLE ); /* Enable ADC1 */ ADC_Cmd( ADC1, ENABLE ); /* Wait until ADC1 ON status */ while( ADC_GetFlagStatus( ADC1, ADC_FLAG_ADONS ) == RESET ) { } /* Start ADC1 Software Conversion */ ADC_SoftwareStartConv( ADC1 ); /* Wait until ADC Channel 5 or 1 end of conversion */ while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) == RESET ) { } adcData = ADC_GetConversionValue( ADC1 ); ADC_Cmd( ADC1, DISABLE ); if( ( channel == ADC_Channel_16 ) || ( channel == ADC_Channel_17 ) ) { // De-initialize ADC ADC_TempSensorVrefintCmd( DISABLE ); } RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, DISABLE ); RCC_HSICmd( DISABLE ); return adcData; }
uint16_t vref_read(void) { ADC_TempSensorVrefintCmd(ENABLE); /* Wait until ADC + Temp sensor start */ uint16_t T_StartupTimeDelay = 1024; while (T_StartupTimeDelay--); /* Enable Vrefint channel: Channel17 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_28Cycles5); /* initialize result */ uint16_t res = 0; /* start ADC convertion by software */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* wait until end-of-covertion */ while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 ); /* read ADC convertion result */ res = ADC_GetConversionValue(ADC1); /* de-initialize ADC */ ADC_TempSensorVrefintCmd(DISABLE); return (res); }
/** * @brief Internal VREF measurement using ADC Channel 17. * @param None * @retval Internal VREF ADC converted value. */ uint16_t IDD_Measurement_ADC_Supply(void) { uint16_t adcdata = 0x0, i = 0x00; /* ADC1 configuration ------------------------------------------------------*/ IDD_Measurement_ADC_Config(); ADC_TempSensorVrefintCmd(ENABLE); /* ADC1 regular channel 17 for VREF configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_192Cycles); /* Start ADC conversion by software */ ADC_SoftwareStartConv(ADC1); /* Initialize result */ for(i = 4; i > 0; i--) { /* Wait until end-of-conversion */ while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0) { } /* Read ADC conversion result */ adcdata += ADC_GetConversionValue(ADC1); } /* Deinitialize ADC */ ADC_TempSensorVrefintCmd(DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); return (adcdata >> 2); }
/** * @brief To return the supply measurmeent * @caller several functions * @param None * @retval ADC value */ uint16_t ADC_Supply(void) { uint8_t i; uint16_t res; /* Initializes ADC */ ADC_Icc_Init(); ADC_TempSensorVrefintCmd(ENABLE); /* ADC1 regular channel 17 for VREF configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_192Cycles); /* initialize result */ res = 0; for(i=4; i>0; i--) { /* start ADC convertion by software */ ADC_SoftwareStartConv(ADC1); /* wait until end-of-covertion */ while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 ); /* read ADC convertion result */ res += ADC_GetConversionValue(ADC1); } /* de-initialize ADC */ ADC_TempSensorVrefintCmd(DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); return (res>>2); }
int temperature_setup() { ADC_InitTypeDef adc_init_s; //Initializes definitions of SDC ADC_CommonInitTypeDef adc_common_init_s; //Used to def common paramters for ADC peripheral ADC_DeInit(); //reset ADC peripheral value to their defaults RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //Enable Power for APB2 bus connected to ADC1 (temp sensor) adc_common_init_s.ADC_Mode = ADC_Mode_Independent; //Configures the ADC for indepedent mode adc_common_init_s.ADC_Prescaler = ADC_Prescaler_Div2; //Sets Frequency of the clock to ADC. Count 0 and 1. adc_common_init_s.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //turn off direct memory access mode adc_common_init_s.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //sets the delay between two sampling phases as 5 ADC_CommonInit(&adc_common_init_s); //initializes the struct for values set (above) adc_init_s.ADC_Resolution = ADC_Resolution_12b; //Configures the ADC resolution 12 bits adc_init_s.ADC_ScanConvMode = DISABLE; //sets conversion to Single channel mode adc_init_s.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //Set the external trigger edge to none adc_init_s.ADC_DataAlign = ADC_DataAlign_Right; //MSB in register is 0, data saved starting from LSB adc_init_s.ADC_NbrOfConversion = 1; //Specifies the number of ADC conversions that will be done ADC_TempSensorVrefintCmd(ENABLE); //wake up desired sensor (temp) ADC_Cmd(ADC1, ENABLE); //turn on the ADC1 peripheral ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_480Cycles); //Configures ADC1_channel 16 which is the tempature sensor ADC_Init(ADC1, &adc_init_s); //initialize ADC1 new_filter.avg = 0, new_filter.replace = 0, new_filter.sum = 0; return 0; }
void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div6); // PCLK2 is the APB2 clock, ADCCLK = PCLK2/6 = 60/6 = 10MHz RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // Enable ADC1 clock so that we can talk to it ADC_DeInit(ADC1); // Put everything back to power-on defaults ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC2 not depenedent on ADC1 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // Disable the scan conversion so we do one at a time ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // Don't do contimuous conversions - do them on demand ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // Start conversin by software, not an external trigger ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // Conversions are 12 bit - put them in the lower 12 bits of the result ADC_InitStructure.ADC_NbrOfChannel = 1; // How many channels would be used by the sequencer ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); // Enable ADC1 reset calibaration register while(ADC_GetResetCalibrationStatus(ADC1)); // Check the end of ADC1 reset calibration register ADC_StartCalibration(ADC1); // Start ADC1 calibaration while(ADC_GetCalibrationStatus(ADC1)); // Check the end of ADC1 calibration ADC_TempSensorVrefintCmd(ENABLE); // enable Vrefint and Temperature sensor GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // Pin #0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // as analog input GPIO_Init(GPIOB, &GPIO_InitStructure); // for Port B }
void InternalTempSensor::initTempSensor() { temp = 0; calibration = 0; ADC_DeInit(); ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div8; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode = DISABLE; ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStruct); ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles); ADC_TempSensorVrefintCmd(ENABLE); ADC_Cmd(ADC1, ENABLE); }
void ADC_init(void) { /*Defining the ADC initial parameter setting structures*/ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef adc_common_init_s; /*Enabling clock on bus APB2 to peripheral ADC1*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /*Setting the parameters for the ADC and initializing*/ adc_common_init_s.ADC_Mode = ADC_Mode_Independent; adc_common_init_s.ADC_Prescaler = ADC_Prescaler_Div2; //Half the APB2 speed adc_common_init_s.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //No DMA adc_common_init_s.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //Setting the sampling delay to ADC_CommonInit(&adc_common_init_s); //Initialize with the above parameters /*Setting further parameters for the ADC and initializing*/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //Returning a 12 bit (max) result ADC_InitStructure.ADC_ScanConvMode = DISABLE; //A single channel is used ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //Not in continuous mode ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //Alligned right ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1,&ADC_InitStructure); //Initialize ADC1 ADC_TempSensorVrefintCmd(ENABLE); /*Enabling the ADC*/ ADC_Cmd(ADC1, ENABLE); ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_480Cycles); }
void adcSetup(void){ ADC_DeInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div8; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode = DISABLE; ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStruct); // ADC1 Configuration, ADC_Channel_TempSensor is actual channel 16 ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles); // Enable internal temperature sensor ADC_TempSensorVrefintCmd(ENABLE); // Enable ADC conversion ADC_Cmd(ADC1, ENABLE); }
void adc_init() { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); ADC_TempSensorVrefintCmd(ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
extern void adc_tempsen(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // adc1 kanalý clock aktif edildi ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; 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_20Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv =0; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor, 1, ADC_TwoSamplingDelay_5Cycles); ADC_TempSensorVrefintCmd(ENABLE); ADC_Cmd(ADC1, ENABLE); }
void TEMP_Init() //单次,单通道 { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC时钟 = 72M/6 = 12M; //ADC_初始化 ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1,&ADC_InitStructure); ADC_TempSensorVrefintCmd(ENABLE); //使能内部温度传感器(或参考电压)//====== ADC_Cmd(ADC1,ENABLE); //校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }
void adc_setup(){ static int setup_complete = 0; ADC_InitTypeDef adc_init; GPIO_InitTypeDef gpio_init; if(setup_complete){ return; } // Enable clock for ADC & GPIOC RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // Initialize GPIOC GPIO_StructInit(&gpio_init); gpio_init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | \ GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; gpio_init.GPIO_Mode = GPIO_Mode_AN; gpio_init.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &gpio_init); // Initialize ADC1 ADC_DeInit(ADC1); ADC_StructInit(&adc_init); ADC_Init(ADC1, &adc_init); //ADC_GetCalibrationFactor(ADC1); ADC_TempSensorVrefintCmd(ENABLE); ADC_Cmd(ADC1, ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_RCNR)); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS)); setup_complete++; }
static void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 , ENABLE); // ADC1 configuration ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 3; ADC_Init(ADC1, &ADC_InitStructure); // ADC1 channel sequence ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, ADC_SampleTime_28Cycles5); // ADC2 configuration ADC_DeInit(ADC2); ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 3; ADC_Init(ADC2, &ADC_InitStructure); // ADC2 channel sequence ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 2, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC2, ADC_Channel_17, 3, ADC_SampleTime_28Cycles5); // Enable ADC1 ADC_Cmd(ADC1, ENABLE); // Calibrate ADC1 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); // Enable ADC1 external trigger ADC_ExternalTrigConvCmd(ADC1, ENABLE); ADC_TempSensorVrefintCmd(ENABLE); // Enable ADC2 ADC_Cmd(ADC2, ENABLE); // Calibrate ADC2 ADC_ResetCalibration(ADC2); while(ADC_GetResetCalibrationStatus(ADC2)); ADC_StartCalibration(ADC2); while(ADC_GetCalibrationStatus(ADC2)); // Enable ADC2 external trigger ADC_ExternalTrigConvCmd(ADC2, ENABLE); }
/***************************************************************************** ** 函数名称: HexToASCII ** 功能描述: 将数值转化成字符 0x30 代表字符0 比如1234 转化为 ”1234“ ** 作 者: Dream ** 日 期: 2010年12月06日 *****************************************************************************/ void Temp_Init() { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能 MDA 重要!!! RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 使能 ADC1 重要!!! /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = 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_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel 1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ 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 = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel 14 configuration */ /* 内部温度传感器 Channel 16 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5); /* Enable the temperature sensor and vref internal channel */ ADC_TempSensorVrefintCmd(ENABLE); //内部温度传感器 添加这一句 /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ //使用之前一定要校准 ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
void ADC1_MODE_Config(void) { DMA_InitTypeDef DMA_InitStructure; //定义一个DMA结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义一个ADC结构体变量 DMA_DeInit(DMA1_Channel1); //开启DMA1的第一通道 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //DMA的转换模式为SRC模式,由外设搬移到内存 DMA_InitStructure.DMA_BufferSize = 1; //DMA缓存大小,1个 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //关闭接收一次数据后,目标内存地址后移 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //定义外设数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移数据尺寸,HalfWord就是为16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //转换模式,循环缓存模式。 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //M2M模式禁用 DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); ADC_TempSensorVrefintCmd(ENABLE); 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 = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
void configureADC_Temp(void) { uint32_t ch_index; /* Enable ADC clock & SYSCFG */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Enable the internal connection of Temperature sensor and with the ADC channels*/ ADC_TempSensorVrefintCmd(ENABLE); /* Wait until ADC + Temp sensor start */ uint32_t T_StartupTimeDelay = 1024; while (T_StartupTimeDelay--); /* Setup ADC common init struct */ ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInit(&ADC_CommonInitStructure); /* Initialise the ADC1 by using its init structure */ ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; // Set conversion resolution to 12bit ADC_InitStructure.ADC_ScanConvMode = ENABLE; // Enable Scan mode (single conversion for each channel of the group) ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // Disable Continuous conversion ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; // Disable external conversion trigger ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // Set conversion data alignement to right ADC_InitStructure.ADC_NbrOfConversion = ADC_CONV_BUFF_SIZE; // Set conversion data alignement to ADC_CONV_BUFF_SIZE ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular Temperature sensor channel16 and internal reference channel17 configuration */ for (ch_index = 1; ch_index <= MAX_TEMP_CHNL; ch_index++) { ADC_RegularChannelConfig(ADC1, ADC_Channel_16, ch_index, ADC_SampleTime_384Cycles); } ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 17, ADC_SampleTime_384Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 18, ADC_SampleTime_384Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 19, ADC_SampleTime_384Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 20, ADC_SampleTime_384Cycles); //=========================================================================== /* Enable ADC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Enable DMA1 clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait until the ADC1 is ready */ while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET); }
void ADCManager_Structure(ADCManagerTypeDef *ADCManager) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; u8 i; defaultADCManager=ADCManager; defaultADCManager->getData=ADCManager_getData; defaultADCManager->startTransfer=ADCManager_startTransfer; //defaultADCManager->ADC_Channels_num=sizeof(defaultADCManager->ADC_Channels); RCC_APB2PeriphClockCmd(filterGPIO_RCC_ADC() | RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M for(i=0;i<defaultADCManager->ADC_Channels_num;i++) { if(defaultADCManager->ADC_Channels[i]==ADC_Channel_16|defaultADCManager->ADC_Channels[i]==ADC_Channel_17) continue; GPIO_InitStructure.GPIO_Pin = filterPin_ADC(defaultADCManager->ADC_Channels[i]); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(filterGPIO_ADC(defaultADCManager->ADC_Channels[i]), &GPIO_InitStructure); } ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在单通道模式 ADC_InitStructure.ADC_ContinuousConvMode = (FunctionalState)defaultADCManager->isContinus; //模数转换工作在单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = defaultADCManager->ADC_Channels_num; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 for(i=0;i<defaultADCManager->ADC_Channels_num;i++) { if(defaultADCManager->ADC_Channels[i]==ADC_Channel_16|defaultADCManager->ADC_Channels[i]==ADC_Channel_17) ADC_TempSensorVrefintCmd(ENABLE); ADC_RegularChannelConfig(ADC1, defaultADCManager->ADC_Channels[i], i+1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 } ADC_DMA_Config(); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束 ADC_StartCalibration(ADC1); //开启AD校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束 }
void adc_init_all(uint32_t resolution) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; /* Enable ADCx, DMA and GPIO clocks */ #if 0 /* GPIO clocks enabled in main */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE); #endif RCC_APB2PeriphClockCmd(ADCx_CLK, 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); /* Configure ADC GPIOs */ for (int i=0; i<ADC_NUM_CHANNELS; i++) { GPIO_InitStructure.GPIO_Pin = adc_gpio[i].pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(adc_gpio[i].port, &GPIO_InitStructure); } /* ADCx Init */ // ADC_DeInit(); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 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 = 1; ADC_Init(ADCx, &ADC_InitStructure); /* Enable ADCx */ ADC_Cmd(ADCx, ENABLE); /* Enable VBAT/VREF monitor */ ADC_VBATCmd(ENABLE); /* Enable temperature sensor */ ADC_TempSensorVrefintCmd(ENABLE); }
void ADC_init(){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; uint8_t ch_index; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC input */ //pin_mode(ADC_GPIO_Ch04, ADC_GPIO_Pin_Ch04, GPIO_MODE_IN); pin_mode(ADC_GPIO_Ch13, ADC_GPIO_Pin_Ch13, GPIO_MODE_IN); SetCalibData(); /* Enable the internal connection of Temperature sensor and with the ADC channels*/ ADC_TempSensorVrefintCmd(ENABLE); /* Wait until ADC + Temp sensor start */ Delay(10); /* Setup ADC common init struct */ ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInit(&ADC_CommonInitStructure); /* Initialise the ADC1 by using its init structure */ ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; // Set conversion resolution to 12bit ADC_InitStructure.ADC_ScanConvMode = ENABLE; // Enable Scan mode (single conversion for each channel of the group) ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // Disable Continuous conversion ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; // Disable external conversion trigger ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // Set conversion data alignement to right ADC_InitStructure.ADC_NbrOfConversion = ADC_CONV_BUFF_SIZE; // Set conversion data alignement to ADC_CONV_BUFF_SIZE //ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); for (ch_index = 0; ch_index <= ADC_CONV_BUFF_SIZE; ch_index++){ ADC_RegularChannelConfig(ADC1, ADC_RegCfg[ch_index], ch_index+1, ADC_SampleTime_384Cycles); } /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait until the ADC1 is ready */ while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET); }
void initTempSensor(){ // In this function, we'll set up the ADC and use // it to read values from an on-board temperature sensor. // Refer to the ADC library header and source files // (stm32f4xx_adc.h and stm32f4xx_adc.c) for more details on this code. // Declare adc as a ADC_InitTypeDef, adc_common as a ADC_CommonInitTypeDef ADC_InitTypeDef adc; ADC_CommonInitTypeDef adc_common; // Enable clock signal to ADC peripheral RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // Common ADC Initialization ADC_CommonStructInit(&adc_common); // initialize struct to default values // Change a few values adc_common.ADC_Prescaler = ADC_Prescaler_Div8; // sets ADC clock prescaler ADC_CommonInit(&adc_common); // ADC initialization ADC_StructInit(&adc); // initialize struct to default values // TODO: explicitly set some values before initialization // Set the ADC resolution to 12 bits // and enable continuous conversion mode adc.ADC_Resolution=ADC_Resolution_12b; adc.ADC_ContinuousConvMode = ENABLE; ADC_Init(ADC1, &adc); // ADC Channel 1 configuration ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles); // Enable temperature smensor ADC_TempSensorVrefintCmd(ENABLE); // Enable ADC ADC_Cmd(ADC1, ENABLE); }
void temperature_ADC_Init(void) { /* ADC common init structure */ ADC_CommonInitTypeDef adc_common_init_s; /* ADC init structure */ ADC_InitTypeDef adc_init_s; /* Enable the High Speed APB (APB2) peripheral clock for ADC1 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* All ADCs are independent */ adc_common_init_s.ADC_Mode = ADC_Mode_Independent; /* Direct Memory Access mode disabled */ adc_common_init_s.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; /* Frequency of the clock to ADC is PCLK2 / 2 */ adc_common_init_s.ADC_Prescaler = ADC_Prescaler_Div2; /* Delay beteen two sampling phases, not used in independent mode */ adc_common_init_s.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&adc_common_init_s); /* 12-bit, need 15 ADC clock cycle */ adc_init_s.ADC_Resolution = ADC_Resolution_12b; /* Single (one channel) mode */ adc_init_s.ADC_ScanConvMode = DISABLE; /* single conversion mode*/ adc_init_s.ADC_ContinuousConvMode = DISABLE; /* trigger detection disabled */ adc_init_s.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; /* right data alignment: bit12-15 are 0 */ adc_init_s.ADC_DataAlign = ADC_DataAlign_Right; /* number of adc conversions */ adc_init_s.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &adc_init_s); /* Enables ADC1 peripheral */ ADC_Cmd(ADC1, ENABLE); /* Enable the internal connection of Temperature sensor and Vrefint sources with the ADC channels */ ADC_TempSensorVrefintCmd(ENABLE); }
/*********************************************************** * 函数声明:ADC初始化函数 * * function:采集片内温度,保温盒温度,三相电有效值 * * 输出 : 无 * * 调用函数:ST F.W. Ver3.0 * ***********************************************************/ void ADC1_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; /* 12MHz的时钟 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* David */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1, ADC_Channel_0->PA0->恒温盒内温度 ADC_SampleTime_71Cycles5 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //恒温盒内温度 #if 1 ADC_InjectedSequencerLengthConfig(ADC1, 1); ADC_InjectedChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);//ADC_SampleTime_55Cycles5 ADC_TempSensorVrefintCmd(ENABLE); //测温度的 使能 ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None); // ADC_ExternalTrigInjecConv_T2_TRGO ADC_AutoInjectedConvCmd(ADC1, ENABLE); #endif ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
void fdi_adc_power_up(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_DeInit(); ADC_InitTypeDef adc_init; ADC_StructInit(&adc_init); adc_init.ADC_DataAlign = ADC_DataAlign_Right; adc_init.ADC_Resolution = ADC_Resolution_12b; adc_init.ADC_ContinuousConvMode = ENABLE; adc_init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; adc_init.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; adc_init.ADC_NbrOfConversion = 1; adc_init.ADC_ScanConvMode = DISABLE; ADC_Init(ADC1, &adc_init); ADC_Cmd(ADC1, ENABLE); ADC_CommonInitTypeDef adc_common_init; ADC_CommonStructInit(&adc_common_init); adc_common_init.ADC_Prescaler = ADC_Prescaler_Div8; ADC_CommonInit(&adc_common_init); ADC_TempSensorVrefintCmd(ENABLE); }
//This function intializes the ADC, modelled after slide 12 of the tutorial but justifies each decision by using Reference Manual/ADC header file void initializeADC(void) { //Structures needed for ADC configuration ADC_InitTypeDef adcInit; ADC_CommonInitTypeDef adcInitCommon; //Initialize all the parameters for the ADC init common struct adcInitCommon.ADC_Mode = ADC_Mode_Independent; //Other options include dual and triple modes for multiple ADCS, we only want 1 ADC adcInitCommon.ADC_Prescaler = ADC_Prescaler_Div4; //Select ADC clock frequency to fpclk2 / 4 = 42MHz (this decision is for sampling time discussed later) adcInitCommon.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //Will be saving ADC output as a variable, don't want to use DMA here adcInitCommon.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //NOT SURE WHY THIS PARAMETER IS WHAT IT IS //Initialize all the parameters for the ADC init struct adcInit.ADC_Resolution = ADC_Resolution_12b; //Configurable resolution of ADC, we want 12-bit (highest resolution) adcInit.ADC_ScanConvMode = DISABLE; //Scan mode used to scan a group of analog channels, not sure why we would need this or what it is used for - so turn it off adcInit.ADC_ContinuousConvMode = DISABLE; //Don't want continuous conversions, only convert when polled (continuous conversion will do the next conversion when the previous one is done w/o trigger) adcInit.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //ADC can be triggered on external event (rising/falling edge of a control signal), we do not want this feature adcInit.ADC_DataAlign = ADC_DataAlign_Right; //Can align ADC data right or left adcInit.ADC_NbrOfConversion = 1; //Using one channel so only perform one conversion? //Turn on clock gating to the bus that connects ADC1 to the temperature sensor (APB2) RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //Initialize the ADC using the functions defined in the C file (checks params, etc.) ADC_CommonInit(&adcInitCommon); //Function wants input of a pointer to a cell of ADC_CommonInitTypeDef object, so send it the address ADC_Init(ADC1, &adcInit); //Function wants the ADC your going to use and a point to a cell of ADC_InitTypeDef, so send it the address //Wakes up the temp sensor ADC_TempSensorVrefintCmd(ENABLE); //Enable the ADC conversion ADC_Cmd(ADC1, ENABLE); //CONFIGURE THE CHANNEL: //ADC1: The peripheral to use //ADC_Channel_16: The temperature sensor is hooked up to channel 16 (see page 210 of reference manual) //1: The rank in the regular group (group: way of organizing conversions, regular group: composed of up to 16 conversions) //ADC_SampleTime_480Cycles: Takes 480 clock cycles to get a conversion of the channel (Must be greater than min sample time of 10 us so (1/42MHz)*480 = 11.4us) ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_480Cycles); }
/******************************************************************************* * Function Name : ADC1_Configuration * Description : ADC1设置(包括ADC模块配置和自校准) * Input : None * Output : None * Return : None *******************************************************************************/ void ADC1_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; 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 = 2; //设置转换序列长度为2 ADC_Init(ADC1, &ADC_InitStructure); //ADC内置温度传感器使能(要使用片内温度传感器,切记要开启它) ADC_TempSensorVrefintCmd(ENABLE); //常规转换序列1:通道10 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5); //常规转换序列2:通道16(内部温度传感器),采样时间>2.2us,(239cycles) ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5); // Enable ADC1 ADC_Cmd(ADC1, ENABLE); // 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数) ADC_DMACmd(ADC1, ENABLE); // 下面是ADC自动校准,开机后需执行一次,保证精度 // Enable ADC1 reset calibaration register ADC_ResetCalibration(ADC1); // Check the end of ADC1 reset calibration register while(ADC_GetResetCalibrationStatus(ADC1)); // Start ADC1 calibaration ADC_StartCalibration(ADC1); // Check the end of ADC1 calibration while(ADC_GetCalibrationStatus(ADC1)); // ADC自动校准结束--------------- }
/* ************************************************************ * 函数名称: ADCx_Init * * 函数功能: ADCx初始化 * * 入口参数: ADCx:ADC设备 * tempFlag:1-启用内部温度测量 0-不启用内部温度测量 * * 返回参数: 无 * * 说明: 只有ADC1具有内部温度测量功能 * 重要:需要自行初始化对应的GPIO!!!! ************************************************************ */ void ADCx_Init(ADC_TypeDef *ADCx, _Bool tempFlag) { ADC_InitTypeDef adcInitStruct; if(ADCx == ADC1) RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); else if(ADCx == ADC2) RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); else RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M ADC_DeInit(ADCx); //复位ADCx,将外设 ADCx 的全部寄存器重设为缺省值 adcInitStruct.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式 adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 adcInitStruct.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 adcInitStruct.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目 adcInitStruct.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式 ADC_Init(ADCx, &adcInitStruct); //根据adcInitStruct中指定的参数初始化外设ADCx的寄存器 if(ADCx == ADC1 && tempFlag) ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器//ADC1通道16 ADC_Cmd(ADCx, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADCx); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADCx)); //等待复位校准结束 ADC_StartCalibration(ADCx); //开启AD校准 while(ADC_GetCalibrationStatus(ADCx)); //等待校准结束 }
static void ADC_Configration(void) { ADC_InitTypeDef ADC_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_TempSensorVrefintCmd(ENABLE); }
/******************************************************************************* * 函 数 名: * 功 能: * 参 数: * 返 回: *******************************************************************************/ void ADC1_Init() { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); //初始化ADC的IO ADC1_PinInit(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //72M/6=12,ADC最大时间不能超过14M RCC_ADCCLKConfig(RCC_PCLK2_Div6); ADC_DeInit(ADC1); //独立工作模式 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单次转换 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //不使用外部触发 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //顺序进行规则转换的ADC通道的数目 ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_TempSensorVrefintCmd(ENABLE); ADC_Cmd(ADC1, ENABLE); //重置指定的ADC1的校准寄存器 ADC_ResetCalibration(ADC1); //获取ADC1重置校准寄存器的状态,等待设置状态结束 while(ADC_GetResetCalibrationStatus(ADC1)); //开始指定ADC1的校准状态 ADC_StartCalibration(ADC1); //获取指定ADC1的校准程序,设置状态则等待 while(ADC_GetCalibrationStatus(ADC1)); //使能指定的ADC1的软件转换启动功能 ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
uint16_t adc_coretemp_simple(void) { ADC_InitTypeDef ADC_InitStructure; uint16_t AD_value; uint16_t TemperatureC; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //enable ADC1 clock //ADC1 configuration ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //convert single channel only ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //convert one time ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; //select no external triggering ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //right 12-bit data alignment in ADC data register ADC_InitStructure.ADC_NbrOfConversion = 1; //single channel conversion ADC_Init(ADC1, &ADC_InitStructure); //load structure values to control and status registers ADC_TempSensorVrefintCmd(ENABLE); //wake up temperature sensor //ADC1 channel16 configuration ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_384Cycles); ADC_Cmd(ADC1, ENABLE); //Enable ADC1 calibdata = *FACTORY_CALIB_DATA; ADC_SoftwareStartConv(ADC1); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)){} //wait for conversion complete AD_value = ADC_GetConversionValue(ADC1); //read ADC value ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //clear EOC flag TemperatureC = CalcTemperature(AD_value); return TemperatureC; }