adc_drv.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "board.h"
  2. void adc_init(void)
  3. {
  4. // PC00 : AIN10 for CELL = VBAT/2
  5. GpioInit(PC00_AF0, GPIO_ANA);
  6. // PC01 : CELL_EN, power 0:off; 1:on;
  7. GpioInit(PC01_AF0, GPIO_DIG_OUT_WEAK_PUSH_NONEUP_NONEDOWN);
  8. GpioClrPins(GpioPortC, GpioBitMsk1); // power off CELL_EN
  9. }
  10. //float McuTemp;
  11. //uint16_t McuVcc; // unit mV
  12. //uint16_t McuVbat; // unit mV
  13. volatile float McuTemp;
  14. volatile uint16_t McuVcc; // unit mV
  15. volatile uint16_t McuVbat; // unit mV
  16. //volatile uint16_t McuVTxbat; // unit mV
  17. volatile float WaterPressure = 0.0f; // unit MPa
  18. void adc_get(void)
  19. {
  20. uint16_t ADC_DATA;
  21. PeriClk_MutEnable(PeriClk_AdcBgr);
  22. // cfg BGR after ADC clk en
  23. M0P_BGR->CR = (1u<<1) | // TS_EN, 0:disable; 1:enable temp sensor
  24. (1u<<0); // BGR_EN, 0:disable; 1:enable BGR
  25. M0P_ADC->CR1 = (0<<11) | // RAccEn, accumulate result 0:disable; 1:enable;
  26. (1<<10) | // Mode, 0:single convert; 1:continuous convert;
  27. (0<<9) | // Injected convert DMA En, 0:close; 1:open;
  28. (0<<8) | // sequence convert DMA En, 0:close; 1:open;
  29. (0<<2); // Align, ADC result 0:right align; 1:left align;
  30. M0P_ADC->CR0 = (0<<15) | // IE, interrupt 0:disable; 1:enable;
  31. (1<<14) | // InRefEn, internal reference 0:disable; 1:enable(0.5mA Current);
  32. (3<<12) | // SAM, 0:4; 1:6; 2:8; 3:12 sample clocks
  33. (1<<11) | // BUF, input buffer 0:close; 1:open(0.6mA Current);
  34. (1<<9) | // REF, 0:1.5V InRef; 1:2.5V InRef; 2:ExRef(PB01); 3:AVCC;
  35. (3<<2) | // CKDiv, 0:PCLK; 1:PCLK/2; 2:PCLK/4; 3:PCLK/8;
  36. (1<<0); // ADCEN, 0:close; 1:open;
  37. M0P_ADC->ICR = 0x0u; // clear flag
  38. // M0P_ADC->JQR = ( 1u<<20) | // CNT,
  39. // ( 0u<<15) | // CH3Mux
  40. // ( 0u<<10) | // CH2Mux
  41. // (27u<< 5) | // CH1Mux, 27:AVCC/3; 28:Temp
  42. // (28u<< 0); // CH0Mux, 27:AVCC/3; 28:Temp
  43. M0P_ADC->SQR2 = (15u<<20) | // CNT,
  44. (10u<<15) | // CH15Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  45. (27u<<10) | // CH14Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  46. (10u<< 5) | // CH13Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  47. (28u<< 0); // CH12Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  48. M0P_ADC->SQR1 = (27u<<25) | // CH11Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  49. (10u<<20) | // CH10Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  50. (27u<<15) | // CH9Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  51. (28u<<10) | // CH8Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  52. (10u<< 5) | // CH7Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  53. (27u<< 0); // CH6Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  54. M0P_ADC->SQR0 = (10u<<25) | // CH5Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  55. (28u<<20) | // CH4Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  56. (27u<<15) | // CH3Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  57. (10u<<10) | // CH2Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  58. (27u<< 5) | // CH1Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  59. (28u<< 0); // CH0Mux, 10:AIN10; 27:AVCC/3; 28:Temp
  60. GpioSetPins(GpioPortC, GpioBitMsk1); // power on CELL_EN
  61. us_delay(20); // wait 20us for BGR stable
  62. // M0P_ADC->JQRSTART = (1<<0); // start, 0:none; 1:start JQR convert
  63. // while(M0P_ADC->IFR_f.JQRIF==0){
  64. // // wait until end of convert
  65. // }
  66. M0P_ADC->SQRSTART = (1<<0); // start, 0:none; 1:start SQR convert
  67. while(M0P_ADC->IFR_f.SQRIF==0){
  68. // wait until end of convert
  69. }
  70. GpioClrPins(GpioPortC, GpioBitMsk1); // power off CELL_EN
  71. // ADC_Volt = M0P_ADC->JQRRESULT1;
  72. // ADC_Temp = M0P_ADC->JQRRESULT0;
  73. ADC_DATA = M0P_ADC->SQRRESULT0;
  74. ADC_DATA += M0P_ADC->SQRRESULT4;
  75. ADC_DATA += M0P_ADC->SQRRESULT8;
  76. ADC_DATA += M0P_ADC->SQRRESULT12;
  77. ADC_DATA = ADC_DATA>>2;
  78. McuTemp = (ADC_DATA - *((uint16_t *)0x00100C36u))*(2.5f*0.0795f)+25.0f;
  79. ADC_DATA = M0P_ADC->SQRRESULT1;
  80. ADC_DATA += M0P_ADC->SQRRESULT3;
  81. ADC_DATA += M0P_ADC->SQRRESULT6;
  82. ADC_DATA += M0P_ADC->SQRRESULT9;
  83. ADC_DATA += M0P_ADC->SQRRESULT11;
  84. ADC_DATA += M0P_ADC->SQRRESULT14;
  85. McuVcc = (((uint32_t)ADC_DATA)*(2500*3/6))>>12;
  86. ADC_DATA = M0P_ADC->SQRRESULT2;
  87. ADC_DATA += M0P_ADC->SQRRESULT5;
  88. ADC_DATA += M0P_ADC->SQRRESULT7;
  89. ADC_DATA += M0P_ADC->SQRRESULT10;
  90. ADC_DATA += M0P_ADC->SQRRESULT13;
  91. ADC_DATA += M0P_ADC->SQRRESULT15;
  92. McuVbat = (uint16_t)(((float)ADC_DATA)*(2500.0f*2/6/4096));
  93. M0P_ADC->ICR = 0x0u; // clear flag
  94. M0P_ADC->CR0 &= ~(1<<0); // ADCEN, 0:close; 1:open;
  95. M0P_BGR->CR = (0u<<1) | // TS_EN, 0:disable; 1:enable temp sensor
  96. (0u<<0); // BGR_EN, 0:disable; 1:enable BGR
  97. PeriClk_MutDisable(PeriClk_AdcBgr);
  98. }