搜索
bottom↓
回复: 3

松翰AD转换

[复制链接]

出0入0汤圆

发表于 2011-12-24 09:56:48 | 显示全部楼层 |阅读模式
我现在搞的AD转换,刚开始时单步还可以,现在单步也不准确了,不知道是何故,程序如下:
ADC_ADR_BUF                                EQU                00000000B        ;set Fcpu/16, adc分辨率bit5=0是8bit; =1是10bit,



;********************************************************************************
;函数名称:L_Adc_Init
;函数功能:adc初始化函数
;p4.0, p4.1, p4.2为adc输入,不带上啦
;输入参数:无
;输出参数:无
;********************************************************************************
L_Adc_Init:

        b0bclr        p4m.0                                ;adc0 set input mode
        b0bclr        p4m.1                                ;adc1 set input mode
        b0bclr        p4m.2                                ;adc2 set input mode
        mov                a,p4ur
        and                a,#11111000b
        b0mov        p4ur,a                                ;设置p4.0 ~ p4.2不带上啦的,可以提高省电

        mov                a,p4con
        or                a,#00000111b
        b0mov        P4CON,a                                ;p4.0 ~ p4.2只能作为模拟输入,不能作为GPIO引脚

        RET



;********************************************************************************
;函数名称:L_Adc_Choose
;函数功能:ADC转换通道选择函数
;输入参数:rAdc_Choose(选择ADC通道p40-p47),根据此参数输出如下数据:
;输出参数0:rVol_Data0,外部电压检测AD值数据
;输出参数1:rBat_Data0,电池自身电压检测AD值数据
;输出参数2:rAdc_Data0,过流电压检测AD值数据
;0C8H    Bit 7   Bit 6   Bit 5   Bit 4    Bit 3    Bit 2   Bit 1    Bit 0
;ADM     ADENB    ADS     EOC     GCHS     CHS3     CHS2    CHS1     CHS0
;读/写    R/W      R/W    R/W      R/W     R/W      R/W     R/W      R/W
;0000 = AIN0;0001 = AIN1;0010 = AIN2;0011 = AIN3;0100 = AIN4;0101 = AIN5;0110 = AIN6;
;0111 = AIN7;1000 = AIN8;1001 = AIN9;1010 = AIN10;1011 = AIN11;1100~1111 = 系统保留。
;********************************************************************************
L_Adc_Choose:

        clr                adm                                        ; 清ADM 寄存器。

        mov                a,#ADC_ADR_BUF                        ;set Fcpu/16, adc分辨率bit5=0是8bit; =1是10bit,
        b0mov        adr,a

        b0bset        fadenb                                ;使能ADC。

        mov                a,#200                                ;20=100US
        call        L_Delay_Xus                        ; 执行ADC 100us 启动时间延迟循环。

        mov                a,#0                                ;清0
        mov                a,rAdc_Choose                ;选择ADC的AIN8通道,即P4.0~P5.3引脚
        or                adm,a

        b0bset        fgchs                                ; 使能ADC 输入通道。总开关开启

        b0bclr        fadcirq                                ; 清ADC 中断请求。
        ;b0bset        fadcien                                ; 使能ADC 中断功能。采用查询法,故此具屏蔽了

        b0bset        fads                                ; 开始AD 转换。

;-----------------------------------------------------------------
aaa:
        b0bts1        feoc                                ; 检查ADC 状态标志。
        jmp                aaa                                        ; EOC=0:AD 转换中。
       
        mov                a,#0                                ;清0
        mov                a,rAdc_Choose
        b0add        pcl,a
        jmp                extern_vol                        ;检测外部电压
        jmp                Battery_vol                        ;检测电池本身电压
        jmp                guoliu_vol                        ;检测过流
;-----------------------------------------------------------------
extern_vol:
        b0mov        a,adb                        ; EOC=1:AD 转换结束,处理AD 转换结果。外部电源
        b0mov        rVol_Data0,a
        jmp                adc_exit
;-----------------------------------------------------------------
Battery_vol:
        b0mov        a,adb                        ; EOC=1:AD 转换结束,处理AD 转换结果。电池检测
        b0mov        rBat_Data0,a
        jmp                adc_exit
;-----------------------------------------------------------------
guoliu_vol:
        b0mov        a,adb                        ; EOC=1:AD 转换结束,处理AD 转换结果。过流检测
        b0mov        rAdc_Data0,a

        ;mov                a,#00000011b        ;8位此句不用
        ;and                a,adr                        ;8位此句不用
        ;b0mov        rAdc_Data2,a                ;8位此句不用 AD 转换结果处理完成。
;-----------------------------------------------------------------
adc_exit:
        b0bclr                feoc                        ; 清除ADC 状态标志以准备下一次ADC。


                ret




main:


callL_Adc_Init

nd:
mov   a,#1     ;选择转换通道AD1
mov   rAdc_Choose,a
call  L_Adc_Choose


mov   a,#2     ;选择转换通道AD2
mov   rAdc_Choose,a
call  L_Adc_Choose

mov   a,#0     ;选择转换通道AD0
mov   rAdc_Choose,a
call  L_Adc_Choose



  jmp  nd

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-12-24 10:05:31 | 显示全部楼层
void adc_init(void)
{
    FADENB = 1;
        delay100us();         //after ADC enable,must delay 100us
        delay100us();         //after ADC enable,must delay 100us
        P4CON = 0x01;         //P4.0  is ADC input
        ADR = 0x10;         //8bit adc,adcclock = fcpu/8
        ADM = 0x90;         // AD convert time:
}

void get_ad(void)
{
        FADS = 1;       
        while(FEOC==0);
       
        FEOC = 0;

    //NewValue = ADB;
        //adbuf_low  = ADR&0x0f;
        //NewValue = (NewValue<<4) | adbuf_low;

        AD_temp = ADB; //只取8位
}

出0入0汤圆

 楼主| 发表于 2011-12-24 10:32:05 | 显示全部楼层
好的,我试一下,感谢了

出0入0汤圆

 楼主| 发表于 2011-12-24 10:39:42 | 显示全部楼层
在程序中要进行几个通道的AD检测,有什么好的方法啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 03:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表