打印
[其它应用]

采集不到数值

[复制链接]
468|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kangzj|  楼主 | 2020-12-14 22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SH79F1612A 单片机AD采集

使用特权

评论回复
沙发
zhaoxqi| | 2020-12-14 22:18 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
kangzj|  楼主 | 2020-12-14 22:21 | 只看该作者

#include <SH79F1612A.H>
#include <intrins.h>
#include <config.h>

typedef unsigned char      uint8;                  
typedef signed   char      int8;                    
typedef unsigned short     uint16;                  
typedef signed   short     int16;                  
typedef unsigned long      uint32;                  
typedef signed   long      int32;                  

uint16 adval;



void delay(uint16 i)
{
        while(i--);
}


void Init_IO()
{
                P4M0 = 0x00;
                P4M1 = 0x04;
                P3M0 = 0x00;
                P3M1 = 0x04;
}



uint16 Sample_AD(uint8 ch,uint8 smdt)
{
         uint16 adval;
         
   if(smdt==0)
   {
      ADT=Bin(00000000);                  //ADʱÖÓΪ1¸öCLK  ²ÉÑùʱ¼ä1¸öADʱÖÓ
   }
   else
   {
      ADT  =Bin(11101111);                  //ADʱÖÓΪ12¸öCLK  ²ÉÑùʱ¼ä3¸öADʱÖÓ
   }        

   switch(ch)
   {
      case 0:       //AN0
               ADCH=Bin(00000001);
         ADCON=Bin(10000001);                 //ʹÄÜAD0 Æô¶¯×ª»»
               break;
      case 1:       //AN1
               ADCH=Bin(00000010);
         ADCON=Bin(10000011);                 //ʹÄÜAD1 Æô¶¯×ª»»
               break;
      case 2:       //AN2
               ADCH=Bin(00000100);
         ADCON=Bin(10000101);                 //ʹÄÜAD2 Æô¶¯×ª»»
               break;
      case 3:       //AN3
               ADCH=Bin(00001000);
         ADCON=Bin(10000111);                 //ʹÄÜAD3 Æô¶¯×ª»»
               break;      
      case 4:       //AN4
               ADCH=Bin(00010000);
         ADCON=Bin(10001001);                 //ʹÄÜAD4 Æô¶¯×ª»»
               break;
      case 5:       //AN5
               ADCH=Bin(00100000);
         ADCON=Bin(10001011);                 //ʹÄÜAD5 Æô¶¯×ª»»
               break;  
      case 6:       //AN6
               ADCH=Bin(01000000);
         ADCON=Bin(10001101);                 //ʹÄÜAD6 Æô¶¯×ª»»
               break;  
      case 7:       //AN7
               ADCH=Bin(10000000);
         ADCON=Bin(10001111);                 //ʹÄÜAD7 Æô¶¯×ª»»
               break;
      default:                  //ζȴ«¸ÐÆ÷
               break;
   }

   while((ADCON&Bin(01000000))==0)
   {
      _nop_();
   }           

   adval=ADDH*4+ADDL;
   ADCON=Bin(00000000);                 //¹Ø±ÕAD
   
   return(adval);
}               
/*********************************************************************************************

** º¯ÊýÃû³Æ: main
** º¯ÊýÃèÊö: Ö÷º¯Êý
** ÊäÈë²ÎÊý: ÎÞ
** Êä³ö²ÎÊý: ÎÞ
*********************************************************************************************/
void main()
{        
                P4_2 = 1;
                Init_IO();
                //Init_AD();
while(1)
{
Sample_AD(1,1);
                //GetADCH_8();
                //GetADCL_8();
                //GetADC_16();
                if(adval >1001001110)
                {
                         P4_2 = 0;
                         P3_2 = 0;
                         delay(50000);
                   P3_2 = 1;
                   delay(50000);

          }
         else
         {
                   P4_2 = 1;
         }
}
}

使用特权

评论回复
地板
gongche| | 2020-12-14 22:24 | 只看该作者
我看楼主AD取样的代码并没有什么问题

使用特权

评论回复
5
wenfen| | 2020-12-14 22:28 | 只看该作者
每次采样前需要清ADC中断请求标志,ADCIF=0
ADCON &= Bin(10111111); //清ADC中断请求标志,ADCIF=0

使用特权

评论回复
6
wenfen| | 2020-12-14 22:31 | 只看该作者
采样后或下一次采样前、需要将GO/DONE标志位置一
ADCON |= Bin(00000001); //GO/DONE标志位置一,开始下一次ADC转换

使用特权

评论回复
7
stly| | 2020-12-14 22:38 | 只看该作者
初始化参考:
    ADCON = Bin(10000000);   //允许ADC模块
    ADT = Bin(11101110);     //ADC时钟为系统时钟的32分频,T(ad) = 32*(1/8.192M) = 4us
                             //ADC采样时间为15个ADC时钟,T(s)= (14+1)*T(ad) = 60us
                             //ADC转换时间为12*T(ad) + T(s) = 108us
    ADCH = Bin(11111111);   //通道全开
    ADCON &= ~Bin(00001110); //清楚选择通道选择标志位[2:0]
    ADCON |= Bin(00000100);  //选择CH2通道作为初始通道
    ADCON |= Bin(00000001);  //开始ADC转换

使用特权

评论回复
8
supernan| | 2020-12-14 22:41 | 只看该作者
我之前遇到过烧录器供电仿真读ADC,和烧录口复用的端口AD值一直为0,
后查明原因为烧录器默认烧录口是下拉的

使用特权

评论回复
9
chenjunt| | 2020-12-14 22:45 | 只看该作者
可是楼主用的是1通道

使用特权

评论回复
10
guoyt| | 2020-12-14 22:48 | 只看该作者
嗯,非烧录复用端口

使用特权

评论回复
11
yufe| | 2020-12-14 22:52 | 只看该作者
但是楼主if(adval >1001001110) 中的adval是16位撑死也只能够到65535吧

使用特权

评论回复
12
kangzj|  楼主 | 2020-12-14 22:59 | 只看该作者
现在有新的问题,ADDH高位有数据,ADDL低位没有数据(显示0x00),这是怎么回事?

使用特权

评论回复
13
zhanglli| | 2020-12-14 23:02 | 只看该作者
其实adval=ADDH*4+ADDL;这一句我不太懂

使用特权

评论回复
14
huanghuac| | 2020-12-14 23:06 | 只看该作者
为什么ADDH*4?

使用特权

评论回复
15
kangzj|  楼主 | 2020-12-14 23:10 | 只看该作者
我用的这款单片机是1612A,是十位的AD

使用特权

评论回复
16
zhuhuis| | 2020-12-14 23:14 | 只看该作者
看一下输入电压正常吗

使用特权

评论回复
17
kangzj|  楼主 | 2020-12-14 23:18 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

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

本版积分规则

672

主题

7007

帖子

2

粉丝