PWM to DC converter 作製編
PWMのdury比を測定してDC電圧に変換する。
一番簡単な方法はローパスフィルタ。
ただ周波数に応じてリップルが除去しきれなかった。設計があいまい過ぎたからだろう。
確実な方法として、PWMのDuty比をマイコンで計測、その計測値からDACに出力電圧をマイコンから指示してDACからDCを出力する事をしてみた。
CNCのモーターのコントローラーとして下のようなドライバーを使っている。
https://www.amazon.co.jp/gp/product/B015F88D32/ref=ewc_pr_img_1?smid=A18ZODZFQ0ZC6B&psc=1
これまではここにつけた可変抵抗で手動で回転数を決めていたが、GRBLのソフトからモータの回転数を制御して、ON-OFFもしたいというモチベーションで作ってみた。
マイコンは手元にあった安価なArduinoNano互換を利用。
#include <Adafruit_MCP4725.h>
#include<Wire.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>
Adafruit_SSD1306 display(-1);
Adafruit_MCP4725 MCP4725;
#define pulse_ip 2
int ontime,offtime;
float freq,period,duty;
void setup() {
pinMode(pulse_ip,INPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
MCP4725.begin(0x60);
}
void loop() {
ontime = pulseIn(pulse_ip,HIGH);
offtime = pulseIn(pulse_ip,LOW);
period = ontime+offtime;
if (period==0){
freq = 0;
duty =0;
}else{
freq = 1000000.0/period;
duty = (ontime/period)*100;
}
MCP4725.setVoltage(duty*(4096-1), false);
delay(100);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print(freq); //freq
display.setCursor(0, 8);
display.print(ontime);
display.setCursor(0, 16);
display.print(offtime);
display.setCursor(0, 24);
display.print(duty);
display.display();
delay(100);
}
arduinoにpulseinという関数があるのでそれを利用。ONとOFFになる時間からduty比を求めるスケッチを書いてみた。(ArduinoでPWMのduty比を測定)
写真など記録は残していないが、ブレッドボードで試した時には、ちゃんとこのコードでテストをして、動作は確認している。
DACには、秋月電子MCP4725 EEPROM搭載12ビットD/Aコンバータモジュール、https://akizukidenshi.com/catalog/g/gK-08677/
が手元にあったので使っている。
回路の設計
1点物なので、ユニバーサル基板で作る事を考えたが、基板を設計、発注して基板を作ってみた。(CNCで作ろうとしたら、ステッピングモータのドライバーが故障・・・調達しなおしている間に、納品されると思って基板発注に切り替えたのが理由)
I2Cしか使っていないので、簡単な回路。
基板の大きさは、モータードライバーと重ねて固定する事を想定して同じ大きさにし、ネジ穴も同じ位置にくるようにしている。
半田で部品4点だけだが固定する。
動作の方は別途報告するとして、ArduinoでPWMのduty比を計測する
コメント
コメントを投稿