打印
[资源共享]

填坑,接上个帖子,官方例程改错(三)ADC多通道篇

[复制链接]
1084|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiaisr123|  楼主 | 2020-3-25 20:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jiaisr123 于 2020-3-25 20:16 编辑

P10引脚设置错误了可能
/**
*   ************************************************************************************
*                                                                上海芯圣电子股份有限公司
*                                                                    www.holychip.cn
*        ************************************************************************************
*        @Examle Version                V1.0.4.0
*        [url=home.php?mod=space&uid=1102]@demo[/url]         Version                V1.0.4.0
*        [url=home.php?mod=space&uid=212281]@date[/url]                                2019.07.22
*        ************************************************************************************
*                                                                         模块性能介绍
*        1、MCU提供10/12位ADC检测,拥有11路外部输入通道以及2路内部输入通道
*        2、参考电压可选择内部Vref(VDD、2V、3V、4V)以及外部Vref,转换后的数据可选择数据位
*           数和对齐方向
*        ************************************************************************************
*                                                                         应用注意事项
*        1、在掉电模式下,ADCEN强制为0,ADC失能。
*        2、为保证ADC转换精度,建议ADC转换时钟频率在2MHz及2MHz以下。
*        3、内部参考电压选择2V时,VDD工作电压须高于2.7V。内部参考电压选择3V/4V时,VDD工作电
*           压须高于内部参考电压0.5V以上。
*        4、启动ADC转换时,需要关闭ADC省电唤醒功能。使能ADC模块或者切换通道后,为保证精度建
*      议延时20us再启动转换。
*        5、启动转换时,ADCIF需要先软件清0,ADCIF位为1时,置ADCST不能启动新的转换。在转换过
*           程中,若ADCST位软件清0将终止转换。
*        6、在进行内部通道选择时,外部通道选择XCHS[3:0]应配置为1111,否则可能会造成内部通道
*           和外部通道同时打开的情况。
*        7、芯片进入掉电模式时将ADCC0中的INREF_S寄存器设置为非VDD电压,可以进一步降低电流。
*        ************************************************************************************
*                                                                         客户服务
*        感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
*        ****************************技术支持群:201030494***********************************
*   ************************************************************************************
**/

#define        ALLOCATE_EXTERN
#include "HC89S003F4.h"
                        
void Delay_2us(unsigned int fui_i);                                //延时函数
                        
unsigned int  gui_AdcValue_a[2] = {0x00};               //用于存放ADC的值
unsigned char guc_AdcChannel_a[2] = {0x01,0x02};        //ADC通道号
unsigned char guc_Count = 0;                                        //切换通达计数

/***************************************************************************************
  * @实现效果        对AN1以及AN2进行ADC转换
***************************************************************************************/
void main()
{
/************************************系统初始化****************************************/
        WDTCCR = 0x00;                                                //关闭看门狗
                                            //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
        CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************相关配置初始化**************************************/
        P0M0 = P0M0&0xF0|0x08;                //P00设置为推挽输出
        P1M0 = P1M0&0xF0|0x08;                //P10设置为推挽输出
/************************************ADC初始化*****************************************/
        P0M0 = P0M0&0x0F|0x30;                //P01设置为模拟输入
        P0M1 = P0M1&0xF0|0x03;                //P02设置为模拟输入
        ADCC0 = 0x80;                                                 //打开ADC转换电源
        Delay_2us(10);                                                //延时20us,确保ADC系统稳定
        ADCC1 = 0x00;                                                  //选择外部通道0
        ADCC2 = 0x4D;                                                  //转换结果12位数据,数据右对齐,ADC时钟16分频
        IE1 |= 0x20;                                                  //打开ADC中断                                       
        EA = 1;                                                                    //打开总中断
        ADCC0 &=~ 0x20;                                                //清除ADC中断标志位
        ADCC0 |= 0x40;                                                //启动ADC转换

        while(1)
        {
                if(gui_AdcValue_a[0] <= 0x10)
     {
                    P0_0 = 1;
                   }
                else
     {
                    P0_0 = 0;
                   }
                if(gui_AdcValue_a[1] <= 0x10)
     {
                    P1_0 = 1;
                   }
                else
     {
                    P1_0 = 0;
                   }
        }
}

/***************************************************************************************
  * @说明          ADC中断服务函数
  *        @参数        无
  * @返回值 无
  * @注                无
***************************************************************************************/
void ADC_Rpt() interrupt ADC_VECTOR
{
        ADCC0 &=~ 0x20;                                                                               //清除ADC中断标志位
        gui_AdcValue_a[guc_Count++] = ADCR;                             //获取数据
        if(guc_Count==2)guc_Count=0;
        ADCC1 = (ADCC1&(~0x07))|(guc_AdcChannel_a[guc_Count]);   //选择外部通道
        Delay_2us(10);                                                                               //切换通道后建议延时20us
        ADCC0 |= 0x40;                                                                               //启动下一次转换
}

/**
  * @说明          延时函数
  * @参数          fui_i : 延时时间
  * @返回值 无
  * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为2us
  */
void Delay_2us(unsigned int fui_i)
{
        while(fui_i--);        
}
复制,粘贴

使用特权

评论回复
沙发
jiaisr123|  楼主 | 2020-3-25 20:15 | 只看该作者

使用特权

评论回复
板凳
wangshujun| | 2020-4-8 11:37 | 只看该作者
通道转换后加的延时似乎帮助很小,需要加很多才能达到目的,不如丢掉切换通道后的第一个数效率更高,另外选择22个时钟周期精度会有所提高
转换一次比延时可以更快达到消除通道串扰的目标

使用特权

评论回复
地板
sbalwalw| | 2020-4-8 17:19 | 只看该作者
有个问题想请教一下,这个AD采样出来的值,如果我不读取不处理的话,它是一直固定的数值,有没有办法我不处理的时候它一直自动更新最新的数值啊。有这样的设置吗?现在的办法是我每10个毫秒打开一次进行采样,然后再关闭,感觉这样太浪费资源又不方便…………

使用特权

评论回复
5
wangshujun| | 2020-4-8 18:01 | 只看该作者
sbalwalw 发表于 2020-4-8 17:19
有个问题想请教一下,这个AD采样出来的值,如果我不读取不处理的话,它是一直固定的数值,有没有办法我不处 ...

没有定时器或者外部触发,不可能达成自动启动采样的,采样后没有dma也不可能转存数据
替代的做法就是把adc配置的很慢,然后用完成中断去获取数据,adc慢了还准一点,不过太慢了可能也不行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

33

帖子

0

粉丝