沙龙娱乐棋牌总公司: [资源共享] 填坑,接上个帖子,官方例程改错(三)ADC多通道篇

永利游戏开户直营
284|4
楼主
本帖最后由 jiaisr123 于 2020-3-25 20:16 编辑

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

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

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

  65.         while(1)
  66.         {
  67.                 if(gui_AdcValue_a[0] <= 0x10)
  68.      {
  69.                     P0_0 = 1;
  70.                    }
  71.                 else
  72.      {
  73.                     P0_0 = 0;
  74.                    }
  75.                 if(gui_AdcValue_a[1] <= 0x10)
  76.      {
  77.                     P1_0 = 1;
  78.                    }
  79.                 else
  80.      {
  81.                     P1_0 = 0;
  82.                    }
  83.         }
  84. }

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

  100. /**
  101.   * @说明          延时函数
  102.   * @参数          fui_i : 延时时间
  103.   * @返回值 无
  104.   * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为2us
  105.   */
  106. void Delay_2us(unsigned int fui_i)
  107. {
  108.         while(fui_i--);        
  109. }
复制代码
复制,粘贴
沙发
 楼主 | 2020-3-25 20:15 | 只看该作者
板凳
| 2020-4-8 11:37 | 只看该作者
通道转换后加的延时似乎帮助很小,需要加很多才能达到目的,不如丢掉切换通道后的第一个数效率更高,另外选择22个时钟周期精度会有所提高
转换一次比延时可以更快达到消除通道串扰的目标
地板
| 2020-4-8 17:19 | 只看该作者
有个问题想请教一下,这个AD采样出来的值,如果我不读取不处理的话,它是一直固定的数值,有没有办法我不处理的时候它一直自动更新最新的数值啊。有这样的设置吗?现在的办法是我每10个毫秒打开一次进行采样,然后再关闭,感觉这样太浪费资源又不方便…………
5
| 2020-4-8 18:01 | 只看该作者
sbalwalw 发表于 2020-4-8 17:19
有个问题想请教一下,这个AD采样出来的值,如果我不读取不处理的话,它是一直固定的数值,有没有办法我不处 ...

没有定时器或者外部触发,不可能达成自动启动采样的,采样后没有dma也不可能转存数据
替代的做法就是把adc配置的很慢,然后用完成中断去获取数据,adc慢了还准一点,不过太慢了可能也不行
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
澳门太阳城广西快3开奖结果 澳门普京入口测试登入 851tyc.com 百家乐云南时时彩计划群大全 sun565.com
ek娱乐GPK棋牌 万象城开元棋牌 添运SW ek娱乐AG捕鱼王 圣淘沙娱乐FG电子
圣淘沙娱乐对战 广东会娱乐DS太阳城棋牌 亿万先生SW电子 格林娱乐棋牌官网 sun189.com
www.555.bo 广东会娱乐DS太阳城棋牌 澳门银河直营官方登入 188金宝博游戏棋牌中国总代理 279sb.com