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); }
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(); }
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(); // 启动一次转换(没有采用连续转换) }
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; }
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; }