要使用MINI210開發(fā)板的adc采集電池電壓,來檢測電池電量問題 查看電路圖,AIN0用作可調(diào)電阻,不可用,AIN1沒有設(shè)備使用,正好可以用于我的電壓測量 事情沒有想象的那么順利,有點(diǎn)小曲折 使用購買開發(fā)板附帶的光盤上的內(nèi)核來測試 開始以為驅(qū)動(dòng)是在arch/arm/mach-s5pv210里面的adc.c文件 將其編譯進(jìn)內(nèi)核,查看內(nèi)核啟動(dòng)的信息,發(fā)現(xiàn)有重復(fù)的adc驅(qū)動(dòng) 后來仔細(xì)看代碼,發(fā)現(xiàn)adc的驅(qū)動(dòng)是在driver/char里面的mini210_adc.c 內(nèi)核編好燒錄到開發(fā)板 編寫應(yīng)用程序 #include <stdlib.h> //#define ADC_INPUT_PIN _IOW('S', 0x0c, unsigned long)
int main()
if(fp == -1)
//ioctl(fp, ADC_INPUT_PIN, 1);
while(1) 打印出的總是AIN0的adc信息,查看代碼,是程序設(shè)置死的,一直打印AIN0(可調(diào)電阻)的采集數(shù)據(jù),如下 static int s3c2410_adc_open(struct inode *inode, struct file *filp) adcdev.channel=0; /* Bit 6 must be 1 for YP, bit 7 must be 0 for YM */ DPRINTK("adc opened\n"); 然后將adcdev.channel改為1,再次測試, 打印出來的還是AIN0的可調(diào)電壓值,那問題出在哪呢? 在網(wǎng)上搜索一下有不少ADC驅(qū)動(dòng)的博客,但都是只使用AIN0采集的,好多都是轉(zhuǎn)載的,我想可能他們都沒做過測試,至少在AIN1上沒測試過 又咨詢過友善之背的客服,回復(fù)說最新出來的光盤修改好了 又去網(wǎng)上下了最新的光盤,確實(shí)有些修改,就是加了驅(qū)動(dòng)的ioctl接口 修改好再去測試還是老問題,總是打印出AIN0的采集數(shù)據(jù) 然后去看s5pv210的手冊,發(fā)現(xiàn)ADCCON的bit[3-5]是預(yù)留的,并不是代碼里面認(rèn)定的是ADC的選擇腳,查看2440確實(shí)是將adc通路選擇放在ADCCON寄存器的3、4、5bit, 仔細(xì)查看發(fā)現(xiàn)手冊里面ADC章節(jié)最下面還有個(gè)ADCMUX的寄存器,尼瑪,原來是這個(gè)寄存器作怪,我說怎么總是讀出AIN0的值 原來選擇ADC通道設(shè)置錯(cuò)了寄存器,并不在ADCCON里面,而是在ADCMUX里面 于是在設(shè)置ADCCON寄存器前加了一句 adcdev.channel = 1; ADCMUX = adcdev.channel; 這下果然正確了,讀出的數(shù)據(jù)正是AIN1腳輸入的信號(hào)數(shù)據(jù)
|
|