hal_adc.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "hal_adc.h"
  2. #include "sys_log.h"
  3. #include "sys_timer.h"
  4. #include "delay.h"
  5. #include "board.h"
  6. #define GET_ADC_CNT 3
  7. ADC_HandleTypeDef ADC1_Handler; //ADC���
  8. //��ʼ��ADC
  9. //ch: ADC_channels
  10. //ͨ��ֵ 0~16ȡֵ��ΧΪ��ADC_CHANNEL_0~ADC_CHANNEL_16
  11. void HAL_AdcInit(void)
  12. {
  13. RCC_PeriphCLKInitTypeDef ADC_CLKInit;
  14. ADC_CLKInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; //ADC����ʱ��
  15. ADC_CLKInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; //��Ƶ����6ʱ��Ϊ72M/6=12MHz
  16. HAL_RCCEx_PeriphCLKConfig(&ADC_CLKInit); //����ADCʱ��
  17. ADC1_Handler.Instance = ADC1;
  18. ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT; //�Ҷ���
  19. ADC1_Handler.Init.ScanConvMode = DISABLE; //��ɨ��ģʽ
  20. ADC1_Handler.Init.ContinuousConvMode = DISABLE; //�ر�����ת��
  21. ADC1_Handler.Init.NbrOfConversion = 1; //1��ת���ڹ��������� Ҳ����ֻת����������1
  22. ADC1_Handler.Init.DiscontinuousConvMode = DISABLE; //��ֹ����������ģʽ
  23. ADC1_Handler.Init.NbrOfDiscConversion = 0; //����������ͨ����Ϊ0
  24. ADC1_Handler.Init.ExternalTrigConv = ADC_SOFTWARE_START; //��������
  25. HAL_ADC_Init(&ADC1_Handler); //��ʼ��
  26. HAL_ADCEx_Calibration_Start(&ADC1_Handler); //У׼ADC
  27. }
  28. //ADC�ײ��������������ã�ʱ��ʹ��
  29. //�˺����ᱻHAL_ADC_Init()����
  30. //hadc:ADC���
  31. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
  32. {
  33. GPIO_InitTypeDef GPIO_Initure;
  34. __HAL_RCC_ADC1_CLK_ENABLE(); //ʹ��ADC1ʱ��
  35. __HAL_RCC_GPIOA_CLK_ENABLE(); //����GPIOAʱ��
  36. GPIO_Initure.Pin = ADC_PIN; //PA1
  37. GPIO_Initure.Mode = GPIO_MODE_ANALOG; //�
  38. GPIO_Initure.Pull = GPIO_NOPULL; //����������
  39. HAL_GPIO_Init(ADC_GPIO, &GPIO_Initure);
  40. }
  41. /*
  42. ͨ���� ���� ͨ���� ����
  43. ͨ��0 PA0 ͨ��8 PB0
  44. ͨ��1 PA1 ͨ��9 PB1
  45. ͨ��2 PA2 ͨ��10 PC0
  46. ͨ��3 PA3 ͨ��11 PC1
  47. ͨ��4 PA4 ͨ��12 PC2
  48. ͨ��5 PA5 ͨ��13 PC3
  49. ͨ��6 PA6 ͨ��14 PC4
  50. ͨ��7 PA7 ͨ��15 PC5
  51. */
  52. //���ADCֵ
  53. //ch: ͨ��ֵ 0~16��ȡֵ��ΧΪ��ADC_CHANNEL_0~ADC_CHANNEL_16
  54. //����ֵ:ת�����
  55. static uint16_t Get_Adc(uint32_t ch)
  56. {
  57. ADC_ChannelConfTypeDef ADC1_ChanConf;
  58. ADC1_ChanConf.Channel = ch; //ͨ��
  59. ADC1_ChanConf.Rank = 1; //��1����������1
  60. ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; //����ʱ��
  61. HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf); //ͨ������
  62. HAL_ADC_Start(&ADC1_Handler); //����ADC
  63. HAL_ADC_PollForConversion(&ADC1_Handler, 10); //��ѯת��
  64. return (uint16_t)HAL_ADC_GetValue(&ADC1_Handler); //�������һ��ADC1�������ת�����
  65. }
  66. //��ȡָ��ͨ����ת��ֵ��ȡtimes��,Ȼ��ƽ��
  67. uint16_t HAL_AdcGetVal(void)
  68. {
  69. u32 temp_val = 0;
  70. u8 t;
  71. for (t = 0; t < GET_ADC_CNT; t++)
  72. {
  73. temp_val += Get_Adc(ADC_CHANNEL_1);
  74. delay_ms(3);
  75. }
  76. return temp_val / GET_ADC_CNT;
  77. }
  78. void get_adv_val_timer_callback(void)
  79. {
  80. int mv;
  81. uint16_t val = HAL_AdcGetVal();
  82. mv = val*(3.3/4096)*1000;
  83. DLOG_I("adv_val:%d,mv:%d",val,mv);
  84. }
  85. void HAL_AdcGetValTimerInit(void)
  86. {
  87. HAL_TimerRegister(get_adv_val_timer_callback, 1000);
  88. }