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.

83 lines
1.8 KiB

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