电路设计论坛
直播中

米洛

1年用户 15经验值
擅长:MEMS/传感技术 测量仪表 嵌入式技术
私信 关注
[问答]

ADS1271采集数据波动较大

ADS1271采集的数据波动较大,但是参考电压已经用了高精度基准,为什么还会这么大波动?7c33d406f0c82782c39c04f02202a12.png
相关代码:

#include "ads1271.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stdio.h"
#include "Delay.h"
#include "filter.h"

static uint32_t currentSampleRate = ADS1271_SAMPLE_RATE;

// 初始化ADS1271
void ADS1271_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    
    // 使能GPIO和TIM1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM3, ENABLE);
    
    // 配置CLK引脚(PA8)为复用推挽输出(TIM1_CH1)
    GPIO_InitStructure.GPIO_Pin = ADS1271_CLK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(ADS1271_CLK_PORT, &GPIO_InitStructure);
    
	
    // 配置SCLK引脚(PA5)为推挽输出
    GPIO_InitStructure.GPIO_Pin = ADS1271_SCLK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(ADS1271_SCLK_PORT, &GPIO_InitStructure);
    
    // 配置DRDY引脚(PA4)为输入
    GPIO_InitStructure.GPIO_Pin = ADS1271_DRDY_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输入模式下无效
    GPIO_Init(ADS1271_DRDY_PORT, &GPIO_InitStructure);
    
    // 配置DOUT引脚(PA6)为输入
    GPIO_InitStructure.GPIO_Pin = ADS1271_DOUT_PIN;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输入模式下无效
    GPIO_Init(ADS1271_DOUT_PORT, &GPIO_InitStructure);  
	
        // 配置TIM1产生CLK信号
    TIM_TimeBaseStructure.TIM_Period = ((SystemCoreClock / (1*2 * ADS1271_CLK_FREQ))-1 )/1;
    TIM_TimeBaseStructure.TIM_Prescaler = 2;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
    // 配置TIM1通道1为PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;  // 50%占空比
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    
    // 使能TIM1
    TIM_Cmd(TIM1, ENABLE);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
    
    // 初始状态
    GPIO_ResetBits(ADS1271_SCLK_PORT, ADS1271_SCLK_PIN);
}

// 调整采样率
void ADS1271_AdjustSampleRate(uint32_t sampleRate)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    uint32_t clkFreq = 512 * sampleRate;  // 高速模式下CLK = 512×f_DATA
    
    if(sampleRate == currentSampleRate) return;
    
    // 停止TIM1
    TIM_Cmd(TIM1, DISABLE);
    
    // 重新配置TIM1
    TIM_TimeBaseStructure.TIM_Period = ((SystemCoreClock / (1*2 * ADS1271_CLK_FREQ))-1 )/1;
    TIM_TimeBaseStructure.TIM_Prescaler = 2;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
    // 重新设置PWM占空比
    TIM_SetCompare1(TIM1, TIM_TimeBaseStructure.TIM_Period / 2);
    
    // 重新启动TIM1
    TIM_Cmd(TIM1, ENABLE);
    
    currentSampleRate = sampleRate;
}

// 检查数据是否准备好
uint8_t ADS1271_DataReady(void)
{
    return (GPIO_ReadInputDataBit(ADS1271_DRDY_PORT, ADS1271_DRDY_PIN) == RESET);
}

// 读取24位数据
uint32_t ADS1271_ReadData(void)
{
    uint32_t data = 0;
    uint8_t i;
    
    // 等待数据准备好
    while(!ADS1271_DataReady());
     
    // 读取24位数据
    for(i = 0; i < 24; i++)
    {
		
       
		// 产生SCLK下降沿
        GPIO_ResetBits(ADS1271_SCLK_PORT, ADS1271_SCLK_PIN);
		Delay_us(1);
        // 产生SCLK上升沿
        GPIO_SetBits(ADS1271_SCLK_PORT, ADS1271_SCLK_PIN);
		

		
        // 读取数据位
        if(GPIO_ReadInputDataBit(ADS1271_DOUT_PORT, ADS1271_DOUT_PIN))
        {
            data |= (1 << (23 - i));
        }
       Delay_us(1);
    }
    

    return data;
}
已退回10积分

更多回帖

发帖
×
20
完善资料,
赚取积分