gd32_adc.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "gd32_adc.h"
  2. #include "gpio.h"
  3. /* For 12-bits resolution, the total conversion time is
  4. sampling time + 12.5 ADCCLK cycles */
  5. void adc_init(void){
  6. rcu_periph_clock_enable(RCU_GPIOA);
  7. rcu_periph_clock_enable(RCU_GPIOB);
  8. gpio_mode_analog_input(GPIOA, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
  9. gpio_mode_analog_input(GPIOB, GPIO_PIN_1|GPIO_PIN_0);
  10. /* config ADC clock */
  11. rcu_adc_clock_config(RCU_ADCCK_AHB_DIV3); //adc clock:28M
  12. rcu_periph_clock_enable(RCU_ADC);
  13. adc_deinit();
  14. adc_resolution_config(ADC_RESOLUTION_12B);
  15. /* ADC trigger config */
  16. adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
  17. adc_special_function_config(ADC_SCAN_MODE,ENABLE);
  18. /* ADC data alignment config */
  19. adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
  20. /* ADC channel length config */
  21. adc_channel_length_config(ADC_REGULAR_CHANNEL, 1);
  22. adc_discontinuous_mode_config(ADC_REGULAR_CHANNEL, 1);
  23. //hardware oversample to 16bit
  24. adc_oversample_mode_config(ADC_OVERSAMPLING_ONE_CONVERT, ADC_OVERSAMPLING_SHIFT_4B, ADC_OVERSAMPLING_RATIO_MUL256);
  25. }
  26. int adc_sample(int chan, int calibration){
  27. int value = -0xFFFFFF;
  28. if (chan == ADC_CHAN_AUX_CURR || chan == ADC_CHAN_IMON || chan == ADC_CHAN_VMON){
  29. adc_oversample_mode_enable();
  30. }else {
  31. adc_oversample_mode_disable();
  32. }
  33. /* ADC regular channel config */
  34. adc_regular_channel_config(0, chan, ADC_SAMPLETIME_7POINT5);//7.5 + 12.5 = 20 cycle, 20/(28*1000000)
  35. adc_enable();
  36. if (calibration) {
  37. /* ADC calibration and reset calibration */
  38. adc_calibration_enable();
  39. }
  40. adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
  41. while(SET != adc_flag_get(ADC_FLAG_EOC));
  42. value = adc_regular_data_read();
  43. adc_flag_clear(ADC_FLAG_EOC);
  44. adc_disable();
  45. return value;
  46. }