//源文件 void ADCPhyConfig() { RCC->APB2ENR |=1 <<8; //使能 ADC1 時鐘 RCC->AHB1ENR |=1 <<0; //使能 PORTA 時鐘 //PA5 輸入模式、下拉、高速 GPIOA->MODER |= (3<<5*2); //輸入模式 G ...
//源文件 void ADCPhyConfig() { RCC->APB2ENR |=1 <<8; //使能 ADC1 時鐘 RCC->AHB1ENR |=1 <<0; //使能 PORTA 時鐘 //PA5 輸入模式、下拉、高速 GPIOA->MODER |= (3<<5*2); //輸入模式 GPIOA->PUPDR |= (3<<5*2); //下拉 GPIOA->OSPEEDR |= (1<<6*2); //高速 RCC->APB2RSTR|=1<<8; //ADCs 複位 RCC->APB2RSTR&=~(1<<8); //複位結束 ADC->CCR = 1<<16; //ADCCLK=PCLK2/4=90/4=22.5Mhz,不超過 36Mhz ADC1->CR1 = 0; //CR1 設置清零 ADC1->CR2 = 0; //CR2 設置清零 ADC1->CR1 |= 0<<24; //12 位模式 ADC1->CR1 |= 0<<8; //非掃描模式 ADC1->CR2 &= ~(1<<1); //單次轉換模式 ADC1->CR2 &= ~(1<<11); //右對齊 ADC1->CR2 |= 0<< 28; //軟體觸發 ADC1->SQR1 &= ~(0XF<<20); ADC1->SQR1 |= 0<<20; //1 個轉換在規則序列中 也就是只轉換規則序列 1 //設置通道 5 的採樣時間 ADC1->SMPR2 &= ~(7<<(3*5));//通道 5 採樣時間清空 ADC1->SMPR2 |= 7<<(3*5); //通道 5 480 個周期,提高採樣時間可以提高精確度 ADC1->CR2 |= 1<<0; //開啟 AD 轉換器 } //獲得 ADC 值 //ch:通道值 0~16 //返回值:轉換結果 uint16_t Get_Adc(uint8_t ch) { //設置轉換序列 ADC1->SQR3&=0XFFFFFFE0;//規則序列 1 通道 ch ADC1->SQR3|=ch; ADC1->CR2|=1<<30; //啟動規則轉換通道 while(!(ADC1->SR&1<<1));//等待轉換結束 return ADC1->DR; //返回 adc 值 } //獲取通道 ch 的轉換值,取 times 次,然後平均 //ch:通道編號 //times:獲取次數 //返回值:通道 ch 的 times 次轉換結果平均值 uint16_t Get_Adc_Average(uint8_t ch,uint8_t times) { uint32_t temp_val=0; uint8_t t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); DelayPhyMs(5); } return temp_val/times; } //頭文件 /*****************************adc**************************************/ #define ADC_CH5 5 //通道 5 void ADCPhyConfig(void); uint16_t Get_Adc(uint8_t ch); uint16_t Get_Adc_Average(uint8_t ch,uint8_t times); /**********************************************************************/