/** * @file HW_ADC_ATY.c * * @param Project DEVICE_GENERAL_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2026 MZ-ATY * - This code follows: * - MZ-ATY Various Contents Joint Statement - * * https://mengze.top/MZ-ATY_VCJS * - CC 4.0 BY-NC-SA - * * https://creativecommons.org/licenses/by-nc-sa/4.0/ * - Your use will be deemed to have accepted the terms of this statement. * * @brief functions of adc for STC51 and STM32F with HAL lib * * @version * - 1_01_221231 > ATY * -# Preliminary version, first Release ******************************************************************************** */ #ifndef __HW_ADC_ATY_C #define __HW_ADC_ATY_C #include "HW_ADC_ATY.h" /******************************* For user *************************************/ /******************************************************************************/ #if (__ATY_IS_8051_COMPILER) /** * @brief ADC init */ void ADC_Init(void){ #ifndef ADCTIM #define ADCTIM (*(unsigned char volatile xdata *)0xfea8) #endif P_SW2 |= 0x80; // change reg sfr ADCTIM = 0x3F; // set ADC internal timing sequence P_SW2 &= 0x7F; // stop change reg sfr // ADCCFG = 0x0F; // set SYSCLK/2/16 as ADC timer ADCCFG = 0x00; // set SYSCLK/2/1 as ADC timer ADC_CONTR = 0x80; // enable ADC } /** * @brief ADC get mcu vref * @return mcu vref data */ float ADC_GetVref(void){ uint16_t dataVref = 0; float resultVref = 0.0; int* BGV; BGV = (int __IDATA*)0xEF; dataVref = ADC_Get(0x0F); resultVref = (1024L * (*BGV) / dataVref); return resultVref; } /** * @brief ADC get data at channel * @param channel channel * @return adc data */ uint16_t ADC_Get(uint8_t channel){ uint16_t errCount = 1000; ADC_CONTR = ((ADC_CONTR & 0xF0) | (channel & 0x0F)); ADC_CONTR |= 0x40; // start ADC __NOP_ATY; __NOP_ATY; while((!(ADC_CONTR & 0x20)) && errCount) errCount--; if(errCount){ ADC_CONTR &= ~0x20; // clear over flag return ((ADC_RES << 2) + (ADC_RESL >> 6)); } return 0x01; } #elif defined(USE_HAL_DRIVER) #include "adc.h" // set channel to 0 for scand mode uint16_t ADC_Get(ADC_HandleTypeDef* adc, uint32_t channel){ #if defined (__STM32F4xx_ADC_H) #define SAMPETIME ADC_SAMPLETIME_480CYCLES #elif defined (__STM32F1xx_HAL_ADC_H) #define SAMPETIME ADC_SAMPLETIME_239CYCLES_5 #endif if(channel != 0){ ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = channel; sConfig.Rank = 1U; sConfig.SamplingTime = SAMPETIME; // do not set faster than 28 at f103 if(HAL_ADC_ConfigChannel(adc, &sConfig) != HAL_OK){ Error_Handler(); } } HAL_ADC_Start(adc); HAL_ADC_PollForConversion(adc, 1000); if(HAL_IS_BIT_SET(HAL_ADC_GetState(adc), HAL_ADC_STATE_REG_EOC)) return HAL_ADC_GetValue(adc); return 0.1; } #endif /* PLATFORM */ // ADC ------------------------------------------------------------------------- // #include "HW_ADC_ATY.h" // void MCU_CoreAdcGet(void){ // // F405/F407(mV) // // float VOL_PER_AD_ATY = 1210.0 / ((float)(*(__IO uint16_t*)(0x1FFF7A2A))); // // float VREFINT_MCU_ATY = ADC_Get(&hadc1, ADC_CHANNEL_VREFINT) * VOL_PER_AD_ATY; // // float TEMPERATURE_MCU_ATY = // // (((ADC_Get(&hadc1, ADC_CHANNEL_TEMPSENSOR) * VOL_PER_AD_ATY) - 760.0) / 2.5) + 25.0; // // F103(mV) // float VOL_PER_AD_ATY = 1200.0 / ADC_Get(&hadc1, ADC_CHANNEL_VREFINT); // float VREFINT_MCU_ATY = ADC_Get(&hadc1, ADC_CHANNEL_VREFINT) * VOL_PER_AD_ATY; // float TEMPERATURE_MCU_ATY = ((1430.0 - // (ADC_Get(&hadc1, ADC_CHANNEL_TEMPSENSOR) * VOL_PER_AD_ATY)) / 4.3) + 25.0; // float MCU_BASE_VOL_D = 1200;//VREFINT_MCU_ATY; // float MCU_BASE_VOL = VREFINT_MCU_ATY; // float MCU_TEMP = TEMPERATURE_MCU_ATY; // printf_ATY_D("\r\nCAD: %f, CV: %f, CT: %f\r\n", VOL_PER_AD_ATY, MCU_BASE_VOL, MCU_TEMP); // } #endif /* __HW_ADC_ATY_C */ /******************************** End Of File *********************************/