您的位置: OpenADSP社区论坛 -> Sigma DSP/模拟器件专区 -> 新手上路 -> AD7124-8做多路PT100采集
本帖共有21个阅读者
发表帖子 发表投票 回复主题
AD7124-8做多路PT100采集
夜歌(论坛新手)
夜歌
头衔:社区公民
帮派:无帮无派
帖数:1
金钱:110
积分:2
注册时间:2025/8/15
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
AD7124-8做多路PT100采集
用AD7124-8做了一个4路的三线PT100采集,使用了4个通道,并且每个通道各自有自己的配置寄存器,我的代码如下
void vTaskAnalogInExe(void *pvParameter)//ANALOG_TIME_CH
{    
    struct ad7124_dev tAd7124; //设备结构体
    int aiTemperatureCode[4][2] = {0};//温度码值
    double faRtdRes[4] = {0};//RTD电阻值
    float faTemperature[4] = {0};
    float faGain[4] = {0.99999,1.0024,1.0024,1};
    uint8_t count = 0;
    
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOA,GPIO_Pin_3);    
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);      
    
    
    tAd7124.regs = ad7124_regs;     //指定寄存器表
    tAd7124.check_ready = 0;        //是否读取内部准备标志
    tAd7124.use_crc = AD7124_DISABLE_CRC;//不进行CRC
    tAd7124.spi_rdy_poll_cnt = 1000;     //超时计数
    tAd7124.psw_flag = 0;                //内部开关标志
    tAd7124.delay_callback = vTaskDelay; //注册内部使用的延时函数
    
    if(ad7124_reset(&tAd7124) != 0)    
        App_Printf(0,"RstErr\r\n");      

    /* 设置ADC控制寄存器 */
    tAd7124.regs[AD7124_ADC_Control].value |= (AD7124_ADC_CTRL_REG_REF_EN        | //内部参考电压输出使能
                                                AD7124_ADC_CTRL_REG_MODE(4)       | //进入空闲模式
                                                AD7124_ADC_CTRL_REG_POWER_MODE(2) |//全功率  
                                                AD7124_ADC_CTRL_REG_CLK_SEL(0)      //内部614.4K
                                                );                
    ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);               //设置ADC控制寄存器  
    ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_ADC_Control]);
    App_Printf(0,"ctrl:%#x\r\n",tAd7124.regs[AD7124_ADC_Control].value);    

    for(int i = 0;i<4;i++)
    {
        //设置配置寄存器
        tAd7124.regs[AD7124_Config_0+i].value &= ~(AD7124_CFG_REG_BIPOLAR |     //单极性
                                                   AD7124_CFG_REG_PGA(0x7) |    
                                                   AD7124_CFG_REG_REF_SEL(0x3));
        
        tAd7124.regs[AD7124_Config_0+i].value |= (AD7124_CFG_REG_PGA(3) |       //增益8
                                                  AD7124_CFG_REG_REF_SEL(0) |    //参考选择 REFIN1(+)/REFIN1(?)
                                                  AD7124_CFG_REG_REF_BUFM |      //REFINx(-)缓冲打开
                                                  AD7124_CFG_REG_REF_BUFP |      //REFINx(+)缓冲打开
                                                  AD7124_CFG_REG_AIN_BUFP |      //AINP缓冲打开
                                                  AD7124_CFG_REG_AINN_BUFM);     //AINM缓冲打开
        ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Config_0+i]);      //写入配置寄存器  
        ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Config_0+i]);
        App_Printf(0,"c%d:%#x\r\n",i,tAd7124.regs[AD7124_Config_0+i].value);        

        //设置滤波器寄存器
        tAd7124.regs[AD7124_Filter_0+i].value &= ~AD7124_FILT_REG_FS(0x7FF);  
        tAd7124.regs[AD7124_Filter_0+i].value |= AD7124_FILT_REG_FS(30);      //设置通道输出数据速率 15:1280 SPS
        ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Filter_0+i]);      //写入滤波器寄存器
        ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Filter_0+i]);
        App_Printf(0,"f%d:%#x\r\n",i,tAd7124.regs[AD7124_Filter_0+i].value);        
        
        ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Gain_0+i]);
        tAd7124.regs[AD7124_Gain_0+i].value *= faGain[i];
        ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Gain_0+i]);
        
        //设置通道寄存器
        tAd7124.regs[AD7124_Channel_0+i].value &= ~(AD7124_CH_MAP_REG_CH_ENABLE |//默认关闭通道
                                                    AD7124_CH_MAP_REG_AINM(0x1f) |
                                                    AD7124_CH_MAP_REG_AINP(0x1f) |
                                                    AD7124_CH_MAP_REG_SETUP(0x7));

        tAd7124.regs[AD7124_Channel_0+i].value |= (AD7124_CH_MAP_REG_AINM(1+i*4) |//设置通道负极管脚,对应原理图1、5、9、13
                                                   AD7124_CH_MAP_REG_AINP(2+i*4) | //设置通道正极管脚,对应原理图2、6、10、14
                                                   AD7124_CH_MAP_REG_SETUP(i));    //设置通道使用的配置寄存器和滤波寄存器  
                                                  
        ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Channel_0+i]);        //设置配置寄存器1
        ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Channel_0+i]);
        App_Printf(0,"ch%d:%#x\r\n",i,tAd7124.regs[AD7124_Channel_0+i].value);    
    }

    //设置错误寄存器,使能参考检测功能
    tAd7124.regs[AD7124_Error_En].value |= AD7124_ERREN_REG_REF_DET_ERR_EN;   //使能参考监测
    ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Error_En]);            //设置ADC控制寄存器  
    ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error_En]);
    App_Printf(0,"err_en:%#x\r\n",tAd7124.regs[AD7124_Error_En].value);      

    for(;;)
    {
        switch(count)//设置通道的管脚和测试电流
        {
            case 0:
                ad7124_ch_ctrl(&tAd7124,0,1);    //打开通道  
                ad7124_set_cur(&tAd7124,0,AD7124_IOUT_500UA,3,AD7124_IOUT_500UA);//IOUT0->INT0:500mA,IOUT1->INT3:500mA  
      
                tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
                tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1);         //启动转换  
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器  
                GPIOA->BSRR = (1 << 3);
                if(ad7124_wait_to_conv_ready(&tAd7124,10000) == 0)//等待转换完成
                {                  
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[0][0]);      
                }  
                GPIOA->BSRR = (1 << (3 + 16));
                
                ad7124_set_cur(&tAd7124,3,AD7124_IOUT_500UA,0,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA  
                
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器
                GPIOA->BSRR = (1 << 3);
                if(ad7124_wait_to_conv_ready(&tAd7124,10000) == 0)//等待转换完成
                {              
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[0][1]);          
                }              
                GPIOA->BSRR = (1 << (3 + 16));
  
                ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
                if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
                {  
                    App_Printf(0,"ref err0 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
                }
                    
                ad7124_ch_ctrl(&tAd7124,0,0);    //关闭通道
                                
                faRtdRes[0] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[0][0]);//转换电阻值
                if(PT100_ResistanceToTemp(faRtdRes[0],&faTemperature[0]) == PT100_OK)//转换温度
                {
//                    App_Printf(0,"t0=%.3f\r\n",faTemperature[0]);
                }    
                break;
            case 1:            
                ad7124_ch_ctrl(&tAd7124,1,1);    //打开通道  
                ad7124_set_cur(&tAd7124,4,AD7124_IOUT_500UA,7,AD7124_IOUT_500UA);//IOUT0->INT4:500mA,IOUT1->INT7:500mA
            
                tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
                tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1);         //启动转换  
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器  
                if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
                {
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[1][0]);  
                }    
                
                ad7124_set_cur(&tAd7124,7,AD7124_IOUT_500UA,4,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA    

                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);  //设置ADC控制寄存器  
                if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
                {
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[1][1]);  
                }
                
                ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
                if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
                {
                    App_Printf(0,"ref err1 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
                }      
                ad7124_ch_ctrl(&tAd7124,1,0);    //关闭通道
              
                faRtdRes[1] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[1][0]);
                if(PT100_ResistanceToTemp(faRtdRes[1],&faTemperature[1]) == PT100_OK)
                {
//                    App_Printf(0,"t1=%.3f\r\n",faTemperature[1]);
                }  
                break;
            case 2:    
                ad7124_ch_ctrl(&tAd7124,2,1);    //打开通道
                ad7124_set_cur(&tAd7124,8,AD7124_IOUT_500UA,11,AD7124_IOUT_500UA);//IOUT0->INT8:500mA,IOUT1->INT11:500mA                      

                tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
                tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1);         //启动转换  
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器  
                if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
                {
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[2][0]);  
                }
                
                ad7124_set_cur(&tAd7124,11,AD7124_IOUT_500UA,8,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA
                
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器  
                if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
                {
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[2][1]);  
                }        
                
                ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
                if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
                {
                    App_Printf(0,"ref err2 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
                }
                ad7124_ch_ctrl(&tAd7124,2,0);    //关闭通道
                
                faRtdRes[2] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[2][0]);
                if(PT100_ResistanceToTemp(faRtdRes[2],&faTemperature[2]) == PT100_OK)
                {
//                    App_Printf(0,"t2=%.3f\r\n",faTemperature[2]);
                }  
                break;

            case 3:        
                ad7124_ch_ctrl(&tAd7124,3,1);    //打开通道
                ad7124_set_cur(&tAd7124,12,AD7124_IOUT_500UA,15,AD7124_IOUT_500UA);//IOUT0->INT8:500mA,IOUT1->INT11:500mA                    
            
                tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
                tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1);         //启动转换  
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器  
                if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
                {
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[3][0]);  
                }      
                
                ad7124_set_cur(&tAd7124,15,AD7124_IOUT_500UA,12,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA  
                
                ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]);              //设置ADC控制寄存器  
                if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
                {
                    ad7124_read_data(&tAd7124,&aiTemperatureCode[3][1]);  
                }

                ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
                if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
                {
                    App_Printf(0,"ref err3 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
                }    
                ad7124_ch_ctrl(&tAd7124,3,0);    //打开通道
                
                faRtdRes[3] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[3][0]);
                if(PT100_ResistanceToTemp(faRtdRes[3],&faTemperature[3]) == PT100_OK)
                {
//                    App_Printf(0,"t3=%.3f\r\n",faTemperature[3]);
                }    
  

                break;          
        }

        
        vTaskDelay(50);
        if(++count == 4)
        {
            count = 0;

            GPIOA->ODR ^= (1 << 2);
            App_Printf(0,"t0=%.3f,t1=%.3f,t2=%.3f,t3=%.3f\r\n",faRtdRes[0],faRtdRes[1],faRtdRes[2],faRtdRes[3]);
//            App_Printf(0,"t0=%.3f,t1=%.3f,t2=%.3f,t3=%.3f\r\n",faTemperature[0],faTemperature[1],faTemperature[2],faTemperature[3]);            
            count = 0;
        }
        
              
