liao6 发表于 2025-8-22 09:14

【每周分享】AD7124采集工作流程

本帖最后由 liao6 于 2025-8-25 10:04 编辑

@21小跑堂、#申请原创#

本文介绍软件设置工作流程:

一、初始化参数      初始化采用官方提供的驱动程序,直接调用AD7124_Setup(&g_ad7124dev,ad7124_regs)即可,寄存器配置需要根据自己需求进行相应配置,双通道采集配置参数如下:ad7124_st_reg ad7124_regs ={    {0x00, 0x00,   1, 2}, /* AD7124_Status */    {0x01, 0x14C0,   2, 1}, /* AD7124_ADC_Control 全功率模式,连续转换0x04C0 ADC_CONTROL的DOUT_RDY_DEL位置1*/    {0x02, 0x0000,   4, 2}, /* AD7124_Data */    {0x03, 0x0000,   3, 1}, /* AD7124_IOCon1 */    {0x04, 0x0000,   2, 1}, /* AD7124_IOCon2 */    {0x05, 0x02,   1, 2}, /* AD7124_ID */    {0x06, 0x0000,   3, 2}, /* AD7124_Error */    {0x07, 0x0044,   3, 1}, /* AD7124_Error_En *///进行CRC校验    {0x08, 0x00,   1, 2}, /* AD7124_Mclk_Count */    {0x09, 0x8011,   2, 1}, // 读取通道0 8011    {0x0A, 0x0001,   2, 1}, /* AD7124_Channel_1读取通道2 8031*/    {0x0B, 0x0001,   2, 1}, /* AD7124_Channel_2 */     {0x0C, 0x0001,   2, 1}, /* AD7124_Channel_3 */    {0x0D, 0x0001,   2, 1}, /* AD7124_Channel_4 */    {0x0E, 0x0001,   2, 1}, /* AD7124_Channel_5 */    {0x0F, 0x0001,   2, 1}, /* AD7124_Channel_6 */    {0x10, 0x0001,   2, 1}, /* AD7124_Channel_7 */    {0x11, 0x0001,   2, 1}, /* AD7124_Channel_8 */    {0x12, 0x0001,   2, 1}, /* AD7124_Channel_9 */    {0x13, 0x0001,   2, 1}, /* AD7124_Channel_10 */    {0x14, 0x0001,   2, 1}, /* AD7124_Channel_11 */    {0x15, 0x0001,   2, 1}, /* AD7124_Channel_12 */    {0x16, 0x0001,   2, 1}, /* AD7124_Channel_13 */    {0x17, 0x0001,   2, 1}, /* AD7124_Channel_14 */    {0x18, 0x0001,   2, 1}, /* AD7124_Channel_15 */    {0x19, 0x01E0,   2, 1}, /* AD7124_Config_0 *///PGA10x01E0    {0x1A, 0x0000,   2, 1}, /* AD7124_Config_1 */    {0x1B, 0x0000,   2, 1}, /* AD7124_Config_2 */    {0x1C, 0x0000,   2, 1}, /* AD7124_Config_3 */    {0x1D, 0x0000,   2, 1}, /* AD7124_Config_4 */    {0x1E, 0x0000,   2, 1}, /* AD7124_Config_5 */    {0x1F, 0x0000,   2, 1}, /* AD7124_Config_6 */    {0x20, 0x0000,   2, 1}, /* AD7124_Config_7 */    //滤波和采样速度    {0x21, 0x010001, 3, 1},//0x010001    {0x22, 0x000000, 3, 1}, /* AD7124_Filter_1 */    {0x23, 0x000000, 3, 1}, /* AD7124_Filter_2 */    {0x24, 0x000000, 3, 1}, /* AD7124_Filter _3 */    {0x25, 0x000000, 3, 1}, /* AD7124_Filter_4 */    {0x26, 0x000000, 3, 1}, /* AD7124_Filter_5 */    {0x27, 0x000000, 3, 1}, /* AD7124_Filter_6 */    {0x28, 0x000000, 3, 1}, /* AD7124_Filter_7 */    {0x29, 0x800000, 3, 1}, /* AD7124_Offset_0 */    {0x2A, 0x800000, 3, 1}, /* AD7124_Offset_1 */    {0x2B, 0x800000, 3, 1}, /* AD7124_Offset_2 */    {0x2C, 0x800000, 3, 1}, /* AD7124_Offset_3 */    {0x2D, 0x800000, 3, 1}, /* AD7124_Offset_4 */    {0x2E, 0x800000, 3, 1}, /* AD7124_Offset_5 */    {0x2F, 0x800000, 3, 1}, /* AD7124_Offset_6 */    {0x30, 0x800000, 3, 1}, /* AD7124_Offset_7 */    {0x31, 0x500000, 3, 1}, /* AD7124_Gain_0 */    {0x32, 0x500000, 3, 1}, /* AD7124_Gain_1 */    {0x33, 0x500000, 3, 1}, /* AD7124_Gain_2 */    {0x34, 0x500000, 3, 1}, /* AD7124_Gain_3 */    {0x35, 0x500000, 3, 1}, /* AD7124_Gain_4 */    {0x36, 0x500000, 3, 1}, /* AD7124_Gain_5 */    {0x37, 0x500000, 3, 1}, /* AD7124_Gain_6 */    {0x38, 0x500000, 3, 1}, /* AD7124_Gain_7 */};这是读通道0数据,读通道1数据只需要修改0x09寄存器数据为0x8031(因为AVSS接地线),参数的设置需要详细看手册才能明白。
二、采集数据      每两个数求平均代码:unsigned long int GetAdAvrgValue(U32 * pdata,uint8_t num){    unsigned long int max, min;    unsigned long int sum;    uint8_t i;        min = pdata;                                             // 赋值最小值    max = pdata;                                             // 赋值最大值    sum = pdata;                                             // 赋值累加第一个值        for(i=1; i<num; i++){      min = (min > pdata)? pdata:min;                        // 记录最大值      max = (max < pdata)? pdata:max;                        // 记录最小值      sum += pdata;                                                    // 数据累加    }     if(num > 2){      return (sum - (max + min))/(num-2);                     // 数据放入处理数组中    }    else {      return sum/num;    }}手动切换通道代码:
ad7124_st_reg ad7124_regs_ch0={    {0x09, 0x8011,   2, 1}, // 使能读取通道0/***测试阶段0x8011***/ };ad7124_st_reg ad7124_regs_ch1={    {0x09, 0x8031,   2, 1}, // 使能读取通道1/***测试阶段0x8031***/
};采集数据代码:
void InsertAdcData(void){          U16 i,j=0;    U32 data1s_ch0;      U32 data1s_ch1;           AD7124_WriteRegister(&g_ad7124dev, ad7124_regs_ch0);    if( AD7124_WaitForConvReady(&g_ad7124dev,5) >= 0 )          //采集通道0数据    {      AD7124_ReadRegister(&g_ad7124dev, &ad7124_regs);             stSysDataVar.gu32_ReadAdValue = (ad7124_regs.value>>8)&0xFFFFFF;    }    AD7124_WriteRegister(&g_ad7124dev, ad7124_regs_ch1);    if( AD7124_WaitForConvReady(&g_ad7124dev,5) >= 0 )          //采集通道1数据    {      AD7124_ReadRegister(&g_ad7124dev, &ad7124_regs);             stSysDataVar.gu32_ReadAdValue = (ad7124_regs.value>>8)&0xFFFFFF;    }    if(gu8_ReadAdCnt_ch0>=ADC_VALUE_COLUMN)                     //每次需要采集100个点    {          gu8_ReadAdCnt_ch0=0;                gu8_ReadAdCnt_ch1=0;      memcpy(stSysDataVar.gu32_ReadAdValue,stSysDataVar.gu32_ReadAdValue,ADC_VALUE_COLUMN*4);                memcpy(stSysDataVar.gu32_ReadAdValue,stSysDataVar.gu32_ReadAdValue,ADC_VALUE_COLUMN*4);                   for(i=0;i<ADC_VALUE_COLUMN;i+=2)      {            data1s_ch0 = GetAdAvrgValue(stSysDataVar.gu32_ReadAdValue+i,2);                        data1s_ch1 = GetAdAvrgValue(stSysDataVar.gu32_ReadAdValue+i,2);                        j++;            if(j>=50)            {                j=0;                              memcpy(stSysDataVar.ADC_AllData,data1s_ch0,50*4);                              memcpy(stSysDataVar.ADC_AllData+50,data1s_ch1,50*4);            }      }    }
}注意:采集数据之前需完成初始化配置,不然会出错。      这里是通过写0x09寄存器数据进行切换通道,每个通道读取的数据放在二维数组中,采集频率是100HZ,每10毫秒采集一个点,每次采集100个点的数据,采集100个点之后把这些临时数据拷贝到其它序号的二维数组中,这里是为了防止采集到的临时数据还没用就被下一次更新,然后把这100个点数据每两个求平均,得出50个点数据,采集频率就是50HZ了,最后求平均之后的数据赋值于一个数组,前边存通道0后边存通道1 数据,封装好之后供其它函数调用。

huangcunxiake 发表于 2025-8-27 09:51

这是一个ADC芯片吗

liao6 发表于 2025-8-27 15:13

huangcunxiake 发表于 2025-8-27 09:51
这是一个ADC芯片吗

对啊,ADI的片外ADC芯片。

野玫瑰 发表于 2025-9-4 14:24

AD7124 采集工作流程如下:先初始化参数,调用官方驱动程序 AD7124_Setup,依据需求配置寄存器,如双通道采集参数。接着进行数据采集,模拟信号经输入选择器接入,预处理、转换后,数字信号经数字滤波器处理,最终通过 SPI 或 I2C 接口输出数据。

野玫瑰 发表于 2025-9-4 14:29

使用 AD7124 驱动程序采集数据步骤:
初始化硬件接口(SPI/I2C),调用 AD7124_Init () 建立通信。
配置寄存器:通过 AD7124_WriteRegister () 设置通道、增益、滤波模式等参数。
启动转换:调用 AD7124_StartConversion () 开启连续 / 单次转换。
读取数据:轮询或中断检测转换完成,用 AD7124_ReadData () 获取结果。
数据处理:根据配置参数将原始值转换为实际物理量。

1101274536 发表于 2025-10-20 16:41

你的完整代码发给我参考一下把
页: [1]
查看完整版本: 【每周分享】AD7124采集工作流程