int32_t adc_measure_pm2p5() { // uint16_t val = 0; if((ADC_SC2_REG(adc_ptr) & ADC_SC2_ADACT_MASK) == 0) { /* set once conversion mode */ ADC_SC3_REG(adc_ptr) = (ADC_SC3_REG(adc_ptr) & (~ADC_SC3_ADCO_MASK) | ADCO_SINGLE); /* set sw triger */ ADC_SC2_REG(adc_ptr) = (ADC_SC2_REG(adc_ptr) & (~ADC_SC2_ADTRG_MASK) | ADTRG_SW); ADC_SC1_REG(adc_ptr,0) = ADC_INPUT_CH; while(!(ADC_SC1_REG(adc_ptr,0) & ADC_SC1_COCO_MASK)){ //printf("adc calculating...\n"); //_time_delay(1); } val = (uint16_t) (ADC_R_REG(adc_ptr,0)); } else { printf("Conversion in progress...\n"); _time_delay(50); val = (uint16_t) (ADC_R_REG(adc_ptr,0)); } return val; }
/************************************************************************* * 野火嵌入式開發工作室 * * 函數名稱:ad_once * 功能說明:采集一次一路模擬量的AD值 * 參數說明:ADCn 模塊號( ADC0、 ADC1) * ADC_Channel 通道號 * ADC_nbit 精度( ADC_8bit,ADC_12bit, ADC_10bit, ADC_16bit ) * 函數返回:無符號結果值 * 修改時間:2012-2-10 * 備 注:參考蘇州大學的例程,B通道不能軟件觸發!!!! *************************************************************************/ u16 ad_once(ADCn adcn,ADC_Ch ch,ADC_nbit bit) //采集某路模擬量的AD值 { u16 result = 0; ASSERT( ((adcn == ADC0) && (ch>=AD8 && ch<=AD18)) || ((adcn == ADC1)&& (ch>=AD4a && ch<=AD17)) ) ; //使用斷言檢測ADCn_CHn是否正常 adc_start(adcn, ch, bit); //啟動ADC轉換 while (( ADC_SC1_REG(ADCx[adcn], 0 ) & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK); result = ADC_R_REG(ADCx[adcn],0); ADC_SC1_REG(ADCx[adcn],0) &= ~ADC_SC1_COCO_MASK; return result; }
void main(void) { adc_init(); dma_init(); enter_thread_mode(); sema_wait(&adc_start_sema); struct dma_ctx *ctx; ctx = dma_setup(DMAMUX_ADC0, &ADC_R_REG(ADC0, 0), dstbuf, 2, sizeof(dstbuf)/2, DMA_SRC_STICKY | DMA_DOUBLEBUF | DMA_LOOP, dma_done, NULL); adc_sample_prepare(ADC_MODE_CONTINUOUS); bf_set_reg(ADC_SC2_REG(ADC0), ADC_SC2_DMAEN, 1); ADC_SC1_REG(ADC0, 0) = ADC_SC1_ADCH(0) | ADC_SC1_DIFF_MASK; wait(main); }
void Io_Adc_Isr(void) { uint16 result; Io_Adc_Data->conversion_ongoing = 0; Io_Int_DisableInterrupts(); /* Store the value of the last conversion */ result = ADC_R_REG(ADC0,S1A); /* Conversion value is written in the specific adc_channel_value */ Io_Adc_Data->adc_ch_data[Io_Adc_Data->current_cnv_channel].adc_channel_value = result; Io_Adc_Data->adc_ch_data[Io_Adc_Data->current_cnv_channel].valid = VALID; /* Increment the channel */ Io_Adc_Data->current_cnv_channel++; /* Check if current channel is not the last one */ if (Io_Adc_Data->current_cnv_channel<Io_Adc_ConfigPtr->adc_number_of_channels) { /*Read the configuration from the configuration structure of the current channel*/ ADC_CFG2_REG(ADC0) = ADC_CFG2_DEFAULT | Io_Adc_ConfigPtr->adc_config_channel[Io_Adc_Data->current_cnv_channel].adc_channel_config2; ADC_CFG1_REG(ADC0) = ADC_CFG1_DEFAULT | Io_Adc_ConfigPtr->adc_config_channel[Io_Adc_Data->current_cnv_channel].adc_channel_config1; /* Restart the conversion for next channel */ ADC_SC1_REG(ADC0,S1A) = IO_ADC_SC1_INTERRUPT_ENABLE_MASK | IO_ADC_SC1_SE_CONVERSION | Io_Adc_ConfigPtr->adc_config_channel[Io_Adc_Data->current_cnv_channel].adc_channel_ID;; /* Conversion ongoing is set */ Io_Adc_Data->conversion_ongoing = 1; } /* Re-enable interrupts */ Io_Int_EnableInterrupts(); }
//============================================================================ //函数名称:hw_ad_once //函数返回:16位无符号的AD值 //参数说明:MoudelNumber:模块号 // Channel:通道号 // accuracy:精度 //功能概要:采集一次一路模拟量的AD值 //============================================================================ uint16 hw_adc_once(int MoudelNumber,int Channel,uint8 accuracy)//采集某路模拟量的AD值 { uint16 result = 0; uint8 ADCCfg1Mode = 0; ADC_MemMapPtr ADCMoudel;//保存ADC模块地址指针 switch(accuracy) { case 8: ADCCfg1Mode = 0x00; break; case 12: ADCCfg1Mode = 0x01; break; case 10: ADCCfg1Mode = 0x02; break; case 16: ADCCfg1Mode = 0x03; break; default: ADCCfg1Mode = 0x00; } if(MoudelNumber==0)//选择ADC模块0 { ADCMoudel = ADC0_BASE_PTR; } else //选择ADC模块1 { ADCMoudel = ADC1_BASE_PTR; } //配置正常电源模式,总线时钟,总线时钟4分频,长采样时间使能,设置精度 ADC_CFG1_REG(ADCMoudel) = ADLPC_NORMAL | ADC_CFG1_ADIV(ADIV_4) | ADLSMP_LONG | ADC_CFG1_MODE(ADCCfg1Mode) | ADC_CFG1_ADICLK(ADICLK_BUS); //配置禁止异步时钟使能输出,ADxxat通道选择,高速配置,长采样时间 ADC_CFG2_REG(ADCMoudel) = MUXSEL_ADCA | ADACKEN_DISABLED | ADHSC_HISPEED | ADC_CFG2_ADLSTS(ADLSTS_20) ; //设置通道号 ADC_SC1_REG(ADCMoudel,A) = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel); //等待转换完成 while (( ADC_SC1_REG(ADCMoudel,A) & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK) { } //读取转化结果 result = ADC_R_REG(ADCMoudel,A); //清ADC转换完成标志 ADC_SC1_REG(ADCMoudel,A) &= ~ADC_SC1_COCO_MASK; return result; }