示例#1
0
文件: pm2p5.c 项目: BillyZhangZ/wifi
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;
}
示例#2
0
/*************************************************************************
*                             野火嵌入式開發工作室
*
*  函數名稱: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;
}
示例#3
0
文件: dma.c 项目: koson/mchck-os
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);
}
示例#4
0
文件: io_adc.c 项目: hacktm15/Car2015
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();

}
示例#5
0
//============================================================================
//函数名称: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;
}