HW_ADC_ATY.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * @file HW_ADC_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of adc for STC51 and STM32F with HAL lib
  20. *
  21. * @version
  22. * - 1_01_221231 > ATY
  23. * -# Preliminary version, first Release
  24. ********************************************************************************
  25. */
  26. #ifndef __HW_ADC_ATY_C
  27. #define __HW_ADC_ATY_C
  28. #include "HW_ADC_ATY.h"
  29. /******************************* For user *************************************/
  30. /******************************************************************************/
  31. #if (__ATY_IS_8051_COMPILER)
  32. /**
  33. * @brief ADC init
  34. */
  35. void ADC_Init(void){
  36. #ifndef ADCTIM
  37. #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
  38. #endif
  39. P_SW2 |= 0x80; // change reg sfr
  40. ADCTIM = 0x3F; // set ADC internal timing sequence
  41. P_SW2 &= 0x7F; // stop change reg sfr
  42. // ADCCFG = 0x0F; // set SYSCLK/2/16 as ADC timer
  43. ADCCFG = 0x00; // set SYSCLK/2/1 as ADC timer
  44. ADC_CONTR = 0x80; // enable ADC
  45. }
  46. /**
  47. * @brief ADC get mcu vref
  48. * @return mcu vref data
  49. */
  50. float ADC_GetVref(void){
  51. uint16_t dataVref = 0;
  52. float resultVref = 0.0;
  53. int* BGV;
  54. BGV = (int __IDATA*)0xEF;
  55. dataVref = ADC_Get(0x0F);
  56. resultVref = (1024L * (*BGV) / dataVref);
  57. return resultVref;
  58. }
  59. /**
  60. * @brief ADC get data at channel
  61. * @param channel channel
  62. * @return adc data
  63. */
  64. uint16_t ADC_Get(uint8_t channel){
  65. uint16_t errCount = 1000;
  66. ADC_CONTR = ((ADC_CONTR & 0xF0) | (channel & 0x0F));
  67. ADC_CONTR |= 0x40; // start ADC
  68. __NOP_ATY;
  69. __NOP_ATY;
  70. while((!(ADC_CONTR & 0x20)) && errCount)
  71. errCount--;
  72. if(errCount){
  73. ADC_CONTR &= ~0x20; // clear over flag
  74. return ((ADC_RES << 2) + (ADC_RESL >> 6));
  75. }
  76. return 0x01;
  77. }
  78. #elif defined(USE_HAL_DRIVER)
  79. #include "adc.h"
  80. // set channel to 0 for scand mode
  81. uint16_t ADC_Get(ADC_HandleTypeDef* adc, uint32_t channel){
  82. #if defined (__STM32F4xx_ADC_H)
  83. #define SAMPETIME ADC_SAMPLETIME_480CYCLES
  84. #elif defined (__STM32F1xx_HAL_ADC_H)
  85. #define SAMPETIME ADC_SAMPLETIME_239CYCLES_5
  86. #endif
  87. if(channel != 0){
  88. ADC_ChannelConfTypeDef sConfig = {0};
  89. sConfig.Channel = channel;
  90. sConfig.Rank = 1U;
  91. sConfig.SamplingTime = SAMPETIME; // do not set faster than 28 at f103
  92. if(HAL_ADC_ConfigChannel(adc, &sConfig) != HAL_OK){
  93. Error_Handler();
  94. }
  95. }
  96. HAL_ADC_Start(adc);
  97. HAL_ADC_PollForConversion(adc, 1000);
  98. if(HAL_IS_BIT_SET(HAL_ADC_GetState(adc), HAL_ADC_STATE_REG_EOC))
  99. return HAL_ADC_GetValue(adc);
  100. return 0.1;
  101. }
  102. #endif /* PLATFORM */
  103. // ADC -------------------------------------------------------------------------
  104. // #include "HW_ADC_ATY.h"
  105. // void MCU_CoreAdcGet(void){
  106. // // F405/F407(mV)
  107. // // float VOL_PER_AD_ATY = 1210.0 / ((float)(*(__IO uint16_t*)(0x1FFF7A2A)));
  108. // // float VREFINT_MCU_ATY = ADC_Get(&hadc1, ADC_CHANNEL_VREFINT) * VOL_PER_AD_ATY;
  109. // // float TEMPERATURE_MCU_ATY =
  110. // // (((ADC_Get(&hadc1, ADC_CHANNEL_TEMPSENSOR) * VOL_PER_AD_ATY) - 760.0) / 2.5) + 25.0;
  111. // // F103(mV)
  112. // float VOL_PER_AD_ATY = 1200.0 / ADC_Get(&hadc1, ADC_CHANNEL_VREFINT);
  113. // float VREFINT_MCU_ATY = ADC_Get(&hadc1, ADC_CHANNEL_VREFINT) * VOL_PER_AD_ATY;
  114. // float TEMPERATURE_MCU_ATY = ((1430.0 -
  115. // (ADC_Get(&hadc1, ADC_CHANNEL_TEMPSENSOR) * VOL_PER_AD_ATY)) / 4.3) + 25.0;
  116. // float MCU_BASE_VOL_D = 1200;//VREFINT_MCU_ATY;
  117. // float MCU_BASE_VOL = VREFINT_MCU_ATY;
  118. // float MCU_TEMP = TEMPERATURE_MCU_ATY;
  119. // printf_ATY_D("\r\nCAD: %f, CV: %f, CT: %f\r\n", VOL_PER_AD_ATY, MCU_BASE_VOL, MCU_TEMP);
  120. // }
  121. #endif /* __HW_ADC_ATY_C */
  122. /******************************** End Of File *********************************/