【Arduino】PWM制御(PWM出力)の方法

Arduino では PWM制御でモータを制御できます。
詳細は下記のサイトが非常に詳しく書いてあります。(感謝!!)
ttp://iot.keicode.com/arduino/arduino-analogwrite-pwm.php
今まで気づきませんでしたが
上記サイトに書かれているように
UNOの端子番号の横に「~」が書いてある端子があります。
これがPWM出力が可能な端子なんです!!
目から鱗の情報でしたw

PWM制御とはON/OFFパルスのデューティー比を変えて
モータなどを早く回すか遅く回すかを制御する方式です。
これにより読み取り速度の遅い機器は0-5Vのアナログ出力として取り込めます。
(逆に言うとあくまでもON/OFFなので完全なアナログ出力は取れないことになります。残念…)

PWM出力がアナログ出力となります。
このあたりが私としては非常に違和感があるのですが仕方ないですね。。。

上記サイトから3番ピンから2V出力する
サンプルプログラムを転載させて頂きます。

// ■ 09:PWM制御(PWM出力)の方法
const int PIN_PWM = 3;
const float V_OUT = 2;

void setup() {
int i = (int) V_OUT * 51;
analogWrite( PIN_PWM, i );
}
void loop(){
}


x51倍してるとこがミソですね。
 5V*51=255
となるので0~255の分解能で出力できることになります。

転載という名のコピペだけでは能が無いので
私自身が使ってみたいようにアレンジしてみました。

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD表示用宣言
const int PIN_PWM = 3; // ピン3(PWM)を定数宣言 constは定数宣言
float V_OUT = 0; // 出力電圧の宣言と初期値0
int i = 0;

void setup()
{
lcd.begin(16, 2); /* LCDの設定(16文字2行) */
lcd.clear(); /* LCDのクリア */
lcd.setCursor(0, 0); /* 0列0行から表示する */
lcd.print("CygnusX Project!"); /* 文字列の表示 */
delay(500);
lcd.clear(); /* LCDのクリア */
int i = (int) V_OUT * 51;
int intCount = 0; // ループ回数を宣言と初期値0
}

void loop(){
for (int intCount = 0; intCount <= 255;intCount++){ // intCountを0~255までループ
analogWrite( PIN_PWM, i ); // iの値をPWM出力

lcd.setCursor(0, 0); /* 0列0行から表示する */
lcd.print("PWM:"); /* 文字列の表示 */
lcd.setCursor(4, 0); /* 4列0行から表示する */
lcd.print(intCount); /* 文字列の表示 */
lcd.setCursor(9, 0); /* 9列0行から表示する */
lcd.print("i:"); /* 文字列の表示 */
lcd.setCursor(11, 0); /* 11列0行から表示する */
lcd.print(i); /* 文字列の表示 */

lcd.setCursor(0, 1); /* 0列1行から表示する */
lcd.print("Cygnus X Project"); /* 文字列の表示 */

delay(300); // 300msec待つ
i = intCount;
lcd.clear(); // LCDをクリア
}}

     

この記事へのコメント