【微控制器筆記】STM8S003F3使用內部基準電壓測量供電電壓

沉默的小宇宙發表於2020-11-18

 

使用微控制器測量外部電壓或者供電電源,一般而言都是採用電阻分壓的原理,使用一個ADC引腳採集ADC的資料,然後在根據ADC的解析度和分壓反向計算得到輸入電壓。

讀過STM8S003晶片手冊的都知道,ADC的解析度是10位的,也就是最大值是1024,如下圖

 

 

正常的採集電壓需要分壓電路和基準電壓:

 

採集到的ADC資料跟晶片的供電電壓有關係。

下面介紹下一種簡便的方法:

先說下優點:

1、省點

2、沒有ADC輸入硬體

具體原理:STM8S003晶片內部又多個ADC通道,其中ADC通道7是連線到內部穩壓器的,穩壓器的電壓恆定為1.22V。

下面是我通過變化不同的供電電壓得到的資料:

供電電壓   採集到的ADC資料

3.63V    353

4.10V    309

5.28V    238

 

通過筆算反推可以知道

1.22/363 * 1024 = 344

1.22/4.1*1024 = 304

1.22/5.28*1024 = 236

其中用萬用表測量不妨會有誤差,基本上還是比較吻合的。初步確定方法可行。

那通過以上方法就可以得到反向計算供電電壓的方法

vcc = 1024 * 1.22 / adc_value

 

底層程式碼:

//獲取ADC取樣值
u16 ADC_GetValue(u8 ch)
{

	//配置ADC
	ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,(ADC1_Channel_TypeDef)ch, ADC1_PRESSEL_FCPU_D2,ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,DISABLE);
	
	//開啟轉換
	ADC1->CR1 |= ADC1_CR1_ADON;
	ADC1_StartConversion();// ADC1->CR1 |= ADC1_CR1_ADON;
	//等待轉換結束
	while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == 0);
	return ADC1_GetConversionValue();
}

應用程式碼:

u16 adc_value = 0;
float vbat=0;
void test(void){

  while(1){
		adc_value = ADC_GetValue(7);
		vbat = 1024 * 1.22 / adc_value;
		Delay_ms(500);
		
  }
}

By Urien 2020年11月18日 18:33:47

相關文章