This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
ADS131M04对与"极小"频率混合的信号进行采样、通过数字滤波器(IIR)进行传递并解调。 这是预期的结果。
如果您将其替换为 ADS131B04-Q1、即使使用了相同的电路和相同的寄存器设置、也会获得不同的结果。
首先、它不会成为正弦波并受到干扰。
然后、几秒钟后、振幅几乎消失了。
全局斩波函数是否不同?
它是否不兼容?
Iwakiri-San、您好!
感谢您的发帖。
您能否提供有关输入信号、源、信号链和寄存器设置的更多详细信息?
寄存器映射非常接近、但我们应该检查所有设置以确保正确。
此致、
Ryan
Tank You、Ryan-San。
MCU 是 MSP432P4111。
源代码基于 ADC-energe-metadio-LIB-SW。
寄存器设置头文件来自 sbac278.ADS131B04-Q1示例 C 代码。
无法编译的常量会被注释掉。
没有其他区别。
bool adcStartup(void) { /* (OPTIONAL) Provide additional delay time for power supply settling */ #ifndef __ICCARM__ // CCS Project usleep(DELAY_5US); #else // IAR Project SysCtlDelay(DELAY_5US); #endif // Configure Inputs // Port P2 MAP_GPIO_setAsPeripheralModuleFunctionInputPin(ADS_DRDY0_PORT, ADS_DRDY0_PIN, GPIO_PRIMARY_MODULE_FUNCTION); MAP_GPIO_setAsInputPin(ADS_DRDY0_PORT, ADS_DRDY0_PIN); // Configure Outputs // Port P2 MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(ADS_RESET_SYNC_PORT, ADS_RESET_SYNC_PIN, GPIO_PRIMARY_MODULE_FUNCTION); MAP_GPIO_setDriveStrengthLow(ADS_RESET_SYNC_PORT, ADS_RESET_SYNC_PIN); MAP_GPIO_setAsOutputPin(ADS_RESET_SYNC_PORT, ADS_RESET_SYNC_PIN); MAP_GPIO_setOutputHighOnPin(ADS_RESET_SYNC_PORT, ADS_RESET_SYNC_PIN); #ifdef nCS_PIN_ENABLED MAP_GPIO_setDriveStrengthLow(ADS_CS0_PORT, ADS_CS0_PIN); MAP_GPIO_setAsOutputPin(ADS_CS0_PORT, ADS_CS0_PIN); #ifdef SINGLE_SPI_MULTIPLE_ADC MAP_GPIO_setDriveStrengthLow(ADS_CS1_PORT, ADS_CS1_PIN); MAP_GPIO_setAsOutputPin(ADS_CS1_PORT, ADS_CS1_PIN); MAP_GPIO_setDriveStrengthLow(ADS_CS2_PORT, ADS_CS2_PIN); MAP_GPIO_setAsOutputPin(ADS_CS2_PORT, ADS_CS2_PIN); #endif #endif // IIRフィルタ初期化 init_arm_iir(); memset(&Z, 0, sizeof(Z)); memset(&F, 0, sizeof(F)); memset(&H, 0, sizeof(H)); Freq = 0; /* (OPTIONAL) Toggle nRESET pin to ensure default register settings. */ /* NOTE: This also ensures that the device registers are unlocked. */ toggleRESET(); /* (REQUIRED) Initialize internal 'registerMap' array with device default settings */ restoreRegisterDefaults(); for (size_t adc_index = 0; adc_index < NUM_ADS131M0X; adc_index++) { /* (OPTIONAL) Validate first response word when beginning SPI communication: (0xFF20 | CHANCNT) */ uint16_t response = sendCommand(OPCODE_NULL, adc_index); /* Disable ADC channels to send short frames for configuring ADC */ if (!writeSingleRegister(CLOCK_ADDRESS, (CLOCK_DEFAULT & ~(CLOCK_CLK_SEL_MASK | CLOCK_CH3_EN_MASK | CLOCK_CH2_EN_MASK | CLOCK_CH1_EN_MASK | CLOCK_CH0_EN_MASK | CLOCK_OSR_MASK)) | CLOCK_OSR_PWR, true, adc_index)) return false; #ifdef CRC_CCITT if (!writeSingleRegister(MODE_ADDRESS, MODE_CRC_TYPE_16BIT_CCITT | MODE_WLENGTH_24BIT /*| MODE_DRDY_SEL_MOST_LAGGING*/ | MODE_DRDY_HiZ_LOGIC_HIGH /*| MODE_DRDY_FMT_LOGIC_LOW*/, true, adc_index)) return false; #else if (!writeSingleRegister(MODE_ADDRESS, MODE_CRC_TYPE_16BIT_ANSI | MODE_WLENGTH_24BIT | MODE_DRDY_SEL_MOST_LAGGING | MODE_DRDY_HiZ_LOGIC_HIGH | MODE_DRDY_FMT_LOGIC_LOW, true, adc_index)) return false; #endif if (!writeSingleRegister(GAIN_ADDRESS, (GAIN_ADC_CHANNEL3) << (ADC_CHANNEL3 << 2) | (GAIN_ADC_CHANNEL2) << (ADC_CHANNEL2 << 2) | (GAIN_ADC_CHANNEL1) << (ADC_CHANNEL1 << 2) | (GAIN_ADC_CHANNEL0) << (ADC_CHANNEL0 << 2), true, adc_index)) return false; if (!writeSingleRegister(CH0_CFG_ADDRESS + ADC_CHANNEL3 * (CH1_CFG_ADDRESS - CH0_CFG_ADDRESS), CH0_CFG_MUX0_AIN0P_AIN0N /*| SET_PHASE_REGISTER_VALUE(PHASE_ADC_CHANNEL3)*/, true, adc_index)) return false; if (!writeSingleRegister(CH0_CFG_ADDRESS + ADC_CHANNEL2 * (CH1_CFG_ADDRESS - CH0_CFG_ADDRESS), CH0_CFG_MUX0_AIN0P_AIN0N /*| SET_PHASE_REGISTER_VALUE(PHASE_ADC_CHANNEL2)*/, true, adc_index)) return false; if (!writeSingleRegister(CH0_CFG_ADDRESS + ADC_CHANNEL1 * (CH1_CFG_ADDRESS - CH0_CFG_ADDRESS), CH0_CFG_MUX0_AIN0P_AIN0N /*| SET_PHASE_REGISTER_VALUE(PHASE_ADC_CHANNEL1)*/, true, adc_index)) return false; if (!writeSingleRegister(CH0_CFG_ADDRESS + ADC_CHANNEL0 * (CH1_CFG_ADDRESS - CH0_CFG_ADDRESS), CH0_CFG_MUX0_AIN0P_AIN0N /*| SET_PHASE_REGISTER_VALUE(PHASE_ADC_CHANNEL0)*/, true, adc_index)) return false; #ifdef CURRENT_DETECTION_ENABLED if (!writeSingleRegister(CH0_OCAL_MSB_ADDRESS + ADC_CHANNEL0 * (CH1_OCAL_MSB_ADDRESS - CH0_OCAL_MSB_ADDRESS), (20640 & 0xFFFFFF00) >> 8, true, adc_index)) return false; if (!writeSingleRegister(CH0_OCAL_LSB_ADDRESS + ADC_CHANNEL0 * (CH1_OCAL_LSB_ADDRESS - CH0_OCAL_LSB_ADDRESS), (20640 & 0x000000FF) << 8, true, adc_index)) return false; if (!writeSingleRegister(CH0_OCAL_MSB_ADDRESS + ADC_CHANNEL1 * (CH1_OCAL_MSB_ADDRESS - CH0_OCAL_MSB_ADDRESS), (4109 & 0xFFFFFF00) >> 8, true, adc_index)) return false; if (!writeSingleRegister(CH0_OCAL_LSB_ADDRESS + ADC_CHANNEL1 * (CH1_OCAL_LSB_ADDRESS - CH0_OCAL_LSB_ADDRESS), (4109 & 0x000000FF) << 8, true, adc_index)) return false; #endif #if (SAMPLE_RATE == 2000) #elif (SAMPLE_RATE == 2930) || (SAMPLE_RATE == 4000) || (SAMPLE_RATE == 3906) if (!writeSingleRegister(CLOCK_ADDRESS, CLOCK_CH3_EN_ENABLED | CLOCK_CH2_EN_ENABLED | CLOCK_CH1_EN_ENABLED | CLOCK_CH0_EN_ENABLED | CLOCK_OSR_PWR, true, adc_index)) return false; #else // SAMPLE_RATES = 5859, 6000, 6400, 7812 or 8000 if (!writeSingleRegister(CLOCK_ADDRESS, CLOCK_CLK_SEL_EXTERNAL | CLOCK_CH3_EN_ENABLED | CLOCK_CH2_EN_ENABLED | CLOCK_CH1_EN_ENABLED | CLOCK_CH0_EN_ENABLED | CLOCK_OSR_PWR, true, adc_index)) return false; #endif #ifdef CURRENT_DETECTION_ENABLED if (!writeSingleRegister(THRSHLD_MSB_ADDRESS, (CURRENT_DETECTION_THRESHOLD_VALUE & 0x00FFFF00) >> 8, true, adc_index)) return false; // Not all devices have DC filter if (!writeSingleRegister(THRSHLD_LSB_ADDRESS, (CURRENT_DETECTION_THRESHOLD_VALUE & 0x000000FF) << 8 | DC_BLOCK_COEFFICIENT, true, adc_index)) return false; #endif if (!writeSingleRegister(CFG_ADDRESS, CFG_GC_EN /*| CFG_CD_ALLCH_ANY_CHANNEL | CFG_CD_NUM_1 | CFG_CD_LEN_128 | CFG_CD_EN_DISABLED*/, true, adc_index)) return false; } return true; }
Iwakiri-San、您好!
我知道您从我们的电能计量软件库开始、还导入了我们的 ADS131B04-Q1示例代码头文件。 一些寄存器名称和宏定义可能不同。 请仔细检查寄存器名称、地址和宏定义是否正确匹配。
此致、
Ryan