• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 成功移植mini2440的多通道ad转换 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 18441
精华: 0
发帖: 45
金钱: 225 两
威望: 45 点
综合积分: 90 分
注册时间: 2010-04-09
最后登录: 2013-08-20
楼主  发表于: 2010-07-13 10:09

 成功移植mini2440的多通道ad转换

因为最近做一个程序要使用到四路的ad转换,但友善给的AD驱动都是一个通道的,所以没办法要些一个多通道的驱动程序,先前用来一个比较笨的方法来做,虽然可以实现,但是自我感觉比较别扭,在论坛上看了关于AD转换的帖子,发现很少给出多通道的实现方法,下面我就把我的实现方法贴出来,一方面是总结,一方面希望给大家一点点帮助.
其实很简单,在友善提供的MINI2440_ADC.C中,只需略改一些即可,
ad一共有三个寄存器,具体我就不说兰,pdf上有,首先要AD工作,必须开通道,在函数s3c2410_adc_open中实现,所以我们要开多个通道,如下:
static int (struct inode *inode, struct file *filp)
{
    init_waitqueue_head(&(adcdev.wait));

    static int channel_count;
    for(channel_count=0;channel_count<4;channel_count++)               //连续开四个通道
    {
        adcdev.channel=channel_count;
        adcdev.prescale=0xff;
    }
    DPRINTK( "adc opened\n");
    return 0;
}

因为驱动程序中设置的是ENABLE_START位,所以在转换结束后,要再次设置此位来启动AD转换,这个主要在函数s3c2410_adc_read中实现,如下:
static ssize_t (struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
    char str[20];
    int value;
    size_t len;

    if (down_trylock(&ADC_LOCK) == 0) {
        OwnADC = 1;
        START_ADC_AIN(adcdev.channel, adcdev.prescale);
        wait_event_interruptible(adcdev.wait, ev_adc);

        ev_adc = 0;

        DPRINTK("AIN[%d] = 0x%04x, %d\n", adcdev.channel, adc_data, ADCCON & 0x80 ? 1:0);

        value = adc_data;
        sprintf(str,"%5d", adc_data);
        copy_to_user(buffer, (char *)&adc_data, sizeof(adc_data));

        OwnADC = 0;
        up(&ADC_LOCK);
    } else {
        value = -1;
    }

    if(converter_channel==3)                 //通道选择,
    {
        converter_channel=0;    
    }
    else  converter_channel++;

      adcdev.channel=converter_channel;

    len = sprintf(str, "%d\n", value);
    if (count >= len) {
        int r = copy_to_user(buffer, str, len);
        return r ? r : len;
    } else {
        return -EINVAL;
    }
}

在fedora终端中输入cat /dev/adc,输出如下
1023                                                                            
325                                                                            
303                                                                            
305                                                                            
1023                                                                            
297                                                                            
328                                                                            
284                                                                            
1023                                                                            
328                                                                            
303                                                                            
306                                                                            
其中1023是0通道,旋转滑动变阻器可以改变其值,如下:41为0通道的值
41                                                                              
302                                                                            
289                                                                            
312                                                                            
42                                                                              
293                                                                            
315                                                                            
266                                                                            
41                                                                              
285                                                                            
261                                                                            
287
其他通道的友善没有引出,也不好测试,理论上应该没什么问题,呵呵,有条件的朋友可以测试以下,顺便把测试结果告诉我,谢谢~~~
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2010-07-13 10:32
多谢分享。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 新手上路
UID: 18441
精华: 0
发帖: 45
金钱: 225 两
威望: 45 点
综合积分: 90 分
注册时间: 2010-04-09
最后登录: 2013-08-20
2楼  发表于: 2010-07-13 11:22

 回 1楼(mindee) 的帖子

这个我只测试了一个通道,因为条件限制,所以其他的三个通道都没有测试,还希望有条件的朋友帮助测试一下,呵呵,共同提高~~~
级别: 新手上路
UID: 47498
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-05-23
最后登录: 2011-09-04
3楼  发表于: 2011-08-31 05:34
DPRINTK 与printk 有什么区别?
级别: 侠客
UID: 20445
精华: 0
发帖: 77
金钱: 385 两
威望: 77 点
综合积分: 154 分
注册时间: 2010-05-02
最后登录: 2023-04-10
4楼  发表于: 2011-09-23 16:56
mini2440的多通道ad转换 ,mark!
级别: 新手上路
UID: 53580
精华: 0
发帖: 5
金钱: 25 两
威望: 5 点
综合积分: 10 分
注册时间: 2011-08-11
最后登录: 2012-04-09
5楼  发表于: 2011-10-11 20:02
友善给的AD驱动?
请问你在哪里找到的?开发板自带的光盘里面没有啊?楼主能给我发一份吗?关于AD转换的问题已经困扰我好久了
邮箱:blakema714@163.com
多谢交流指导!
级别: 新手上路
UID: 55342
精华: 0
发帖: 11
金钱: 60 两
威望: 12 点
综合积分: 22 分
注册时间: 2011-09-16
最后登录: 2012-04-28
6楼  发表于: 2011-10-21 16:09
最近呢一直在搞多通道的AD采集,
我把通道0的驱动修改了一下,每个通道一个驱动,单独采集的时候没有问题,可是一旦放在一个用户程序里面调用就不对了,采着采着几个通道的数据就都一样了

看到你的帖子,我就根据你说的改了,可是为什么不行呢
可不可以把你完整的程序发给我,还有测试程序(有可能我的测试程序写的不对)
邮箱:yangyurong2006@sina.cn
能自学入门Linux的人将可练就一种坚韧不拔的精神。。。
级别: 侠客
UID: 57277
精华: 0
发帖: 53
金钱: 270 两
威望: 54 点
综合积分: 106 分
注册时间: 2011-10-21
最后登录: 2012-01-08
7楼  发表于: 2011-11-21 17:19

 回 楼主(songfangfang) 的帖子

楼主能否分享一下你的应用程序呢?谢谢。。。
马上找工作 压力有点大
级别: 新手上路
UID: 76634
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
综合积分: 16 分
注册时间: 2012-08-27
最后登录: 2012-12-30
8楼  发表于: 2012-10-07 10:32
mask 果断mask
哦~帅气
级别: 新手上路
UID: 89936
精华: 0
发帖: 18
金钱: 90 两
威望: 18 点
综合积分: 36 分
注册时间: 2013-04-08
最后登录: 2018-02-08
9楼  发表于: 2013-05-23 16:26

 回 2楼(songfangfang) 的帖子

请问要测试的话应该怎么弄?
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go