Пример #1
0
void adc_test(void)
{
	unsigned char i;
	unsigned char n;
	unsigned char tail;
	short int res_voltage 	= 0;
	short int temp_voltage 	= 0;
	uint16 temp_adc = 0;
	float pvoltage = 0;

	adc_switch_channel(VOLTAGE);
	for(i = 0; i < 50; i++)
	{
		START_ADC();
		temp_adc +=  adc_result;
	}
	
	n = min(adc_mean_num, adc_queue.count);			// 取当前队列中数据个数与设置值的最小值
	if(0 == n)
		return;

	tail = adc_queue.tail;							// 获取队列尾部下标
	tail = (tail-1) & ADC_MAX_SIZE_MASK;			// 减1之后,指向最后加入的一个数据
													// 减1是因为下标是从0开始的
	for(i = 0; i < n; i++)
	{
		temp_voltage = adc_queue.data[tail].voltage;
		res_voltage += temp_voltage;

		tail = (tail-1) & ADC_MAX_SIZE_MASK;
	}
	pvoltage = 5.0f * res_voltage / n / 1024.0f;
	uart_putnstring((uint8 *)&pvoltage, 4);
	OSTimeDly(OS_TICKS_PER_SEC/2);
}
Пример #2
0
void adc_convert_start(void)
{
	adc_status_flag.is_current_convert = TRUE;
	adc_status_flag.is_first_time 	   = TRUE;
	adc_switch_channel(ADC_VOLTAGE);

	START_ADC();
}
Пример #3
0
void adc_convert_start(void)
{
	memset(&adc_status, 0, sizeof(AdcStatusFlag));
	adc_status.who_is_convert 	= CURRENT;			// 置位电流转换,先电流后电压顺序
	adc_status.first_time 		= TRUE;				// 第一次转换
	adc_switch_channel(CURRENT);					// 切换到电流转换

	START_ADC();									// 启动一次转换(没有采用连续转换)
}
Пример #4
0
static irqreturn_t adcdone_int_handler(int irq, void *dev_id)
{
	struct adcdev_t *adcd = (struct adcdev_t *)dev_id; 
	unsigned int c = (*(adcd->adccon) >> 3) & 0x07;
	unsigned int adcdata;

	//printk(KERN_INFO"%s %d\n",__FUNCTION__,__LINE__);
	/*共享中断,先判断是不是我们的设备产生了中断*/
	if ((c != ch) ||(*(adcd->adcdata0) & (1 << 14)) )
		return IRQ_NONE;
	//printk(KERN_INFO"%s %d\n",__FUNCTION__,__LINE__);

	/*AD convertion data, handling it*/
	
	adcdata = *(adcd->adcdata0) & 0x3f;
	printk(KERN_INFO"adcdata %d\n", adcdata);

	START_ADC();
	

	return IRQ_HANDLED;
}
Пример #5
0
static int __init my_adc_init(void)
{
	int ret;

	adcdev.base_addr = ioremap(S3C2440_ADC_BASE,0x20);
	if (adcdev.base_addr == NULL)
	{
		printk(KERN_ERR "failed to remap register block\n");
		return -ENOMEM;
	}
	adcdev.adccon = (volatile unsigned long *)(adcdev.base_addr);
	adcdev.adctsc = (volatile unsigned long *)(adcdev.base_addr + 4);
	adcdev.adcdata0 = (volatile unsigned long *)(adcdev.base_addr + 12);
	

	adcdev.adc_clk = clk_get(NULL, "adc");
	if (!adcdev.adc_clk)
	{
		printk(KERN_ERR "failed to get adc clock source\n");
		return -ENOENT;
	}
	clk_enable(adcdev.adc_clk);

	/* enable AD convertion */
	*(adcdev.adctsc) = 0x00;
	START_ADC();
	
	ret = request_irq(IRQ_ADC, adcdone_int_handler, IRQF_SHARED, "adc", &adcdev);
	if (ret)
	{
		iounmap(adcdev.base_addr);
		return ret;
	}

	
	printk ("adc  initialized\n");
	return ret;
}