//        vTaskDelay(10);

//        vTaskDelay(1000);
    }
}

现在我遇到的问题是:

1)使用外部电压基准监控的时候,这个监控生效的状态十分奇怪,按照手册所说的,外部断开或者基准低于0.7就会置位,但是我打开通道和电流源之后,循环读取错误寄存器,关闭通道,基准电压检测一直报错,只有进行一次转换之后,才不会触发这个错误

2) pt100未接时,触发了基准电压检测,按照手册所示,转换过后的数据应该是0xffffff,但是我打印查看并非如此,只是会偶尔变成0xffffff,很多时候是0

3)进行4个通道读取的时候,如果通道3的pt100没有接,通道0读取的时候,可以读取到数值,但是也会触发基准电压检测,1.2通道不会,并且通道0的数据受到影响,如果通道0未接,那么就是通道1会触发基准电压检测,数据会被影响

另外,我使用逻辑分析仪抓取协议的时候,发现通道0 读取状态寄存器判断是否转换完成的时候,发现低三位一直指示的前一个通道,直到转换完成的那一帧数据才是通道0的,其他通道也是一样


不甘黄土掩枯骨,宁化寒光映碧霄
等级:论坛新手 参考IP地址:*.*.*.*
2025/8/15 15:19:45
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.166447 Call, 1 Queries, Processed in 0.101563 second(s),