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
							 | 
						||
| 
								 | 
							
								
							 |