前回の記事では、STM32を使用したADC変換について見てきました。このチュートリアルでは、STM32のPWM(パルス幅変調)と、 PWM技術を使用してLEDの輝度またはDCファンの速度を制御する方法について学習します。
信号には、アナログとデジタルの2種類があることがわかっています。アナログ信号には(3V、1V…など)のような電圧があり、デジタル信号には(1 'と0')があります。マイクロコントローラーはデジタルしか理解しないため、センサー出力はアナログ信号であり、これらのアナログ信号はADCを使用してデジタルに変換されます。これらのADC値を処理した後、アナログデバイスを駆動するために出力をアナログ形式に変換する必要があります。そのために、PWM、デジタル-アナログ(DAC)コンバーターなどの特定の方法を使用します。
PWM(Pulse with Modulation)とは何ですか?
PWMは、モーターの速度やLEDの明るさなどを制御するなど、デジタル値を使用してアナログデバイスを制御する方法です。モーターとLEDはアナログ信号で動作することがわかっています。しかし、PWMは純粋なアナログ出力を提供しません。PWMは、デューティサイクルによって提供される短いパルスによって作成されたアナログ信号のように見えます。
PWMのデューティサイクル
PWM信号がHIGH(オンタイム)のままである時間のパーセンテージは、デューティサイクルと呼ばれます。信号が常にオンの場合は100%のデューティサイクルであり、常にオフの場合は0%のデューティサイクルです。
デューティサイクル=ターンオン時間/(ターンオン時間+ターンオフ時間)
STM32のPWM
STM32F103C8には、15個のPWMピンと10個のADCピンがあります。7つのタイマーがあり、各PWM出力は4つのタイマーに接続されたチャネルによって提供されます。16ビットのPWM分解能(2 16)を備えています。つまり、カウンターと変数は65535まで大きくすることができます。72MHzのクロックレートでは、PWM出力の最大周期は約1ミリ秒です。
- したがって、65535の値は、LEDの完全な明るさとDCファンの完全な速度(100%のデューティサイクル)を提供します。
- 同様に、32767の値は、LEDの半分の明るさとDCファンの半分の速度を示します(50%のデューティサイクル)
- そして、13107の値は(20%)明るさと(20%)速度(20%デューティサイクル)を与えます
このチュートリアルでは、ポテンショメータとSTM32を使用して、PWM技術によってLEDの輝度とDCファンの速度を変化させます。16x2 LCDは、ADC値(0-4095)と出力される変更された変数(PWM値)(0-65535)を表示するために使用されます。
他のマイクロコントローラーを使用したPWMの例をいくつか示します。
- MPLABおよびXC8を搭載したPICマイクロコントローラを使用したPWMの生成
- RaspberryPiによるサーボモーター制御
- PWMを使用したArduinoベースのLED調光器
- MSP430G2を使用したパルス幅変調(PWM)
ここですべてのPWM関連プロジェクトを確認してください。
必要なコンポーネント
- STM32F103C8
- DCファン
- ULN2003モータードライバーIC
- LED(赤)
- LCD(16x2)
- ポテンショメータ
- ブレッドボード
- バッテリー9V
- ジャンパー線
DCファン:ここで使用されているDCファンは古いPCのBLDCファンです。外部電源が必要なため、9VDCバッテリーを使用しています。
ULN2003モータードライバーIC:モーターは単方向であり、ファンには外部電源が必要なため、モーターを一方向に駆動するために使用されます。ULN2003ベースのモータードライバー回路の詳細については、こちらをご覧ください。以下はULN2003の写真図です。
ピン(IN1〜IN7)は入力ピンであり、(OUT 1〜OUT 7)は対応する出力ピンです。COMには、出力デバイスに必要な正の電源電圧が与えられます。
LED:赤色LEDを使用し、赤色発光します。任意の色を使用できます。
ポテンショメータ:2つのポテンショメータが使用されます。1つはADCへのアナログ入力用の分圧器用で、もう1つはLEDの輝度を制御するためのものです。
STM32のピン詳細
PWMピンが波形(〜)で示されていることがわかるように、そのようなピンは15個あり、ADCピンは緑色で表され、アナログ入力に使用されるADCピンは10個あります。
回路図と接続
STM32とさまざまなコンポーネントとの接続について以下に説明します。
アナログ入力(ADC)を備えたSTM32
回路の左側にあるポテンショメータは、3.3Vピンからの電圧を調整する電圧レギュレータとして使用されます。ポテンショメータからの出力、つまりポテンショメータのセンターピンはSTM32のADCピン(PA4)に接続されています。
LED付きSTM32
STM32 PWM出力ピン(PA9)は、直列抵抗とコンデンサを介してLEDの正のピンに接続されています。
抵抗とコンデンサ付きのLED
アナログ出力はPWMピンから直接生成された場合から純粋ではないため、直列の抵抗と並列のコンデンサがLEDに接続され、PWM出力から正しいアナログ波を生成します。
ULN2003を備えたSTM32およびファンを備えたULN2003
STM32 PWM出力ピン(PA8)はULN2003 ICの入力ピン(IN1)に接続され、ULN2003の対応する出力ピン(OUT1)はDCFANのマイナス線に接続されます。
DCファンのプラスピンはULN2003ICのCOMピンに接続され、外部バッテリー(9V DC)もULN2003ICの同じCOMピンに接続されます。ULN2003のGNDピンはSTM32のGNDピンに接続され、バッテリーのマイナスは同じGNDピンに接続されています。
LCD付きSTM32(16x2)
LCDピン番号 |
LCDピン名 |
STM32ピン名 |
1 |
グラウンド(Gnd) |
地面(G) |
2 |
VCC |
5V |
3 |
VEE |
ポテンショメータの中心からのピン |
4 |
レジスタ選択(RS) |
PB11 |
5 |
読み取り/書き込み(RW) |
地面(G) |
6 |
有効(EN) |
PB10 |
7 |
データビット0(DB0) |
接続なし(NC) |
8 |
データビット1(DB1) |
接続なし(NC) |
9 |
データビット2(DB2) |
接続なし(NC) |
10 |
データビット3(DB3) |
接続なし(NC) |
11 |
データビット4(DB4) |
PB0 |
12 |
データビット5(DB5) |
PB1 |
13 |
データビット6(DB6) |
PC13 |
14 |
データビット7(DB7) |
PC14 |
15 |
LEDポジティブ |
5V |
16 |
LEDネガティブ |
地面(G) |
右側のポテンショメータは、LCDディスプレイのコントラストを制御するために使用されます。上記の表は、LCDとSTM32の接続を示しています。
STM32のプログラミング
前のチュートリアルと同様に、FTDIプログラマーを使用せずにUSBポートを介してArduinoIDEでSTM32F103C8をプログラミングしました。Arduino IDEを使用したSTM32のプログラミングについては、リンクをたどってください。Arduinoのようにプログラミングを進めることができます。完全なコードは最後に記載されています。
このコーディングでは、左側のポテンショメータの中央のピンに接続されているADCピン(PA4)から入力アナログ値を取得し、アナログ値(0〜3.3V)をデジタルまたは整数形式(0〜4095)に変換します。このデジタル値は、DCファンのLEDの明るさと速度を制御するためのPWM出力としてさらに提供されます。16x2 LCDは、ADCとマップされた値(PWM出力値)を表示するために使用されます。
まず、LCDヘッダーファイルをインクルードし、LCDピンを宣言し、以下のコードを使用してそれらを初期化する必要があります。LCDとSTM32のインターフェースについて詳しくは、こちらをご覧ください。
#include
次に、STM32のピンを使用してピン名を宣言および定義します。
const int analoginput = PA4; //ポテンショメータからの入力 constint led = PA9; // LED出力 constint fan = PA8; //ファン出力
ここで、 setup() 内で、いくつかのメッセージを表示し、数秒後にそれらをクリアして、INPUTピンとPWM出力ピンを指定する必要があります。
lcd.begin(16,2); // LCDの準備をします lcd.clear(); // LCDをクリアします lcd.setCursor(0,0); //カーソルをrow0とcolumn0に設定します lcd.print( "CIRCUIT DIGEST"); //回路ダイジェストを表示し ますlcd.setCursor(0,1); //カーソルをcolumn0とrow1に設定します lcd.print( "PWM USING STM32"); // STM32 delay(2000); を使用してPWMを表示します。 //遅延時間lcd.clear(); // LCDをクリアします pinMode(analoginput、INPUT); //ピンモード analoginput をINPUTとして設定pinMode(led、PWM); //ピンモードLEDをPWM出力として設定pinMode(fan、PWM); //ピンモードファンをPWM出力として設定
アナログ入力ピン(PA4)は pinMode(analoginput、INPUT)でINPUTに 設定され 、 LEDピンは pinMode(led、PWM) でPWM出力に設定され、fanピンは pinMode(fan、PWM)で PWM出力に設定されます。ここで、PWM出力ピンはLED(PA9)とファン(PA8)に接続されています。
次に voidloop() 関数で、ADCピン(PA4)からアナログ信号を読み取り、以下のコードを使用してアナログ電圧をデジタル整数値( 0-4095 )に変換する整数変数に格納します 。intvalueadc= analogRead(analoginput );
ここで注意すべき重要なことは、STM32のチャネルであるPWMピンは16ビットの分解能(0-65535)であるため、以下のようなマップ機能を使用してアナログ値でマップする必要があります。
int result = map(valueadc、0、4095、0、65535)。
マッピングを使用しない場合、ポテンショメータを変更しても、ファンの全速力またはLEDの全輝度は得られません。
次に 、pwmWrite(led、result) を使用してPWM出力をLEDに書き込み、 pwmWrite(fan、result )関数 を使用してファンにPWM出力を 書き込み ます。
最後に、次のコマンドを使用して、アナログ入力値(ADC値)と出力値(PWM値)をLCDディスプレイに表示します。
lcd.setCursor(0,0); //カーソルをrow0とcolumn0に設定します lcd.print( "ADC value ="); //単語「」を出力します lcd.print(valueadc); // valueadcを表示しますlcd.setCursor (0,1); //カーソルをcolumn0とrow1に設定します lcd.print( "Output ="); // ""の単語を出力します lcd.print(result); //値の結果を表示します
デモビデオ付きの完全なコードを以下に示します。