3854|6

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

菜鸟求教AD转换驱动问题 [复制链接]

在我写的AD转换驱动中(我用的是2410),发现AD的寄存器的值没法改,我怀疑修改寄存器的值应该有专门的函数(像GPIO那样),只是我不知道,希望知道的大侠指教一下,谢谢

最新回复

谢谢大家关注~  详情 回复 发表于 2007-10-29 09:50
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人回答我啊
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你操作硬件上的端口或者映射内存
用这些函数或者宏
READ_PORT_BUFFER_UCHAR
READ_REGISTER_BUFFER_UCHAR
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
#ifndef __ADC_H__
#define __ADC_H__

#ifdef __cplusplus
extern "C" {
#endif


#define  IOCTL_SET_ADC_CHANNEL                0x01

#define  IOCTL_SET_ADC_FREQUENCY    0x02

#define  IOCTL_GET_ADC_CURFREQ          0x03

#define  IOCTL_SET_ADC_MAXFREQ                0x04

#define  IOCTL_SET_ADC_MINFREQ                0x05

// ADCCON 寄存器
#define  ADCCON_EN_START              (1 << 0)
#define  ADCCON_DIS_START            (0 << 0)

#define  ADCCON_DIS_READSTART    (0 << 1)
#define  ADCCON_EN_READSTART     (1 << 1)

#define  ADCCON_NORMAL_MODE      (0 << 2)
#define  ADCCON_STANDBY_MODE     (1 << 2)

#define  ADCCON_CHANNEL_MSK                  (0x07 << 3)
#define  ADCCON_CHANNEL_0                 0
#define  ADCCON_CHANNEL_1                 1
#define  ADCCON_CHANNEL_2                 2
#define  ADCCON_CHANNEL_3                 3
#define  ADCCON_CHANNEL_4                 4
#define  ADCCON_CHANNEL_5                 5
#define  ADCCON_CHANNEL_6                 6
#define  ADCCON_CHANNEL_7                 7

#define  ADCCON_PRSCVL_MSK       (0xFF << 6)
  
#define  ADCCON_PRSCEN_EN                   (1 << 14)
#define  ADCCON_PRSCEN_DIS                 (0 << 14)

#define  ADCCIN_CONVERTING                 (0 << 15)
#define  ADCCIN_CONVERT_END                 (1 << 15)

// ADCTSC 寄存器
#define  ADCTSC_NORMAL_MODE             (0x3 << 0)

#ifdef __cplusplus
}
#endif

#endif // __ADC_H__
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// DLGADC dialog


DLGADC::DLGADC(CWnd* pParent /*=NULL*/)
        : CDialog(DLGADC::IDD, pParent)
{
        //{{AFX_DATA_INIT(DLGADC)
        m_DispAIN0 = 0;
        m_DispAIN1 = 0;
        //}}AFX_DATA_INIT

        hFile = INVALID_HANDLE_VALUE;
}


void DLGADC::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(DLGADC)
        DDX_Text(pDX, IDC_DISP_AIN0, m_DispAIN0);
        DDX_Text(pDX, IDC_DISP_AIN1, m_DispAIN1);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DLGADC, CDialog)
        //{{AFX_MSG_MAP(DLGADC)
        ON_WM_DESTROY()
        ON_WM_TIMER()
        ON_BN_CLICKED(IDC_BUTTON_START_ADC, OnButtonStartAdc)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DLGADC message handlers

void DLGADC::OnDestroy()
{
        CDialog::OnDestroy();
       
        // TODO: Add your message handler code here
        if (hFile != INVALID_HANDLE_VALUE)
        {
                // 关闭 ADC 驱动
                CloseHandle(hFile);
                hFile = INVALID_HANDLE_VALUE;
        }
        KillTimer(1);                                                        /* 取消定时 */
}
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 

void DLGADC::OnTimer(UINT nIDEvent)
{
        // TODO: Add your message handler code here and/or call default
        DWORD actlen;
        BOOL ret;
        BYTE channel = 0;
        float v0,v1;

        // 采样 W1(AIN0) 电压值
        ret = ::DeviceIoControl(hFile, IOCTL_SET_ADC_CHANNEL,
                                                        &channel, 1, NULL, 0, NULL, NULL);        /* 设置当前转换通道为0 */
        if (ret != TRUE)
        {
                KillTimer(1);
                MessageBox(_T("设置ADC通道0失败 !"));
                goto END;
        }

        ret = ::ReadFile(hFile, &m_DispAIN0, 1, &actlen, NULL);                /* 采样通道0 */
        if (ret != TRUE)
        {
                KillTimer(1);
                MessageBox(_T("读取ADC通道0失败 !"));
                goto END;
        }       

        // 采样 W2(AIN1) 电压值
        channel = 1;
        ret = ::DeviceIoControl(hFile, IOCTL_SET_ADC_CHANNEL,
                                                        &channel, 1, NULL, 0, NULL, NULL);        /* 设置当前转换通道为1 */
        if (ret != TRUE)
        {
                KillTimer(1);
                MessageBox(_T("设置ADC通道1失败 !"));
                goto END;
        }

        ret = ::ReadFile(hFile, &m_DispAIN1, 1, &actlen, NULL);                /* 采样通道1 */
        if (ret != TRUE)
        {
                KillTimer(1);
                MessageBox(_T("读取ADC通道1失败 !"));
                goto END;
        }       
       
        v0 = (float)(m_DispAIN0) / 1024;        /* 转换为小数值 */
        v1 = (float)(m_DispAIN1) / 1024;

        m_DispAIN0 = (DWORD)(v0 * 3300);        /* 计算出电压值 */
        m_DispAIN1 = (DWORD)(v1 * 3300);

        UpdateData(FALSE);                                        /* 更新显示 */

END:
        CDialog::OnTimer(nIDEvent);
}

void DLGADC::OnButtonStartAdc()
{
        // TODO: Add your control notification handler code here
        CButton *Key;
        Key = (CButton *)GetDlgItem(IDC_BUTTON_START_ADC);       
       
        UINT state = Key->GetState();
        if ((state & 0x0003) == 1)                                        /* 按键按下 */
        {
                if(IDYES==(AfxMessageBox(_T("启动ADC之后将无法使用触模屏,是否继续!"),MB_YESNO)))
                {       
                        // Yes
                        if (hFile == INVALID_HANDLE_VALUE)
                        {
                                hFile = CreateFile(TEXT("ADC1:"), GENERIC_READ | GENERIC_WRITE, 0,
                                                                                NULL, OPEN_EXISTING, 0, 0);
                                if (hFile == INVALID_HANDLE_VALUE)
                                {
                                        MessageBox(_T("ADC 驱动打开失败!"));
                                        return;
                                }
                        }
                        Key->SetWindowText(_T("停止采样"));                        /* 按键标题改变, 提示下次操作 */
                        SetTimer(1, 20, NULL);                                                /* 启动定时器, 进行采样 */
                }
                else
                {
                        Key->SetCheck(0);                                                        /* 按键保持为未按下 */
                        UpdateData(FALSE);
                }
        }
        else                                                                                                /* 按键弹起 */
        {
                Key->SetWindowText(_T("开始采样"));                                /* 按键标题复原 */
                Key->SetCheck(0);                                                                /* 按键保持为未按下 */
                KillTimer(1);                                                                        /* 取消定时 */
                CloseHandle(hFile);
                hFile = INVALID_HANDLE_VALUE;
        }
}
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢大家关注~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表