この記事はネチズンが投稿した。
著者:陳明達
オリジナルタイトル:“シングルチップ入門”(4)アプリケーション層ソフトウェア開発のシングルチップ学習パス--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原文へのリンク:https//www.example.com
はじめに
皆さん、こんばんは、前回のブログでは、UARTシリアル通信とは何か、USBをTTLに使用してシングルチップチップチップがC#上位コンピュータとシリアル通信を行うことができるようにしました。次に、PWMの概念原理と実際のケースをもたらすために、モータ速度変調のためのPWMの使用は、このコースの最後は赤外線リモート制御スマートカーを行うことであるため、モータ4つ、駆動4つ、タイヤ4つが必要です。したがって、PWMは最終結果にとって非常に重要であり、実際の開発ではPWMはより一般的に使用される速度制御方法です。
コンセプトは
PWMフルネームパルス幅変調、パルス幅変調の中国語訳、その基本原理は、インバータ回路スイッチングデバイスのオンオフ制御であるため、出力端子は、正弦波または必要な波形を置き換えるためにこれらのパルスを使用して、一連の等しい振幅が均一ではないパルスを取得することです。すなわち,出力波形の半周期に複数のパルスを発生させ,各パルスの等値電圧を正弦波形にすることで,得られる出力は滑らかで低調波が少ない。各パルスの幅を一定のルールに従って変調することで、インバータ回路の出力電圧の大きさと出力周波数を変更することができます。
おそらく、上記の原理の説明はあまりにも公式で、誰もが理解していないかもしれませんが、理解しやすい、それは電子部品の回路のハイとローレベル制御を通じて、一定期間、出力のハイとローレベルが変動を形成し、この変動はPWM波形になることができ、PWM出力波形を制御するためにコードを使用する必要があります、変動のこの期間のハイレベル、電源投入時間、つまりハイレベル時間は合計時間を占めています。同時に、PWM波形のこの部分では、ハイとローの前後に切り替える周波数は何であるかは、2つの概念、デューティサイクル(Duty Ratio)と周波数を導入した波形を形成し、デューティサイクルは、ハイとローの合計時間と合計時間のデューティ比(この波形では、ハイとローの合計占有時間)を表し、周波数は、この波形の中でハイとローの前後に切り替える周波数です。
以下の図は、Arduinoシリアルプロッタの下にのこぎり波形を示しており、下のGIFを見ると、対応するモーターの動きも速いものから遅いものまでの動きを持っていることがわかります。

コードの解析
void setup() {
Serial.begin(9600);
ledcSetup(0, 5000, 8);
ledcAttachPin(12, 0);
}
// the loop function runs over and over again forever
void loop() {
for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {
ledcWrite(0, dutyCycle);
delay(7);
Serial.println(dutyCycle);
}
}
Arduinoでは、PWM制御を実現するためにLEDCを使用することができ、純粋なC Espressif開発ボードでは、MCPWMを制御することができますが、ArduinoはここでMCPWMを使用できないため、代替品としてLEDCがあり、ESP 32はEspressifのLED PWM制御、ESP 32 LED PWM、8つの高速チャネルと8つの低速チャネルに分かれています。次に、異なる周波数とデューティサイクルを使用して、モータ速度を制御する制御を達成します。
上記のコードでは、まずledcのチャネルを0、周波数を5000、8番目の低速LEDコントローラ、つまりコードをledcSetupに設定します。0ピン12と0番目のチャネルを関連付けると、ループコードでは、最大デューティサイクルが255であり、0 - 255の合計が256であることがわかります。これは、デューティサイクルがチャネルに関連しているためです。前述のように、LED PWMコントローラは合計16個あり、ここでは8を使用し、256は2の8乗の値です。したがって、デューティサイクルの最大値は256であり、値が10の場合、デューティサイクルの最大値は1024 - 1です。ledcwrite 0 dutyCycle;デューティサイクルを対応するチャネルに書き込むことで、PWMモータの速度調整設定が完了します。

