119 lines
3.7 KiB
C
119 lines
3.7 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
/* os shim includes */
|
|
#include "iot_config.h"
|
|
#include "os_types.h"
|
|
#include "hw_reg_api.h"
|
|
#include "iot_mem.h"
|
|
|
|
/* plc public api includes */
|
|
#include "plc_fr.h"
|
|
#include "plc_const.h"
|
|
#include "iot_bitops.h"
|
|
|
|
/* adc api includes */
|
|
#include "sadc.h"
|
|
#include "sadc_hw.h"
|
|
#include "iot_adc_api.h"
|
|
#include "pmu_hw.h"
|
|
#include "phy_temperature.h"
|
|
|
|
#if PLC_PHY_SUPPORT_TEMPERATURE
|
|
|
|
static phy_temperature_ctxt_t phy_tempt_ctxt;
|
|
|
|
void phy_temperature_adc_init(void)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
/* pmu reset */
|
|
pmu_soft_reset(SADC_CH1_SOFT_RST_OFFSET);
|
|
|
|
/* adc init */
|
|
sadc_init(ANA_SADC0, NULL);
|
|
|
|
/* phase mode init */
|
|
sadc_phase_mode_set(ANA_SADC0, 0);
|
|
|
|
/* phase 0 select mapping mux 0 */
|
|
sadc_phase_sel_scl_mux(SADC_PHASE0, ADC_CHANNEL0);
|
|
|
|
/* set gain to 1/2 */
|
|
sadc_adc_gain_set(ADC_CHANNEL0, 0);
|
|
|
|
/* mtr sel scl from meter vtem */
|
|
sadc_mtr_sel_scl_mux(SADC_PHASE0,SADC_TSW_MTR_SEL_MUX_MODE_VTMP);
|
|
|
|
/* start sadc */
|
|
sadc_start_en(ANA_SADC0, 1);
|
|
|
|
/* set channel sample time */
|
|
sadc_discard_num_set(ANA_SADC0, SADC_PHASE0, 6);
|
|
|
|
/* select refer voltage as gnd */
|
|
sadc_vcm_sel_mux_set(ANA_SADC0, SADC_PHASE0, ANA_SADC_VCM_SEL_GND);
|
|
#endif //#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
}
|
|
|
|
void phy_temperature_adc_scan(void)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t val;
|
|
if (sadc_check_data_vld(ANA_SADC0, 0))
|
|
{
|
|
val = sadc_data_get(ANA_SADC0, 0);
|
|
sadc_data_vld_clr(ANA_SADC0,0);
|
|
val &= 0xffffff;
|
|
/* recover gain to 1 */
|
|
val <<= 1;
|
|
|
|
/* check valid raw data */
|
|
if (val < RAW_DATA_VALID_MIN) {
|
|
val = RAW_DATA_VALID_MIN;
|
|
} else if (val > RAW_DATA_VALID_MAX) {
|
|
val = RAW_DATA_VALID_MAX;
|
|
}
|
|
/* count for valid average data */
|
|
if (phy_tempt_ctxt.cnt < TEMPT_DATA_SKIP) {
|
|
phy_tempt_ctxt.cnt++;
|
|
}
|
|
/* calc average raw data */
|
|
phy_tempt_ctxt.tempt_raw_data = phy_tempt_ctxt.tempt_raw_data -
|
|
(phy_tempt_ctxt.tempt_raw_data >> NEW_RAW_WEIGHT) +
|
|
(val >> NEW_RAW_WEIGHT);
|
|
}
|
|
#endif //#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
}
|
|
|
|
float phy_temperature_val_get(void)
|
|
{
|
|
/* make sure return value is valid */
|
|
if (phy_tempt_ctxt.cnt < TEMPT_DATA_SKIP) {
|
|
return 0;
|
|
}
|
|
/* convert the adc value to real temperature */
|
|
phy_tempt_ctxt.cur_tempt_val = (float)RAW_TO_TEMP(phy_tempt_ctxt.tempt_raw_data);
|
|
if (phy_tempt_ctxt.cur_tempt_val < TEMP_VAL_MIN) {
|
|
phy_tempt_ctxt.cur_tempt_val = TEMP_VAL_MIN;
|
|
}
|
|
if (phy_tempt_ctxt.cur_tempt_val > TEMP_VAL_MAX) {
|
|
phy_tempt_ctxt.cur_tempt_val = TEMP_VAL_MAX;
|
|
}
|
|
return phy_tempt_ctxt.cur_tempt_val;
|
|
}
|
|
|
|
#endif //#if PLC_PHY_SUPPORT_TEMPERATURE > 0
|
|
|