AD7124采集工作流程

本文只介绍工作流程,工作原理参考另一篇https://blog.csdn.net/li_654/article/details/118181429?spm=1001.2014.3001.5501

一、初始化参数

        初始化采用官方提供的驱动程序,直接调用AD7124_Setup(&g_ad7124dev,ad7124_regs)即可,寄存器配置需要根据自己需求进行相应配置,双通道采集配置参数如下:

ad7124_st_reg ad7124_regs[AD7124_REG_NO] =
{
    {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 *///PGA  1  0x01E0
    {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[0];                                             // 赋值最小值  
    max = pdata[0];                                             // 赋值最大值
    sum = pdata[0];                                             // 赋值累加第一个值
    
    for(i=1; i<num; i++){
        min = (min > pdata[i])? pdata[i]:min;	                // 记录最大值
        max = (max < pdata[i])? pdata[i]:max;	                // 记录最小值
        sum += pdata[i];			                            // 数据累加
    } 
    if(num > 2){
        return (sum - (max + min))/(num-2);                     // 数据放入处理数组中
    }
    else {
        return sum/num;
    }
}

        手动切换通道代码:

ad7124_st_reg ad7124_regs_ch0[1]=
{
    {0x09, 0x8011,   2, 1}, // 使能读取通道0  /***测试阶段0x8011***/ 
};
ad7124_st_reg ad7124_regs_ch1[1]=
{
    {0x09, 0x8031,   2, 1}, // 使能读取通道1  /***测试阶段0x8031***/ 
};

        采集数据代码:

void InsertAdcData(void)
{      
    U16 i,j=0;
    U32 data1s_ch0[50];
	U32 data1s_ch1[50];	

    AD7124_WriteRegister(&g_ad7124dev, ad7124_regs_ch0[0]);
    if( AD7124_WaitForConvReady(&g_ad7124dev,5) >= 0 )          //采集通道0数据
    {
        AD7124_ReadRegister(&g_ad7124dev, &ad7124_regs[2]);       
        stSysDataVar.gu32_ReadAdValue[0][gu8_ReadAdCnt_ch0++] = (ad7124_regs[2].value>>8)&0xFFFFFF;
    }
    AD7124_WriteRegister(&g_ad7124dev, ad7124_regs_ch1[0]);
    if( AD7124_WaitForConvReady(&g_ad7124dev,5) >= 0 )          //采集通道1数据
    {
        AD7124_ReadRegister(&g_ad7124dev, &ad7124_regs[2]);       
        stSysDataVar.gu32_ReadAdValue[2][gu8_ReadAdCnt_ch1++] = (ad7124_regs[2].value>>8)&0xFFFFFF;
    }
    if(gu8_ReadAdCnt_ch0>=ADC_VALUE_COLUMN)                     //每次需要采集100个点  
    {    
        gu8_ReadAdCnt_ch0=0;
		gu8_ReadAdCnt_ch1=0;
        memcpy(stSysDataVar.gu32_ReadAdValue[1],stSysDataVar.gu32_ReadAdValue[0],ADC_VALUE_COLUMN*4);
		memcpy(stSysDataVar.gu32_ReadAdValue[3],stSysDataVar.gu32_ReadAdValue[2],ADC_VALUE_COLUMN*4);             
        for(i=0;i<ADC_VALUE_COLUMN;i+=2)
        {
            data1s_ch0[j] = GetAdAvrgValue(stSysDataVar.gu32_ReadAdValue[1]+i,2);
			data1s_ch1[j] = GetAdAvrgValue(stSysDataVar.gu32_ReadAdValue[3]+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 数据,封装好之后供其它函数调用。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值