- PWM信号の基本
- ハードウェアのセットアップと要件
- NuvotonN76E003マイクロコントローラーLED調光の回路図
- N76E003NuvotonマイクロコントローラーのPWMピン
- N76E003NuvotonマイクロコントローラのPWMレジスタと機能
- NuvotonN6E003マイクロコントローラーのPWM動作モード
- PWM用のNuvotonN76E003のプログラミング
- コードのフラッシュと出力のテスト
パルス幅変調(PWM)は、定義された周波数とデューティサイクルで連続パルス信号を生成するためにマイクロコントローラで一般的に使用される手法です。要するに、PWMは周波数が一定である間にパルスの幅を変えることです。
PWM信号は、主にサーボモーターまたはLEDの輝度を制御するために使用されます。また、マイクロコントローラーは出力ピンにロジック1(ハイ)またはロジック0(ロー)しか提供できないため、DACまたはデジタル-アナログコンバーターを使用しない限り、変動するアナログ電圧を提供することはできません。このような場合、マイクロコントローラは、さまざまなデューティサイクルでPWMを出力するようにプログラムでき、その後、さまざまなアナログ電圧に変換できます。以前は、他の多くのマイクロコントローラーでもPWMペリフェラルを使用していました。
- ARM7-LPC2148 PWMチュートリアル:LEDの明るさの制御
- MSP430G2を使用したパルス幅変調(PWM):LEDの明るさの制御
- MPLABおよびXC8を搭載したPICマイクロコントローラを使用したPWMの生成
- STM32F103C8のパルス幅変調(PWM):DCファンの速度の制御
- PICマイクロコントローラーのGPIOピンでPWM信号を生成する
- Raspberry PiPWMチュートリアル
- ESP32を使用したPWMチュートリアル
このチュートリアルでは、N76E003マイクロコントローラーユニットからのこのPWM信号を使用して制御されるLEDをインターフェースします。必要なハードウェアのセットアップの種類と、マイクロコントローラーをプログラムする方法を評価します。その前に、PWM信号のいくつかの基本を理解しましょう。
PWM信号の基本
以下の画像では、一定のPWM信号が示されています。
上の画像は、同じオン時間と同じオフ時間の一定の方形波に他なりません。信号の合計周期が1秒であると仮定します。したがって、オン時間とオフ時間は500msです。この信号の両端にLEDが接続されている場合、LEDは500ミリ秒間オンになり、500ミリ秒間オフになります。したがって、透視図では、オフタイムなしで直接5V信号にオンにすると、LEDは実際の明るさの半分で点灯します。
上の画像に示すように、デューティサイクルを変更すると、前述と同じ原理を使用して、LEDが実際の明るさの25%で点灯します。パルス幅変調(PWM)について詳しく知りたい場合は、リンクされた記事を確認してください。
ハードウェアのセットアップと要件
このプロジェクトの要件は、PWMを使用してLEDを制御することです。LEDはN76E003とインターフェースする必要があります。N76E003開発ボードにはLEDが搭載されているため、本プロジェクトで使用します。他のコンポーネントは必要ありません。
言うまでもなく、N76E003マイクロコントローラーベースの開発ボードとNu-Linkプログラマーが必要です。プログラマーを電源として使用しない場合は、追加の5V電源ユニットが必要になる場合があります。
NuvotonN76E003マイクロコントローラーLED調光の回路図
以下の回路図でわかるように、テストLEDは開発ボード内で利用可能であり、ポート1.4に接続されています。左端には、プログラミングインターフェイスの接続が示されています。
N76E003NuvotonマイクロコントローラーのPWMピン
N76E003には20個のピンがあり、そのうち10個のピンをPWMとして使用できます。以下の画像は、赤い四角のボックスで強調表示されているPWMピンを示しています。
ご覧のとおり、強調表示されているPWMピンは他の目的にも使用できます。ただし、ピンがPWM出力用に構成されている場合、ピンのこの他の目的は使用できません。PWM出力ピンとして使用されるピン1.4は、他の機能を失います。ただし、このプロジェクトには別の機能は必要ないため、これは問題ではありません。
1.4ピンを出力ピンとして選択した理由は、内蔵のテストLEDが開発ボードのそのピンに接続されているため、外部LEDが必要ないためです。ただし、このマイクロコントローラでは、20ピンのうち10ピンをPWM出力ピンとして使用でき、その他のPWMピンを出力関連の目的に使用できます。
N76E003NuvotonマイクロコントローラのPWMレジスタと機能
N76E003は、システムクロックまたはタイマー1オーバーフローをPWMクロックで割ったものを使用し、プリスケーラーは1 / 1〜1 / 128から選択できます。PWM周期は、16ビット周期レジスタPWMPHおよびPWMPLレジスタを使用して設定できます。
マイクロコントローラには、PG0、PG1、PG2、PG3、PG4、およびPG5と呼ばれる6つのPWM信号を生成する6つの個別のPWMレジスタがあります。ただし、各PWMチャネルは同じ16ビット周期カウンタを共有するため周期は同じですが、各PWMは{PWM0H、PWM0L}という名前の異なる16ビットデューティサイクルレジスタを使用するため、各PWMのデューティサイクルは他のチャネルとは異なる可能性があります。 、{PWM1H、PWM1L}、{PWM2H、PWM2L}、{PWM3H、PWM3L}、{PWM4H、PWM4L}、および{PWM5H、PWM5L}。したがって、N76E003では、6つのPWM出力を異なるデューティサイクルで独立して生成できます。
他のマイクロコントローラとは異なり、PWMを有効にしても、I / OピンがPWM出力に自動的に設定されることはありません。したがって、ユーザーはI / O出力モードを構成する必要があります。
したがって、アプリケーションに必要なものが何であれ、最初のステップは、PWM出力として1つまたは2つ、あるいは3つ以上のI / Oピンを決定または選択することです。いずれかを選択した後、PWM信号を生成するためにI / Oピンをプッシュプルモードまたは準双方向に設定する必要があります。これは、PxM1およびPxM2レジスタを使用して選択できます。これらの2つのレジスタは、xがポート番号を表すI / Oモードを設定します(たとえば、ポートP1.0の場合、レジスタはP1M1とP1M2になり、P3.0の場合はP3M1とP3M2になります)。
構成は下の画像で見ることができます-
次に、次のステップは、その特定のI / OピンでPWMを有効にすることです。これを行うには、ユーザーはPIOCON0またはPIOCON1レジスタを設定する必要があります。PIOCON0とPIOCON1はPWM信号に応じて異なるピンを制御するため、レジスタはピンマッピングに依存します。これらの2つのレジスタの構成は、以下の画像で確認できます。
ご覧のとおり、上記のレジスタは6つの構成を制御します。残りは、PIOCON1レジスタを使用してください。
したがって、上記のレジスタは残りの4つの構成を制御します。
NuvotonN6E003マイクロコントローラーのPWM動作モード
次のステップは、PWM動作モードを選択することです。各PWMは、独立、同期、およびデッドタイムイネーブルモードの3つの動作モードをサポートします。
独立モードは、6つのPWM信号を独立して生成できるソリューションを提供します。これは、LED関連の操作またはブザーをオンにして制御する必要がある最大回数必要です。
同期モードのセットPG1同じで相PWM出力の/ 3/5、PG0 / 2/4は、独立したPWM出力信号を提供PG0 / 2/4、同じ。これは主に三相モーターの制御に必要です。
デッドタイム挿入モードは少し複雑で、特に産業用アプリケーションでは、実際のモータ用途に適用されます。このようなアプリケーションでは、相補PWM出力は、GPIBなどのパワースイッチングデバイスの損傷を防ぐ「デッドタイム」挿入である必要があります。構成は、PG0 / 2/4が独立モードと同じ方法でPWM出力信号を提供するようにこのモードで設定されますが、PG1 / 3/5はそれに応じてPG0 / 2/4の「逆相PWM信号」出力を提供します。 PG1 / 3/5デューティレジスタは無視してください。
上記の3つのモードは、以下のレジスタ構成を使用して選択できます-
次の構成は、PWMCON1レジスタを使用したPWMタイプの選択です。
したがって、ご覧のとおり、上記のレジスタを使用して選択できる2つのPWMタイプが利用可能です。エッジアラインでは、16ビットカウンタは0000Hから{PWMPH、PWMPL}の設定値までカウントアップし、0000Hから開始するシングルスロープ動作を使用します。出力波形は左端に揃えられています。
ただし、中央揃えモードでは、16ビットカウンタは0000Hから{PWMPH、PWMPL}までカウントアップしてデュアルスロープ動作を使用し、次にカウントダウンして{PWMPH、PWMPL}から0000Hに戻ります。出力は中央揃えであり、重複しない波形を生成するのに役立ちます。最後に、以下のレジスタでチェックできるPWM制御操作-
クロックソースを設定するには、CKCONクロック制御レジスタを使用します。
PWM出力信号は、PMENレジスタを使用してマスクすることもできます。このレジスタを使用して、ユーザーは出力信号を0または1でマスクできます。
次はPWM制御レジスタです-
上記のレジスタは、PWMの実行、新しい周期とデューティ負荷のロード、PWMフラグの制御、およびPWMカウンタのクリアに役立ちます。
関連するビット構成を以下に示します-
クロック分周器を設定するには、PWMクロック分周器にPWMCON1レジスタを使用します。5番目のビットは、グループモード対応のグループ化されたPWMに使用され、最初の3つのPWMペアに同じデューティサイクルを提供します。
PWM用のNuvotonN76E003のプログラミング
コーディングは単純で、このチュートリアルで使用される完全なコードはこのページの下部にあります。LEDはP1.4ピンに接続されています。したがって、P1.4ピンをPWM出力に使用する必要があります。
メインプログラムでは、設定はそれぞれの順序で行われます。以下のコード行はPWMを設定し、P1.4ピンをPWM出力として構成します。
P14_PushPull_Mode;
これは、ピンP1.4をプッシュプルモードに設定するために使用されます。これは、 Function_define.h ライブラリで次のように定義されています-
#define P14_PushPull_Mode P1M1&= 〜SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
ピンP1.4でPWMを有効にするために使用される次のライン。これは、 Function_define.h ライブラリでも次のように定義されています-
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS&= 0xFE; EA = BIT_TMP //P1.4 as PWM1出力は PWM_IMDEPENDENT_MODEを 有効にし ます。
以下のコードは、PWMを独立モードに設定するために使用されます。で Function_define.hの ライブラリー、それが定義されたまま
#define PWM_IMDEPENDENT_MODE PWMCON1&= 0x3F PWM_EDGE_TYPE;
次に、EDGEタイプのPWM出力を設定する必要があります。で Function_define.hの ライブラリー、それが定義されたまま
#define PWM_EDGE_TYPE PWMCON1&= 〜SET_BIT4 set_CLRPWM;
次に、 SFR_Macro.h ライブラリで利用可能なPWMカウンター値をクリアする必要があります-
#define set_CLRPWM CLRPWM = 1
その後、PWMクロックがFsysクロックとして選択され、使用される分周係数は64分周です。
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
両方とも次のように定義されます-
#define PWM_CLOCK_FSYS CKCON&= 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1&= 0xFE PWM_OUTPUT_ALL_NORMAL;
以下のコード行は、出力PWM信号を0でマスクするために使用されます。
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period(1023);
次に、PWM信号の周期時間を設定する必要があります。この関数は、PWMPLおよびPWMPHレジスタに周期を設定します。これは16ビットレジスタであるため、この関数はビットシフト方式を使用してPWM周期を設定します。
void set_PWM_period(unsigned int value){ PWMPL =(value&0x00FF); PWMPH =((値&0xFF00)>> 8); }
ただし、1023ビットと8ビットの期間以外に、ユーザーは他の値を使用することもできます。期間を長くすると、スムーズな調光またはフェードが発生します。
set_PWMRUN;
これにより、 SFR_Macro.h ライブラリで定義されているPWMが開始されます-
#define set_PWMRUN PWMRUN = 1
次に、 whileループ で、LEDがオンになり、継続的にフェードします。
while(1){ for(value = 0; value <1024; value + = 10){ set_PWM1(value); Timer1_Delay10ms(3); } for(value = 1023; value> 0; value- = 10){ set_PWM1(value); Timer1_Delay10ms(2); } } }
デューティサイクルは、PWM1LおよびPWM1Hレジスタのデューティサイクルを設定する関数である set_PWM1(); によって設定されます。
void set_PWM1(unsigned int value){ PWM1L =(value&0x00FF); PWM1H =((値&0xFF00)>> 8); set_LOAD; }
コードのフラッシュと出力のテスト
コードの準備ができたら、コードをコンパイルしてコントローラーにアップロードするだけです。環境に不慣れな場合は、NuvotonN76E003チュートリアルの開始を確認して基本を学習してください。以下の結果からわかるように、コードは0警告と0エラーを返し、Keilによるデフォルトのフラッシュ方法を使用してフラッシュしました。アプリケーションが動作を開始します。
再構築が開始されました:プロジェクト:PWM 再構築ターゲット 'ターゲット1' アセンブルSTARTUP.A51… コンパイルmain.c… コンパイルDelay.c… リンク… プログラムサイズ:data = 35.1 xdata = 0 code = 709 作成"。\ Objects \ pwm"… "。\ Objects \ pwm" からの16進ファイル -0エラー、0警告。 経過時間:00:00:05
ハードウェアは電源に接続されており、期待どおりに機能していました。これは、オンボードLEDの輝度が減少してから増加し、PWMデューティサイクルの変化を示します。
このチュートリアルの完全な動作は、以下にリンクされているビデオにもあります。チュートリアルを楽しんで、質問がある場合に役立つことを学んだことを願っています。コメントセクションに残しておくか、フォーラムを使用して他の技術的な質問をすることができます。