void ADSample(void) { u8 i,tttemp; ADC1_DeInit(); ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_ALIGN_RIGHT); ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL4,ENABLE); ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE); ADC1_Cmd(ENABLE); ADC1->CSR &= (u8)(~0x80); ADC1_StartConversion(); while((ADC1->CSR & 0x80)!=0x80) IWDG_ReloadCounter(); // µÈ´ýת»»½áÊø Conversion_Value += ADC1_GetConversionValue(); ADC1->CSR &= (u8)(~0x80); u8ADChannelCnt++; if(u8ADChannelCnt>=SAMPLE_TIMES) { u8ADChannelCnt = 0; tttemp = (u8)((Conversion_Value>>2)/SAMPLE_TIMES); if((tttemp<20) || (tttemp>200) ) u8Temp = OFF_TMP_SET; else { for(i=0;T3580Tab[i]<tttemp;i++); u8Temp = (u8)(i+(40*2)); } Conversion_Value = 0; }
/** * Update ADC value * * @return void */ static void update_adc_value(void) { uint16 adc_in = ADC1_GetConversionValue() * ADC_WEIGHT_TOTAL; io_adc_inst->adc_average = ((uint32)io_adc_inst->adc_average * ADC_WEIGHT_OLD + (uint32)adc_in * ADC_WEIGHT_NEW) / ADC_WEIGHT_TOTAL; ADC_DEBUG(("ADC Update Ai[%d] Aa[%d] \n", adc_in, io_adc_inst->adc_average)); }
/** * Init function * * @return void */ void io_adc_init(void) { adc_hw_init(); STATIC_MEM_ALLOC(io_adc_inst); io_adc_inst->task.handler = message_handler; io_adc_inst->adc_average = ADC1_GetConversionValue() * ADC_WEIGHT_TOTAL; ADC_DEBUG(("FIR:[%d]\n", io_adc_inst->adc_average)); tym_message_send(&io_adc_inst->task, MESSAGE_ADC_UPDATE_LOOP); }
// Convert to level: [0..100] uint8_t als_read() { uint8_t level; // Wait convert finished while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET); // Get value uint16_t adc_value = ADC1_GetConversionValue(); // Clear flag ADC1_ClearFlag(ADC1_FLAG_EOC); // Start next conversion ADC1_StartConversion(); // [0..1023], reversed scale down to [100..0] if( adc_value >= 1000 ) { level = 0; } else { level = 100 - adc_value / 10; } return level; }
/******************************************************************************* * 名 称: Bsp_GetPm25AdVal * 功 能: 获取PM2.5传感器的AD值 * 入口参数: 无 * 出口参数: 无 * 作 者: Roger-WY * 创建日期: 2015-07-20 * 修 改: * 修改日期: * 备 注: *******************************************************************************/ void Bsp_GetPm25AdVal(u16 *pdata) { u32 sum = 0; /*********************************************** * 描述: 开PM2.5传感器内部LED */ PM25LEDON(); /*********************************************** * 描述: 延时280uS */ Bsp_DelayUs(28); /*********************************************** * 描述: 采集PM2.5的数据 */ for(u8 i = 0; i < CollectionCnt ; i++ ) { sum += ADC1_GetConversionValue(); ADC1_StartConversion(); /* 软件启动下次ADC转换 */ } *pdata = (u16)(sum/CollectionCnt); /*********************************************** * 描述:关PM2.5传感器内部LED */ PM25LEDOFF(); }
INTERRUPT void ADC1_IRQHandler(void) { #endif //GPIO_WriteHigh(LED1_PORT, LED1_PIN); ADC1_ClearITPendingBit(ADC1_IT_EOC); //clear end of conversion flag, for one signal channel switch(adc_scan_times_flag){ case 0: ADC_Results[0] = ADC1_GetBufferValue(0); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_1);/* Select the ADC1 channel */ ADC1_StartConversion(); break; case 1: ADC_Results[1] = ADC1_GetBufferValue(1); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_2);/* Select the ADC1 channel */ ADC1_StartConversion(); break; case 2: ADC_Results[2] = ADC1_GetBufferValue(2); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_3);/* Select the ADC1 channel */ ADC1_StartConversion(); break; case 3: ADC_Results[3] = ADC1_GetBufferValue(3); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_4);/* Select the ADC1 channel */ ADC1_StartConversion(); break; case 4: ADC_Results[4] = ADC1_GetBufferValue(4); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_5);/* Select the ADC1 channel */ ADC1_StartConversion(); break; case 5: ADC_Results[0] = ADC1_GetBufferValue(0); ADC_Results[1] = ADC1_GetBufferValue(1); ADC_Results[2] = ADC1_GetBufferValue(2); ADC_Results[3] = ADC1_GetBufferValue(3); ADC_Results[4] = ADC1_GetBufferValue(4); ADC_Results[5] = ADC1_GetBufferValue(5); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_12);/* Select the ADC1 channel */ ADC1->CR2 &= (uint8_t)(~ADC1_CR2_SCAN); //ADC1_ScanMode DISABLE ADC1_StartConversion(); break; case 6: ADC_Results[6] = ADC1_GetConversionValue(); ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); /* Clear the ADC1 channels */ ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_0);/* Select the ADC1 channel */ ADC1->CR2 |= ADC1_CR2_SCAN; //ADC1_ScanMode ENABLE adc_scan_times_flag = 0; (*Intupt_ADC_Finish_ptr_fuc)(); break; default: break; } adc_scan_times_flag++; // if(adc_second_scan_flag == 0){ // ADC_Results[0] = ADC1_GetBufferValue(0); // ADC_Results[1] = ADC1_GetBufferValue(1); // ADC_Results[2] = ADC1_GetBufferValue(2); // ADC_Results[3] = ADC1_GetBufferValue(3); // //ADC1_ClearITPendingBit(ADC1_IT_EOC); //clear end of conversion flag, for one signal channel // // adc_second_scan_flag = 1; // adc_AIN12_channel_init(); // ADC1_StartConversion(); // //(*Intupt_ADC_Finish_ptr_fuc)(); // }else{ // //adc_second_scan_flag = 0; // ADC_Results[4] = ADC1_GetConversionValue(); // for AIN12 values // //ADC1_ClearITPendingBit(ADC1_IT_EOC); //clear end of conversion flag, for one signal channel // //adc_4_channel_scan_init(); // (*Intupt_ADC_Finish_ptr_fuc)(); // // } //GPIO_WriteLow(LED1_PORT, LED1_PIN); return; }