[其他产品] 简单的PIC24的AD转换不了

[复制链接]
1340|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函数的开始部分,而不是循环中。
ynwa 发表于 2024-12-10 14:58 | 显示全部楼层
当 SSRC<2:0> = 000 时,ADC转换由软件清零 SAMP 位来启动。看你的代码没什么问题。你确认一下你设置的ADC时钟周期是否满足数据手册的TAD参数。
stormwind123 发表于 2024-12-10 17:00 | 显示全部楼层
您正在使用轮询(polling)来检查DONE位。这是可行的,但可能会降低程序的效率,特别是如果ADC转换时间较长的话。此外,如果DONE位由于某种原因没有被置1(比如时钟问题、配置错误等),程序将会陷入死循环。
小明的同学 发表于 2024-12-13 09:50 | 显示全部楼层
配置不对啊,你这个支持MCC配置不,用那个配置不会出错,代码也会看起来简单。
gejigeji521 发表于 2024-12-15 14:11 来自手机 | 显示全部楼层
先跑个官方的示例试试看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1471

主题

5021

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部