/**
* @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 *********************************/