×

らずらいと兄貴の熱血実験「電池の電圧を測ってみる」

2017-04-18

久々の登場、いつもハイテンションなLazuriteの助っ人こと「らずらいと兄貴」です!!
Lazuriteの使用者から、「Lazuriteの電池の電圧を知りたい!!」というご要望がありましたので説明します。

先日公開したLazuriteIDEに、Lazuriteに搭載されているマイコン ML620Q504Hの電源電圧を測定するvoltage_checkという関数を追加したのですが、Lazurite SubGHzを内蔵LDOの3.3Vで使用していると、それ以上の電源電圧を知ることができません。

今回は、LDOの外の電圧を測定する方法を実験しました。

IMG_3664

測定回路はこの通りです。

測定回路

ML620Q504Hには、電源電圧を測定する回路が内蔵されていますが、電池の電圧が3.3Vより高いと、LDOが正常に機能するためにML620Q504H電源電圧はその外部の電圧によらず3.3Vになってしまいます。その時の電池の電圧を測るために、抵抗を2つ追加して、外部電圧を半分にした電圧をLazuriteのA0端子に入力します。その電圧をanalogRead()で測定して電圧値に戻せば3.3V以上の電圧値を測定することができます。

接続する抵抗の値は1MΩなど大きいほうがよいのですが、誤差も生じてきますので適当な値を試してみてください。

この回路はML620Q504Hの電源電圧が変わってしまう3.3V以下になると正しく測定することができなくなるため、そこから下の電圧はvoltage_checkで行ってください。

両方を動かしたときのソフトウエアは、こちらになります。

なお、今回の回路とソフトウエアは、外部の抵抗を同じ値に設定していますので、A0端子に入る電圧は1/2*VINになります。A0端子の電圧はVIN=5Vの時は2.5Vに、VIN=6Vの時は3Vになります。A0端子の電圧が3.3V以上になる電圧(VIN>6.6V)を測定しようとすると、マイコンが壊れる可能性があるので注意してください。Lazurite SubGHzのVIN端子は15Vまで入力することができます。15Vまで幅広く使用するときは、抵抗の値を変更してA0端子が3.3V以上にならないように調整し、それに合わせて計算式も変更してください。

ソースコード::


char txdata[250];
void print_voltage(uint8_t level) {
	Print.init(txdata,sizeof(txdata));
	Print.p("LDO Level : ");
	switch (level) {
	case VLS_UNDER_1_898:
		Print.p("< 1.898V"); 		break; 	case VLS_1_898: 		Print.p("1.898 ~ 2.000V"); 		break; 	case VLS_2_000: 		Print.p("2.000 ~ 2.093V"); 		break; 	case VLS_2_093: 		Print.p("2.093 ~ 2.196V"); 		break; 	case VLS_2_196: 		Print.p("2.196 ~ 2.309V"); 		break; 	case VLS_2_309: 		Print.p("2.309 ~ 2.409V"); 		break; 	case VLS_2_409: 		Print.p("2.409 ~ 2.605V"); 		break; 	case VLS_2_605: 		Print.p("2.605 ~ 2.800V"); 		break; 	case VLS_2_800: 		Print.p("2.800 ~ 3.068V"); 		break; 	case VLS_3_068: 		Print.p("3.068 ~ 3.394V"); 		break; 	case VLS_3_394: 		Print.p("3.394 ~ 3.797V"); 		break; 	case VLS_3_797: 		Print.p("3.797 ~ 4.226V"); 		break; 	case VLS_4_226: 		Print.p("4.226 ~ 4.667V"); 		break; 	case VLS_4_667: 		Print.p("> 4.667V");
		break;
	default:
		Print.p("unknown");
		break;
	}
}

void setup() {
	Serial.begin(115200);
	SubGHz.init();
	analogReadResolution(12);
}

void loop() {
	uint8_t ldo_level;
	float vdd_level;

	ldo_level = voltage_check(VLS_4_667);		// start checking from 4.667V
	print_voltage(ldo_level);
	vdd_level = ((float)(analogRead(A0)*2)/4096)*3.3f;
	Print.p("\tVDD Level: ");
	Print.f(vdd_level,2);
	Print.ln();
	Serial.print(txdata);
	SubGHz.begin(55,0xabcd,100,20);
	SubGHz.send(0xabcd,0x7fad,txdata,Print.len(),NULL);
	SubGHz.close();
	sleep(3000);
}

以上、熱血らずらいと兄貴でした!!