#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); }