×

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

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以上にならないように調整し、それに合わせて計算式も変更してください。

ソースコード::

[c]

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

[/c]

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