drv_adc.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "common.h"
  2. #include "drv_adc.h"
  3. int8_t Sample_ADC_Values(uint8_t channel, uint16_t *buff, uint8_t times)
  4. {
  5. /* reset ADC */
  6. adc_deinit(ADC0);
  7. /* ADC mode config */
  8. adc_mode_config(ADC_MODE_FREE);
  9. adc_special_function_config(ADC0,ADC_SCAN_MODE,ENABLE);
  10. /* ADC data alignment config */
  11. adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  12. /* ADC channel length config */
  13. adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
  14. /* ADC regular channel config */
  15. adc_regular_channel_config(ADC0, 0, channel, ADC_SAMPLETIME_55POINT5);
  16. /* ADC trigger config */
  17. adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
  18. adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
  19. /* ADC discontinuous mode */
  20. //adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 3);
  21. /* enable ADC interface */
  22. adc_enable(ADC0);
  23. delay_1ms(1);
  24. /* ADC calibration and reset calibration */
  25. adc_calibration_enable(ADC0);
  26. while (times > 0) {
  27. adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);
  28. while(SET != adc_flag_get(ADC0,ADC_FLAG_EOC));
  29. *buff++ = adc_regular_data_read(ADC0);
  30. adc_flag_clear(ADC0,ADC_FLAG_EOC);
  31. times--;
  32. }
  33. //printf("adc:%d\r\n",*ADC1ConvertedValue);
  34. return 1;
  35. }
  36. int8_t adc_getResult_6t(unsigned char chNo, unsigned short* result)
  37. {
  38. unsigned char i;
  39. unsigned short Vsample[ADC_GETRESULT_6TIMES];
  40. unsigned short Vaverage;
  41. unsigned char s_min, s_max;
  42. int ret;
  43. if(result==(void*)0)
  44. {
  45. return(ADC_R_ERR_NULL);
  46. }
  47. ret = Sample_ADC_Values(chNo, Vsample, ADC_GETRESULT_6TIMES);
  48. if(ret <= 0)
  49. {
  50. return ADC_R_ERR_CHNUM;
  51. }
  52. s_min = 0u;
  53. s_max = 0u;
  54. for(i=1u;i<ADC_GETRESULT_6TIMES;i++)
  55. {
  56. if(Vsample[s_min] > Vsample[i]){
  57. s_min = i;
  58. }
  59. if(Vsample[s_max] < Vsample[i]){
  60. s_max = i;
  61. }
  62. }
  63. if(s_min == s_max)
  64. {
  65. *result = Vsample[0];
  66. return(1);
  67. }
  68. else
  69. {
  70. Vaverage = 0u;
  71. for(i=0u;i<ADC_GETRESULT_6TIMES;i++)
  72. {
  73. if((i != s_min) &&(i != s_max))
  74. {
  75. Vaverage += (Vsample[i] >> 2);
  76. }
  77. }
  78. }
  79. *result = Vaverage;
  80. return (1);
  81. }
  82. //**************************************************Measure_Temprature********************************************************
  83. void _Measure_Temprature_Initial(void)
  84. {
  85. rcu_periph_clock_enable(RCU_GPIOC);
  86. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3);
  87. /* enable GPIOA clock */
  88. rcu_periph_clock_enable(RCU_GPIOA);
  89. /* enable ADC0 clock */
  90. rcu_periph_clock_enable(RCU_ADC0);
  91. /* config ADC clock */
  92. rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
  93. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1);
  94. }
  95. //**************************************************vbat********************************************************
  96. void _Measure_Vol_Initial(void)
  97. {
  98. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
  99. }
  100. /*void test_adc(void)
  101. {
  102. uint16_t ADC1ConvertedValue;
  103. ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  104. //while(ADC_GetSoftwareStartConvStatus(ADC1));
  105. while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
  106. ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
  107. ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
  108. }
  109. */