前の投稿の通り,micro:bit の「アナログ出力」とはPWMのことで,以下回路は修正が必要。気が向いたら直します...
(追記終わり)
家にたくさんあるニッケル水素電池を活用したい。でも,結構古いものもあるので,選別,リフレッシュも兼ねて,容量の確認,つまり放電を行う小物を作ってみようと思い立った。
マイコンを使って,電圧を読みながら放電電流を調整すれば,過放電も防げる。
ついでに充電も考えてみた。
部品をそろえるまで,テストプログラムを作ってみた。放電専用
[A] を押すと,目標放電電流を10mAあげる。
[B] を押すと,10mA下げる。
充電で,micro:bit から取り出す場合,100mAが限度なんで注意。まずはその制限はなし。
デバッグ用に,USBに現在の値をかき出すようにしてみた。
input.onButtonPressed(Button.B, function () {
if (Target_mA < 200) {
Target_mA = Target_mA + 10
}
})
input.onButtonPressed(Button.A, function () {
if (Target_mA > 0) {
Target_mA = Target_mA - 10
}
})
serial.onDataReceived(serial.delimiters(Delimiters.Hash), function () {
})
let P2_VCONT = 0
let P1_VDET = 0
let P0_VBAT = 0
let Target_mA = 0
let step_time = 1000
let next_time = step_time + input.runningTime()
serial.redirect(
SerialPin.USB_TX,
SerialPin.USB_RX,
BaudRate.BaudRate9600
)
pins.analogWritePin(AnalogPin.P2, 0)
basic.forever(function () {
P0_VBAT = pins.analogReadPin(AnalogPin.P0)
P1_VDET = pins.analogReadPin(AnalogPin.P1)
if (input.runningTime() > next_time) {
next_time = next_time + step_time
serial.writeLine("P0_VBAT: " + convertToText(P0_VBAT) + " means " + P0_VBAT / 1023 * 3.3 + "V")
serial.writeLine("P1_VDET: " + convertToText(P1_VDET) + " means " + P1_VDET / 1023 * 3.3 / 3 * 1000 + "mA")
serial.writeLine("P2_VCONT: " + convertToText(P2_VCONT))
serial.writeLine("Target_mA: " + convertToText(Target_mA))
serial.writeLine("----")
basic.clearScreen()
for (let i = 4 - Math.round(P0_VBAT / 1023 * 4); i <= 4; i++) {
led.plot(0, i)
led.plot(1, i)
}
basic.pause(100)
for (let i = 4 - Math.round(Target_mA / 200 * 4); i <= 4; i++) {
led.plot(3, i)
basic.pause(100)
}
}
if (Target_mA > P1_VDET / 1023 * 3.3 / 3 * 1000) {
if (P2_VCONT < 1023) {
P2_VCONT += 1
pins.analogWritePin(AnalogPin.P2, P2_VCONT)
}
}
if (Target_mA < P1_VDET / 1023 * 3.3 / 3 * 1000) {
if (P2_VCONT > 0) {
P2_VCONT += 0 - 1
pins.analogWritePin(AnalogPin.P2, P2_VCONT)
}
}
})
0 件のコメント:
コメントを投稿