我正在嘗試使用CY8CEVAL-062S2 套件上的 P10.0 讀取類比電壓。以下是我的 SAR ADC 程式碼。我嘗試使用設備配置器和/或手動設定代碼中的參數,但即使電壓變化,ADC 也只顯示一個讀數。我是否遺漏了什麼?
#define ADC_CHANNEL 0 // SAR ADC Channel 0 (e.g., P10_0)#define CTRL ((uint32_t)CY_SAR_VREF_PWR_100 | (uint32_t)CY_SAR_VREF_SEL_BGR | (uint32_t)CY_SAR_BYPASS_CAP_ENABLE | (uint32_t)CY_SAR_NEG_SEL_VSSA_KELVIN | (uint32_t)CY_SAR_CTRL_NEGVREF_HW | (uint32_t)CY_SAR_CTRL_COMP_DLY_12 | (uint32_t)CY_SAR_COMP_PWR_100 | (uint32_t)CY_SAR_DEEPSLEEP_SARMUX_OFF | (uint32_t)CY_SAR_SARSEQ_SWITCH_ENABLE)#define SAMPLE_CTRL ((uint32_t)CY_SAR_RIGHT_ALIGN | (uint32_t)CY_SAR_SINGLE_ENDED_UNSIGNED | (uint32_t)CY_SAR_DIFFEREN
tiAL_UNSIGNED | (uint32_t)CY_SAR_AVG_CNT_4 | (uint32_t)CY_SAR_AVG_MODE_SEQUENTIAL_FIXED | (uint32_t)CY_SAR_TRIGGER_MODE_FW_ONLY)#define SAMPLE_TIME01 ((1023 << CY_SAR_SAMPLE_TIME0_SHIFT) | (2 << CY_SAR_SAMPLE_TIME1_SHIFT))#define SAMPLE_TIME23 ((2 << CY_SAR_SAMPLE_TIME2_SHIFT) | (2 << CY_SAR_SAMPLE_TIME3_SHIFT))#define RANGE_THRES ((0 << CY_SAR_RANGE_LOW_SHIFT) | (0 << CY_SAR_RANGE_HIGH_SHIFT))#define CHANNEL_EN 1#define CHANNEL_0_CONFIG (CY_SAR_CHAN_SINGLE_ENDED | CY_SAR_CHAN_SAMPLE_TIME_1 | CY_SAR_POS_PORT_ADDR_SARMUX | CY_SAR_CHAN_POS_PIN_ADDR_0 | CY_SAR_CHAN_AVG_DISABLE)#define MUX_SWITCH ( CY_SAR_MUX_FW_P0_VPLUS | CY_SAR_MUX_FW_VSSA_VMINUS)#define MUX_SWITCH_SQ_CTRL CY_SAR_MUX_SQ_CTRL_P0#define VREF_MV 1200ULconst cy_stc_sar_config_t sar0_config = { .ctrl = (uint32_t) CTRL, .sampleCtrl = (uint32_t) SAMPLE_CTRL, .sampleTime01 = SAMPLE_TIME01, .sampleTime23 = SAMPLE_TIME23, .rangeThres = RANGE_THRES, .rangeCond = CY_SAR_RANGE_COND_BELOW, .chanEn = CHANNEL_EN, .chanConfig = {CHANNEL_0_CONFIG, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}, .intrMask = CY_SAR_INTR_EOS, .satIntrMask = 0UL, .rangeIntrMask = 0UL, .muxSwitch = MUX_SWITCH, .muxSwitchSqCtrl= MUX_SWITCH_SQ_CTRL, .configRouting = true, .vrefMvValue = VREF_MV, .clock = CY_SAR_CLK_PERI, .fifoCfgPtr = NULL, .trTimer = false, .scanCnt = false, .scanCntIntr = false,};void adc_init(void){ uint8_t result = Cy_SysAnalog_Init(&pass_0_aref_0_config); if (CY_SYSANALOG_SUCCESS != result) { CY_ASSERT(0); } Cy_SysAnalog_Enable(); if (Cy_SAR_Init(SAR, &sar0_config) == CY_SAR_SUCCESS) { uint32_t chan0SwitchMask = CY_SAR_MUX_FW_P0_VPLUS | CY_SAR_MUX_FW_VSSA_VMINUS;//??? Cy_SAR_SetAnalogSwitch(SAR, CY_SAR_MUX_SWITCH0, chan0SwitchMask, CY_SAR_SWITCH_CLOSE); Cy_SAR_SetVssaVminusSwitch(SAR, CY_SAR_SWITCH_CLOSE); uint32_t switchMask = CY_SAR_MUX_SQ_CTRL_P0; Cy_SAR_SetSwitchSarSeqCtrl(SAR, switchMask, CY_SAR_SWITCH_SEQ_CTRL_ENABLE); Cy_SAR_SetVssaSarSeqCtrl(SAR, CY_SAR_SWITCH_SEQ_CTRL_ENABLE); Cy_SAR_SetChannelOffset(SAR, ADC_CHANNEL, 0); Cy_SAR_Enable(SAR); Cy_SCB_UART_PutString(scb_12_HW, "ADC initialized successfully.rn"); } else { Cy_SCB_UART_PutString(scb_12_HW, "ADC initialization failed.rn"); CY_ASSERT(0); }}float adc_read_voltage(void){ int32_t result_32 = 0; int32_t adc_result_0 = 0; Cy_SAR_StartConvert(SAR, CY_SAR_START_CONVERT_SINGLE_SHOT); while (!Cy_SAR_IsEndConversion(SAR, CY_SAR_RETURN_STATUS)) {} result_32 = Cy_SAR_GetResult32(SAR, ADC_CHANNEL); snprintf(uart_buffer, sizeof(uart_buffer),"ADC result_32 = %ldn", result_32); Cy_SCB_UART_PutString(scb_12_HW, uart_buffer); adc_result_0 = Cy_SAR_CountsTo_Volts(SAR, ADC_CHANNEL, result_32); snprintf(uart_buffer, sizeof(uart_buffer),"ADC result = %ldVrn", (long int)adc_result_0); Cy_SCB_UART_PutString(scb_12_HW, uart_buffer); Cy_SAR_StopConvert(SAR); return adc_result_0;}