首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PIC24读取多个ADC通道;只能获取AN0

如何使用PIC24读取多个ADC通道;只能获取AN0
EN

Stack Overflow用户
提问于 2021-03-08 06:24:22
回答 1查看 451关注 0票数 0

我使用PIC24读取数据,使用3个模拟输入,但只得到1个来显示正确的结果。我在互联网上到处寻找,仍然不能让代码工作。

我正在尝试读取3个模拟输入信号,但只能在AN0中读取。

目前,我正在使用加速度计获取数据并将其显示在LCD屏幕上。我实现了3种不同的方法来获取和显示数据,但只有an0有效,而an1不是正确的值。

代码语言:javascript
复制
void InitADC(int amask) {
    AD1PCFG = 0xFFF8; // select AN0, AN1, AN2 as analog inputs
    AD1CON1 = 0x00E0; // auto convert @ end of sampling, Integer Data out.
    // see Text pg. 179 & Sec. 17 on AD1CON1.
    //AD1CON2bits.CSCNA = 1;
    AD1CON3 = 0x1F01; // Tad = 2xTcy = 125ns. 31*Tad for conversion time.
    //AD1CSSL = 0xFFF7; // Scan 3 channels
    AD1CON1bits.ADON = 1; // Turn on the ADC
} // InitADC

main() {
   InitADC(0xFFF8); // initialize the ADC and analog inputs 
   char x_string [12];
   char y_string [12];
   char z_string [12];
   //TRISB = 1; // all PORTB pins as outputs
   TRISBbits.TRISB0 = 1;
   TRISBbits.TRISB1 = 1;
   TRISBbits.TRISB2 = 1;
   InitPMP(); // Initialize the Parallel Master Port
   InitLCD(); // Initialize the LCD
   float x_val;
   float y_val;
   float z_val;
   float x_axis, y_axis, z_axis;

   while (1) // main loop
   {  
    x_axis= SelectPort(0);   
    x_val= ((((x_axis * 3.3)/ 1024)-1.58)/0.380);
    
    sprintf(x_string, "X: %0.2f ", x_val);
    ms_delay(2.5);

    y_axis= SelectPort(1);  
    y_val= ((((y_axis * 3.3)/ 1024)-1.58)/0.380);
    
    sprintf(y_string, "Y: %0.2f ", y_val);
    ms_delay(2.5);

    z_axis= SelectPort(2);  
    z_val= ((((z_axis * 3.3)/ 1024)-1.58)/0.380);
    
    sprintf(z_string, "Z: %0.2f ", z_val);
    ms_delay(2.5);
}

下面是读取数据的代码:

代码语言:javascript
复制
int SelectPort(int ch)
{
//int *result; 
AD1CON1bits.ADON = 0; // Turn off the ADC to reconfigure
//result = &ADC1BUF0;

switch(ch) // set values based on the channel to use
{
    case 0: // select AN0 as analog input
        //AD1CHSbits.CH0SA=0;
        //result = ADC1BUF0;
        AD1PCFG = 0xFFFE;
        break;
    
    case 1:
        //AD1CHSbits.CH0SA=1;
        //result = ADC1BUF1;
        AD1PCFG = 0xFFFD; // select AN1 as analog input
        break;
    
    case 2:
        //AD1CHSbits.CH0SA=2;
        AD1PCFG = 0xFFFB; // select AN2 as analog input
        break;
    
    // there's only so many options here, so there's not really a default case
}

AD1CON1bits.ADON = 1; // Turn on the ADC

AD1CHS = ch; // 1. select analog input channel

AD1CON1bits.SAMP = 1; // 2. Start sampling.
while (!AD1CON1bits.DONE); //5. wait for conversion to complete
AD1CON1bits.DONE = 0; // 6. clear flag. We are responsible see text.
return ADC1BUF0; // 7. read the conversion results
}

我是PIC24的新手,需要帮助来弄清楚为什么我不能获得多个模数转换通道来读取数据。

EN

回答 1

Stack Overflow用户

发布于 2021-03-14 13:39:33

更换输入端口后,应始终留出一段时间让ADC输入电压稳定下来。此外,请确保输入信号的阻抗小于10K。

分离ADC通道切换并读取其值将有所帮助,并使您有机会添加延迟。

我在PIC24数据表中找不到AD1PCFG。AD1PCFG是一个PIC32寄存器...PIC24使用ANSx和TRSx将引脚设置为模拟输入。在启动序列期间,应设置一次模拟输入。将模拟信号馈送到数字输入CMOS引脚将导致功耗增加,甚至可能导致硬件故障!

代码语言:javascript
复制
//  Set the pins as analog inputs once and for all in your setup code.
void InitADC() 
{
    // select RB0/AN0, RB1/AN1, RB2/AN2 as analog inputs
    TRISB   |= 0x07;
    ANSB    |= 0x07;

    // ...
}

void ADC_SelectInput(int ch)
{
    AD1CHS = ch & 0x0F
}

int ADC_Read()
{
    AD1CON1bits.SAMP = 1;
    while (!AD1CON1bits.DONE)
        ;
    AD1CON1bits.DONE = 0;
    return ADC1BUF0;
}

然后你的循环变成:

代码语言:javascript
复制
// ...


int adc_in;

while (1)
{  
    ADC_SelectInput(0);
    ms_delay(3);         // settling delay, you could also do something
                         // else in the meantime instead of waiting. 
                         // NOTE: the argument to ms_delay() is an integer
                         // so waiting at least 2.5 ms makes it 3. 

    // when computing floats, use float constants, not double.
    x_val  = (((ADC_Read() * 3.3f) / 1024) - 1.58f) / 0.380f;
    sprintf(x_string, "X: %0.2f ", x_val);

    ADC_SelectInput(1);
    ms_delay(3);
    y_val  = (((ADC_Read() * 3.3f) / 1024) - 1.58f) / 0.380f;
    sprintf(y_string, "Y: %0.2f ", y_val);

    ADC_SelectInput(2);
    ms_delay(3);
    z_val  = (((ADC_Read() * 3.3f) / 1024) - 1.58f) / 0.380f;
    sprintf(z_string, "Z: %0.2f ", z_val);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66522121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档