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

12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 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