| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
-
- #include "board.h"
- void adc_init(void)
- {
- // PC00 : AIN10 for CELL = VBAT/2
- GpioInit(PC00_AF0, GPIO_ANA);
- // PC01 : CELL_EN, power 0:off; 1:on;
- GpioInit(PC01_AF0, GPIO_DIG_OUT_WEAK_PUSH_NONEUP_NONEDOWN);
- GpioClrPins(GpioPortC, GpioBitMsk1); // power off CELL_EN
- }
- //float McuTemp;
- //uint16_t McuVcc; // unit mV
- //uint16_t McuVbat; // unit mV
- volatile float McuTemp;
- volatile uint16_t McuVcc; // unit mV
- volatile uint16_t McuVbat; // unit mV
- //volatile uint16_t McuVTxbat; // unit mV
- volatile float WaterPressure = 0.0f; // unit MPa
- void adc_get(void)
- {
- uint16_t ADC_DATA;
- PeriClk_MutEnable(PeriClk_AdcBgr);
- // cfg BGR after ADC clk en
- M0P_BGR->CR = (1u<<1) | // TS_EN, 0:disable; 1:enable temp sensor
- (1u<<0); // BGR_EN, 0:disable; 1:enable BGR
- M0P_ADC->CR1 = (0<<11) | // RAccEn, accumulate result 0:disable; 1:enable;
- (1<<10) | // Mode, 0:single convert; 1:continuous convert;
- (0<<9) | // Injected convert DMA En, 0:close; 1:open;
- (0<<8) | // sequence convert DMA En, 0:close; 1:open;
- (0<<2); // Align, ADC result 0:right align; 1:left align;
-
- M0P_ADC->CR0 = (0<<15) | // IE, interrupt 0:disable; 1:enable;
- (1<<14) | // InRefEn, internal reference 0:disable; 1:enable(0.5mA Current);
- (3<<12) | // SAM, 0:4; 1:6; 2:8; 3:12 sample clocks
- (1<<11) | // BUF, input buffer 0:close; 1:open(0.6mA Current);
- (1<<9) | // REF, 0:1.5V InRef; 1:2.5V InRef; 2:ExRef(PB01); 3:AVCC;
- (3<<2) | // CKDiv, 0:PCLK; 1:PCLK/2; 2:PCLK/4; 3:PCLK/8;
- (1<<0); // ADCEN, 0:close; 1:open;
- M0P_ADC->ICR = 0x0u; // clear flag
- // M0P_ADC->JQR = ( 1u<<20) | // CNT,
- // ( 0u<<15) | // CH3Mux
- // ( 0u<<10) | // CH2Mux
- // (27u<< 5) | // CH1Mux, 27:AVCC/3; 28:Temp
- // (28u<< 0); // CH0Mux, 27:AVCC/3; 28:Temp
- M0P_ADC->SQR2 = (15u<<20) | // CNT,
- (10u<<15) | // CH15Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (27u<<10) | // CH14Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (10u<< 5) | // CH13Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (28u<< 0); // CH12Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- M0P_ADC->SQR1 = (27u<<25) | // CH11Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (10u<<20) | // CH10Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (27u<<15) | // CH9Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (28u<<10) | // CH8Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (10u<< 5) | // CH7Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (27u<< 0); // CH6Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- M0P_ADC->SQR0 = (10u<<25) | // CH5Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (28u<<20) | // CH4Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (27u<<15) | // CH3Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (10u<<10) | // CH2Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (27u<< 5) | // CH1Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- (28u<< 0); // CH0Mux, 10:AIN10; 27:AVCC/3; 28:Temp
- GpioSetPins(GpioPortC, GpioBitMsk1); // power on CELL_EN
- us_delay(20); // wait 20us for BGR stable
- // M0P_ADC->JQRSTART = (1<<0); // start, 0:none; 1:start JQR convert
- // while(M0P_ADC->IFR_f.JQRIF==0){
- // // wait until end of convert
- // }
- M0P_ADC->SQRSTART = (1<<0); // start, 0:none; 1:start SQR convert
- while(M0P_ADC->IFR_f.SQRIF==0){
- // wait until end of convert
- }
- GpioClrPins(GpioPortC, GpioBitMsk1); // power off CELL_EN
- // ADC_Volt = M0P_ADC->JQRRESULT1;
- // ADC_Temp = M0P_ADC->JQRRESULT0;
- ADC_DATA = M0P_ADC->SQRRESULT0;
- ADC_DATA += M0P_ADC->SQRRESULT4;
- ADC_DATA += M0P_ADC->SQRRESULT8;
- ADC_DATA += M0P_ADC->SQRRESULT12;
- ADC_DATA = ADC_DATA>>2;
- McuTemp = (ADC_DATA - *((uint16_t *)0x00100C36u))*(2.5f*0.0795f)+25.0f;
- ADC_DATA = M0P_ADC->SQRRESULT1;
- ADC_DATA += M0P_ADC->SQRRESULT3;
- ADC_DATA += M0P_ADC->SQRRESULT6;
- ADC_DATA += M0P_ADC->SQRRESULT9;
- ADC_DATA += M0P_ADC->SQRRESULT11;
- ADC_DATA += M0P_ADC->SQRRESULT14;
- McuVcc = (((uint32_t)ADC_DATA)*(2500*3/6))>>12;
- ADC_DATA = M0P_ADC->SQRRESULT2;
- ADC_DATA += M0P_ADC->SQRRESULT5;
- ADC_DATA += M0P_ADC->SQRRESULT7;
- ADC_DATA += M0P_ADC->SQRRESULT10;
- ADC_DATA += M0P_ADC->SQRRESULT13;
- ADC_DATA += M0P_ADC->SQRRESULT15;
- McuVbat = (uint16_t)(((float)ADC_DATA)*(2500.0f*2/6/4096));
- M0P_ADC->ICR = 0x0u; // clear flag
- M0P_ADC->CR0 &= ~(1<<0); // ADCEN, 0:close; 1:open;
- M0P_BGR->CR = (0u<<1) | // TS_EN, 0:disable; 1:enable temp sensor
- (0u<<0); // BGR_EN, 0:disable; 1:enable BGR
- PeriClk_MutDisable(PeriClk_AdcBgr);
- }
|