adc.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "bsp/adc.h"
  2. #include "libs/utils.h"
  3. #include "os/co_task.h"
  4. static void _gpio_init(void);
  5. void adc_init(void){
  6. /* init adc input gpio */
  7. _gpio_init();
  8. /* config ADC clock */
  9. rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
  10. rcu_periph_clock_enable(RCU_ADC0);
  11. rcu_periph_clock_enable(RCU_ADC1);
  12. adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
  13. /* ADC scan mode function enable */
  14. adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
  15. adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
  16. /* configure ADC data alignment */
  17. adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  18. adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
  19. /* configure ADC inserted channel trigger */
  20. adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE);
  21. /* configure ADC inserted channel length */
  22. adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
  23. /* configure ADC inserted channel trigger */
  24. adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC0_1_2_EXTTRIG_INSERTED_NONE);
  25. /* configure ADC inserted channel length */
  26. adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
  27. /* configure ADC inserted channel */
  28. adc_inserted_channel_config(ADC0, 0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
  29. adc_inserted_channel_config(ADC1, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
  30. /* ADC external trigger enable */
  31. adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
  32. adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
  33. adc_interrupt_enable(ADC0, ADC_INT_EOIC);
  34. /* configure ADC regular channel trigger */
  35. adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
  36. adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
  37. /* enable ADC interface */
  38. adc_enable(ADC0);
  39. adc_enable(ADC1);
  40. /* ADC calibration and reset calibration */
  41. adc_calibration_enable(ADC0);
  42. adc_calibration_enable(ADC1);
  43. nvic_irq_enable(ADC0_1_IRQn, ADC_IRQ_PRIORITY, 0);
  44. adc_disable_ext_trigger();
  45. }
  46. static void _gpio_init(void) {
  47. rcu_periph_clock_enable(RCU_GPIOA);
  48. rcu_periph_clock_enable(RCU_GPIOB);
  49. gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
  50. gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1);
  51. }
  52. void adc_start_insert_convert(void) {
  53. /* clear the ADC flag */
  54. adc_flag_clear(ADC0, ADC_FLAG_EOIC);
  55. adc_flag_clear(ADC1, ADC_FLAG_EOIC);
  56. while ((adc_flag_get(ADC0, ADC_FLAG_EOIC) == RESET) || (adc_flag_get(ADC1, ADC_FLAG_EOIC) == RESET));
  57. adc_flag_clear(ADC0, ADC_FLAG_EOIC);
  58. adc_flag_clear(ADC1, ADC_FLAG_EOIC);
  59. /* enable ADC interrupt */
  60. adc_interrupt_enable(ADC0, ADC_INT_EOIC);
  61. }
  62. void adc_stop_insert_convert(void) {
  63. adc_disable_ext_trigger();
  64. /* enable ADC interrupt */
  65. adc_interrupt_disable(ADC0, ADC_INT_EOIC);
  66. /* clear the ADC flag */
  67. adc_flag_clear(ADC0, ADC_FLAG_EOIC);
  68. adc_flag_clear(ADC1, ADC_FLAG_EOIC);
  69. }
  70. s32 adc_sample_regular_channel(int channel, int times) {
  71. u32 adc_device = ADC0;
  72. int value = 0;
  73. int count = 0;
  74. int min = 0xFFFFF;
  75. int max = -0xFFFFF;
  76. u64 start_time;
  77. adc_channel_length_config(adc_device, ADC_REGULAR_CHANNEL, 1);
  78. adc_regular_channel_config(adc_device, 0, channel, ADC_SAMPLETIME_55POINT5);
  79. while(count < times){
  80. restart:
  81. start_time = co_task_sys64_ticks();
  82. adc_software_trigger_enable(adc_device, ADC_REGULAR_CHANNEL);
  83. while(SET != adc_flag_get(adc_device, ADC_FLAG_EOC)){
  84. if (co_task_sys64_ticks() - start_time >= 2){
  85. goto restart;
  86. }
  87. };
  88. int one = adc_regular_data_read(adc_device);
  89. adc_flag_clear(adc_device, ADC_FLAG_EOC);
  90. value += (one & 0xFFF);
  91. count ++;
  92. if (one > max){
  93. max = one;
  94. }
  95. if (one < min) {
  96. min = one;
  97. }
  98. }
  99. if (times <= 2) {
  100. return value/times;
  101. }
  102. return (value - min - max)/(times-2);
  103. }