自動車とUPSやポータブルバッテリ用にデサルフェータ―を新規に考えてみようと思いデサルフェータ―3号機を検討
まずはこれまで作製したデサルフェータ―について検証してみた
- パルス発生部とバッテリー接続部の波形をオシロで再確認
- 消費電力としてバッテリー接続時の消費電流を計測
1号機
元記事に近い形の回路でPチャネルのFETを用いて作製してある
設計では12kHz動作であるがコイルやダイオード類の発熱がもの凄いため6kHz動作にした(切り替えで12kHzも残してある)
6kHz時の波形(上:パルス発生部,下:バッテリー接続部)
FETのON-OFF間隔となるパルス幅は約7μs,ピーク電圧は約40Vである
掃引時間を高速に変えるとリンギングが見え,パルス発生部も出力に影響してなのかFETをONした部分(0Vになったところ)から電圧が上がっている
消費電流(6kHz時)は32mAで低消費
参考までに12kHz時の波形(上:パルス発生部,下:バッテリー接続部)は6kHzの倍になる
若干6kHz時より波形の上下が増えて派手になっている感じはする
消費電流はクロックが倍になっただけで10倍以上となり,パーツの発熱のせいかしばらくすると700mAを超えた
2号機
555を正論理出力にしてNチャネルのFETを用いた
パルス幅の調整に半固定を付けた
万が一のバッテリー上がりを避けるためエンジン始動中のみ動作させるようにしている(短絡ピンで常時動作も可能)
波形(上:パルス発生部,下:バッテリー接続部)
FETのON-OFF間隔となるパルス幅は約5μs,ピーク電圧は約40Vである(後に判明したがオシロを購入した時に計測した2号機デサルのデータは電圧/DIVの倍率が間違っていたため正確ではない)
右は掃引時間を高速に変えてリンギングの状態を観ると,パルスの立ち上がり途中でリンギングが発生しているのが判る
消費電流は225mAで多いと考える
考察
- 出力電圧に関しては1,2号機ともにピークが約40Vであり十分と考える
- 出力クロックとリンギングについてはどうなのか(判らないため)判断できない
- 消費電力については,エンジン始動中のみ動作だと普段の利用状況だと短すぎるため効果が薄いのではないかと思い,消費電力を極力少なめにして一週間位の常時動作を可能にしたい(低消費電力化,電圧検知によるインテリジェント化)
- 掃引時間を低速に変えて1,2号機の出力の違いを比べる
1,2号機ともにクロック毎に同じ出力電圧ではなくバラツキがあるのが判る
出力パルスは2号機のほうが多く良さそうにみえる
低消費電力化
低消費電力にするためには効率良いパルスの発生を行いたい
そこでパルス調整できる装置をArduinoで作製し調整中
スケッチ
//PWM出力で周波数・デューティ比をダイナミックに変更
//
#include <avr/io.h>
#include "rotary.h"
#include "Wire.h"
#include "AQMI2CLCD.h"
#define PWMPin 10
#define BTNPin 8
#define SELFreq 0
#define SELDuty 1
Rotary r = Rotary(2, 3);
AQMI2CLCD lcd;
unsigned int freq = 20000; //周波数
int duty = 10; //指定したいデューティ比
int select = 0; //変更値選択(0:周波数,1:デューティ比)
boolean forced = false;
ISR(PCINT0_vect) {
if(digitalRead(BTNPin) == HIGH) {
select = (select == SELFreq)? SELDuty: SELFreq;
forced = true;
}
}
ISR(PCINT2_vect) {
unsigned char result = r.process();
if(result) {
if(select == SELFreq) {
freq += (result == DIR_CW)? 1000: (-1000);
if(freq < 1000) freq = 1000;
if(freq > 50000) freq = 50000;
} else {
duty += (result == DIR_CW)? 1: (-1);
if(duty < 0) duty = 0;
if(duty > 100) duty = 100;
}
forced = true;
}
}
void setpwm() {
// TOP値指定(周波数設定となる)
OCR1A = (unsigned short)(1000000 / freq);
// Duty比指定 : 1000000 / freq * duty / 100;
long val = (long)10000 * duty / freq;
OCR1B = (unsigned short)val;
}
void setup() {
//LCD初期化
lcd.setup();
//pin設定
pinMode(PWMPin, OUTPUT);
pinMode(BTNPin, INPUT_PULLUP);
//調整用ロータリーエンコーダ割込み設定
PCICR |= (1<<PCIE2) | (1<<PCIE0);
PCMSK0 |= (1<<PCINT0);
PCMSK2 |= (1<<PCINT18) | (1<<PCINT19);
// モード指定
TCCR1A = 0b00100001;
TCCR1B = 0b00010010;
forced = true;
}
void loop() {
char str[20];
for(;;) {
if(forced) {
forced = false;
//1行目
lcd.setLocate(0, 0);
if(select == SELFreq) {
lcd.putString((char *)"[ Freq ] Duty ");
} else {
lcd.putString((char *)" Freq [ Duty ]");
}
//2行目
sprintf(str, " %2dkHz %2d%% \0", freq/1000, duty);
lcd.setLocate(0, 1);
lcd.putString(str);
setpwm();
}
noInterrupts();
delay(100);
interrupts();
}
}
PWM操作の覚書
- PWM出力の周波数をダイナミックに変更するためには直接レジスタを操作するしかない
- PWMの周波数はインターバルタイマでカウントアップされたカウンタ値の上限設定で決定する(上限設定しない場合はMAX)
- インターバルタイマは最大がCPUクロックで分周比の設定もできる
- デューティ比となるパルスのHIGH(もしくはLOW)時間はカウントアップされた値の上限値が立ち上がりとなる
- 下がりはカウンタのMAXもしくはカウンタMAXからマイナスされカウンタ値の上限設定と同じなった時となる(2種選択)
- 上のスケッチは16MHzの分周比8で2Mカウント/秒となりサイクル1Mとして作成している
- 詳細はこちらを参照