打印
[其他产品]

简单的PIC24的AD转换不了

[复制链接]
579|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2024-12-10 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用PIC24HJ128GP510芯片AD转换,在采集之后转换不了,DONE不能被置1

#include<p24HJ128GP510.h>

volatile static unsigned int LedNumVal=1059 ;
void lcddelay(unsigned char ms)   //(3j+11)*i个指令周期
{
        unsigned char i,j;                        //
        for(i=ms;i>0;i--)
     for(j=996;j>0;j--)       
          {;}
         
}

void initacd(void)
{
       
        AD1PCFGL=0XfffF;
        AD1PCFGH=0XFFFF;
       
        AD1PCFGLbits.PCFG3=0;        //AN3
        TRISBbits.TRISB3=1;
        AD1CON1=0X0000;                //SHOU=1采样  SAMP=0开始转换
        AD1CON2=0X0000;                //Vadd  Vss  1个采样产生一个中断
        AD1CON3=0X0009;            //9*Tcy=3*1/3us ;Fosc=6M;32*Tad
        AD1CHS0=0X0003;                //AN3
        AD1CSSL=0;
        AD1CON1bits.ADON=1;                    //开启AD模块       
}


main(void)
{
  while(1)  //进入循环状态
  {          
          initacd();       
      lcddelay(10);
          AD1CON1bits.SAMP = 1;
          lcddelay(10);
          AD1CON1bits.SAMP = 0;
          while(!AD1CON1bits.DONE);
          LedNumVal = ADC1BUF0;          
  }   
}

使用特权

评论回复
沙发
laocuo1142| | 2024-12-10 11:13 | 只看该作者
可能是ADC时钟配置有误

使用特权

评论回复
板凳
flycamelaaa| | 2024-12-10 11:37 | 只看该作者
检查电源和接地问题

使用特权

评论回复
地板
powerantone| | 2024-12-10 14:00 | 只看该作者
您在main函数的循环中重复调用了initacd()函数。这通常不是最佳实践,因为ADC的初始化(如开启ADC模块)只需要在程序开始时进行一次。您应该将初始化代码放在main函数的开始部分,而不是循环中。

使用特权

评论回复
5
ynwa| | 2024-12-10 14:58 | 只看该作者
当 SSRC<2:0> = 000 时,ADC转换由软件清零 SAMP 位来启动。看你的代码没什么问题。你确认一下你设置的ADC时钟周期是否满足数据手册的TAD参数。

使用特权

评论回复
6
stormwind123| | 2024-12-10 17:00 | 只看该作者
您正在使用轮询(polling)来检查DONE位。这是可行的,但可能会降低程序的效率,特别是如果ADC转换时间较长的话。此外,如果DONE位由于某种原因没有被置1(比如时钟问题、配置错误等),程序将会陷入死循环。

使用特权

评论回复
7
小明的同学| | 2024-12-13 09:50 | 只看该作者
配置不对啊,你这个支持MCC配置不,用那个配置不会出错,代码也会看起来简单。

使用特权

评论回复
8
gejigeji521| | 2024-12-15 14:11 | 只看该作者
先跑个官方的示例试试看

使用特权

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

本版积分规则

1339

主题

3897

帖子

0

粉丝