前回、Quick Charge 2.0 対応のモバイルバッテリーを ATtiny10 で制御し、9V/12V の出力を指示する回路図とプログラム例を掲載 しました。
Quick Charge 3.0 では 2.0 に加えて、9V/12V でない中途半端な電圧も出力することができますので、手持ちデジカメ C-8080 向けに 6.5V、DSC-WX5 向けに 4.2V をそれぞれ生成させてみたいと思います。
※回路図は 前回 のまま。ただし PB1 に繋いだ SW は未使用
/* * USB-QC3.cpp * * Author : wakwak_koba */ #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> /* QuickChargeに対して出力電圧を指定する。 PB0:D+ PB2:D- */ void QC3_decrement(const int count) { for(int c=0; c<count; c++) // -200mv/count { _delay_ms(50); // TGLITCH_V_CHANGE:50ms(40ms〜) PORTB &= 0b11111011; // PB2:LOW(D-:0V) _delay_us(200); PORTB |= 0b00000100; // PB2:HIGH(D-:3.3V) } } void QC3_increment(const int count) { for(int c=0; c<count; c++) // +200mv/count { _delay_ms(50); // TGLITCH_V_CHANGE:50ms(40ms〜) PORTB |= 0b00000001; // PB0:HIGH(D+:3.3V) _delay_us(300); PORTB &= 0b11111110; // PB0:LOW(D+:0.6V) } } void QC3_continuous(const float voltage) { if(voltage > 5.0) QC3_increment((voltage - 5.0) / 0.2); else if(voltage < 5.0) QC3_decrement((5.0 - voltage) / 0.2); } int main(void) { // PORTB |= 0b00000010; // PB1:PULLUP DDRB |= 0b00000001; // PB0:出力(LOW) _delay_ms(1250); // 1.25秒 DDRB |= 0b00000100; // PB2:出力(LOW) _delay_ms(2); // 2ms // Continuous Mode PORTB &= 0b11111110; // PB0:LOW(D+:0.6V) PORTB |= 0b00000100; // PB2:HIGH(D-:3.3V) QC3_continuous(6.6); }
40ms 以上の「空白の時間」を設けたうえで 300μs ほどのパルスを D+/D- 使って与えてやれば、0.2V ずつインクリメントされたりデクリメントされたりするぽいです。
0.2V 単位での指定なので 6.5V は無理で、6.4V か 6.6V のどちらかになりますが、そこまで精度は出ないぽいので、6.6V 指定にしてみました。
ソース main() 内の QC3_continuous(6.6); のところを QC3_continuous(4.2); に変更することで、4.2V 出力になるのですが、5V 未満の電圧にする時、ひとつ大きな問題があります。
その少し上のコメントを読んでいただくとわかりますが、ここに行き着くまでの間に 1.25s ほどの Wait が入ってます。
つまり最終的に 4.2V になるものの、通電直後の1.25秒間は 5V が出力されてしまうのです。
6.6V 指定時でも通電直後は 5V が出力されてしまうが公称値より低いので、それほど心配いらない
かなり嫌な仕様ですよね。。
4.2V 出力になったことを確認したうえで DSC-WX5 に繋げてやればとりあえずいいのですが、私の買ったモバイルバッテリー は消費電力が少ないと5秒ほどで電源が切れてしまう節電仕様なため、いったん節電が作動して OFF のなったあとで ON にするとき、DSC-WX5 を外しておくのを忘れると1.25秒の間、5V が印可されてしまうという・・・
かなり鬱な仕様ですよね。。
次回はこの辺を何とかしようと思います。
(追記)2017/07/31
続き を書きました。