ESP 32 Espressif PWMパッケージのArduinoは、LEDCが知られており、インストールする必要はなく、デフォルトで使用することができ、他のPWMパッケージのためのものもあり、個人的なテストは1つまたは2つあり、この良い使用はありません、フォローアップの友人も開発のための他の良いPWMライブラリを探索し続けることができます。
中断する。
PWMを話した後、割込みと割込みの実際のケースについて話します。割込みは、名前が示すように、プログラムの実行中に、イベントに遭遇したときに、手の作業を一時停止して何かを実行します。このことは、現在の作業を中断して、物事を実行することです。このアクションは、割込みと呼ばれます。コードでは、(純粋なCで)バックグラウンドタスクを登録することができますが、それでもパフォーマンスにMCUの効果を発揮することはできませんので、このシナリオでは、LEDをオンにする必要があるかどうかを判断するためにボタンを使用するなど、特定の機能を実現するために割り込みを使用する必要があります。
ArduinoではattachInterrupt関数を使ってピンに割込みを追加し、detachInterruptを使って割込みを削除できます。
attachInterrupt関数は3つの引数を取ります。1つ目は割込みピンピンピンピン、2つ目は割込みトリガ関数、3つ目は割込みタイプです。ESP 32割込みの場合、Arduinoではメソッド名の前にIRAM_ATTRが割込み関数であることをマークする必要があり、最初の関数のdigitalPinToInterruptは27と割込みをバインドするために使用されます。
以下のコードでは、ESP 32 27ピン割込みを処理するための変更関数を定義し、27ピンレベルでLEDピン2のレベルを制御し、LEDライトを点灯させるかどうかを制御し、最初にピン2を出力モードに設定し、27ピンをプルアップ入力モードに設定し、プルアップ抵抗が一般的にこのモードを使用する必要があることを理解することができ、ピン27を割込みに関連付けます。割込み関数をchange、モードをCHANGEに設定します。次に、LOOP関数ではピン2にstateの値を書き込みます。change割込み関数に入ると、stateを逆に取り、ループに入って値を書き込みます。これによりLEDの表示と非表示を制御することを実现し、ここで注意して、単一チコンチモードで、割り込み及びタイマーは非ブロッキングモードであり、.关数はブロッキングバッファに书き込み、割り込み关数が绝えない出力エラーを招き、エラー:u Meditation Error(Core1 panic 'ed(Intert wout on CPU1)。
これは、println関数がブロックされてタイマーの実行を続行できないためです。この関数を使用する必要がない場合は、中間変数を設定し、ループ関数で値を変更するかどうかを判断し、シリアルポートに情報を出力することができます。
下のGIFでは、ボタンを使用してLEDの表示と非表示を制御しています。
volatile byte state = LOW;
void IRAM_ATTR change()
{
state=!state;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(27, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(27), change, CHANGE);
}
void loop() {
digitalWrite(2, state);// put your main code here, to run repeatedly:
}
2番目の方法は割り込み番号を渡すことであることがわかりますが、上記の割り込み番号のESP 32は公式情報にはないので、ピンと割り込み関数の関連付けを行うための最初の方法だけが必要です。もちろん、最後のものも可能ですが、ここでは試していません。
modeでは、Arduinoは5つのモードをサポートしています。最初のものはLOWです。翻訳を見てください。これは、レベルがローレベルにあるときに割り込み関数をトリガします。
2つ目の変化は、ハイからロー、またはローからハイに関係なくトリガーされます。
3つ目は、ピンがすでにハイになっているのではなく、ローからハイになったときにトリガすることです。
4つ目は立ち下がりで、レベルがハイからローになると割り込み関数がトリガされます。
5つ目は、レベルが高いときに割り込み関数をトリガーすることです。


おわりにまとめ
今日はPWMと割り込みの使用について話しましたが、一度に少し話すことができますが、少し消化しにくいですが、何が時間内に私に尋ねることができます、そして私の更新の時間は少し遅くなります、あまりにも速く話すのを防ぐために、時間は理解できません、IIC、SPIのケース説明があります、これらの話の後、私は最も究極の目標を準備し始めます、インテリジェントな車を作り、アクセサリーが必要になります、これらの2日間、私はグループに送信するためにまとめます。リンクを購入する。興味のある学生はQQグループを追加し、一緒に勉強し、一緒に議論することができます、ブロガーはまた、MCU見習いを再生し始めたばかりであり、その後もSTM 32シリーズMCUを研究し、議論に参加することを歓迎します、勉強。
