You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.1 KiB

3 months ago
  1. #include "zadc.hpp"
  2. #ifdef HAL_ADC_MODULE_ENABLED
  3. using namespace iflytop;
  4. #define TAG "ADC"
  5. zmutex g_adc_mutex = {"G_ADC_MUTEX"};
  6. void ZADC::initialize(const char* name, ADC_HandleTypeDef* hadc1, int32_t channel, int32_t samplingTime) {
  7. if (!hadc1) return;
  8. m_hadc1 = hadc1;
  9. m_channel = channel;
  10. m_samplingTime = samplingTime;
  11. inited = true;
  12. m_name = name;
  13. m_mutex.init();
  14. if (!g_adc_mutex.isInit()) {
  15. g_adc_mutex.init();
  16. }
  17. }
  18. int32_t ZADC::get_adc_value() {
  19. if (!inited) return 0;
  20. zlock_guard lck(g_adc_mutex);
  21. ADC_ChannelConfTypeDef sConfig = {0};
  22. sConfig.Channel = m_channel; /* 通道 */
  23. sConfig.Rank = 1;
  24. sConfig.SamplingTime = m_samplingTime; /* 采样时间 */
  25. if (HAL_ADC_ConfigChannel(m_hadc1, &sConfig) != HAL_OK) {
  26. ZLOGE(TAG, "%s HAL_ADC_ConfigChannel failed", m_name);
  27. return -1;
  28. }
  29. if (HAL_ADC_Start(m_hadc1) != HAL_OK) {
  30. ZLOGE(TAG, "%s HAL_ADC_Start failed", m_name);
  31. return -1;
  32. }
  33. HAL_ADC_PollForConversion(m_hadc1, 10);
  34. uint16_t adcv = HAL_ADC_GetValue(m_hadc1);
  35. HAL_ADC_Stop(m_hadc1);
  36. // ZLOGI(TAG, "%s ADC Value: %d", m_name, adcv);
  37. return adcv;
  38. }
  39. int32_t ZADC::get_adc_af_filter() {
  40. if (!inited) return 0;
  41. int32_t adc_value[14] = {0};
  42. for (int i = 0; i < 14; i++) {
  43. adc_value[i] = get_adc_value();
  44. osDelay(1);
  45. }
  46. // 排序
  47. for (int i = 0; i < 14; i++) {
  48. for (int j = 0; j < 14 - i - 1; j++) {
  49. if (adc_value[j] > adc_value[j + 1]) {
  50. int temp = adc_value[j];
  51. adc_value[j] = adc_value[j + 1];
  52. adc_value[j + 1] = temp;
  53. }
  54. }
  55. }
  56. // 求平均
  57. int sum = 0;
  58. for (int i = 2; i < 12; i++) {
  59. sum += adc_value[i];
  60. }
  61. return sum / 10;
  62. }
  63. void ZADC::setCacheVal(int32_t val) {
  64. if (!inited) return;
  65. {
  66. zlock_guard lck(m_mutex);
  67. m_cacheVal = val;
  68. }
  69. }
  70. int32_t ZADC::getCacheVal() {
  71. if (!inited) return 0;
  72. {
  73. zlock_guard lck(m_mutex);
  74. return m_cacheVal;
  75. }
  76. }
  77. void ZADC::updateAdcValToCache() {
  78. if (!inited) return;
  79. setCacheVal(get_adc_af_filter());
  80. }
  81. #endif