PWM:Arduinoボードでアナログピンをエミュレートする

PWM信号

Arduinoボードで使用できるデジタルピンとアナログピンを使用すると、電気信号を送受信して、電子プロジェクトからデータを制御または取得できます。 さらに、このタイプのプレートには他にも非常に興味深い信号があり、それらは PWM、 実際にアナログでなくてもアナログ信号をエミュレートできます。 つまり、これらはアナログ信号と同じように(同じではなく)動作できるデジタルピンです。

これらのタイプの信号は、デジタルのHIGHおよびLOW信号、つまり1または0、ONおよびOFFを使用するだけでなく、さらに進んで説明したい場合に非常に実用的です。 やや複雑な信号。 たとえば、の速度を調整することが可能です モーターDC、またはライトの光強度、ソレノイドなどの場合。

アナログvsデジタルシステム

アナログ信号とデジタル信号

電子回路は、XNUMXつの大きなファミリまたはカテゴリに分けることができます。 デジタルとアナログ。 デジタル電子機器について話すとき、私たちは離散値を持つ量、つまり、処理されるビットの状態を解釈するために低電圧または高電圧の電気信号によって表されるバイナリシステムを使用しています。 一方、アナログ回路に関しては、連続値の量が使用されています。

デジタルシステム内で順番に見つけることができます 組み合わせタイプのものと順次タイプのもの。 つまり、前者は、システムの出力が入力の状態にのみ依存するものです。 一方、シーケンシャル要素にはメモリ要素が含まれており、出力は入力の現在の状態と保存されている以前の状態に依存します。

アナログの場合、これらのXNUMXつの大きなグループまたはバリアントはありません。これは、これらが常に依存する連続信号であるためです。 信号 現在のシステム。 たとえば、スピーカーでは、スピーカーに供給される信号は、再生するサウンドによって異なります。 マイクも同様で、受信する音に応じてアナログ信号を生成します。 確かに、このブログで説明し、アナログ信号で動作する他の多くのセンサーでも見たことがあります(したがって、後でArduino IDEスケッチで値を計算または調整できるように、数式を作成する必要がありました)..。

一方と他方のこれらの特性により、一部には独自の特性があります 長所と短所、ほとんどすべてでいつものように。 たとえば、デジタルのものは通常、安価で、高速で、開発が容易であり、情報をより簡単に保存でき、精度が高く、プログラムでき、ノイズの影響を受けにくいなどです。 しかし、アナログを使用すると、より複雑な信号で操作できることも事実です。

POR ejemplo、デジタルタイプのホール効果センサーは、近くの磁場の有無のみを検出できます。 代わりに、アナログホール効果センサーはそれを行うことができ、出力で生成するアナログ信号のおかげで、前述の磁場の密度を決定することもできます。 大なり小なりの電圧の信号をうまく解釈する方法を知っていれば、その大きさを簡単に知ることができます。 温度、時間、圧力、距離、音など、アナログシステムで定量的に測定できるさまざまな自然の例が他にもあります。

アナログ信号とデジタル信号

そうは言っても、 アナログ信号 それは、時間とともに連続的に変化する電圧または電流になります。 グラフ化すると、アナログ信号は単一周波数の正弦波になります。

として デジタル信号は、時間に対して段階的に変化する電圧です。 つまり、グラフで表される場合、連続的に変化するのではなく、ステップまたは離散的な増分で変化するステップ信号になります。

アナログ信号からデジタル信号に、またはその逆に移行する回路があることを知っておく必要があります。 これら コンバーター それらはDAC(デジタル-アナログコンバーター)およびADC(アナログ-デジタルコンバーター)として知られています。 そして、それらは、テレビやコンピューターなど、今日私たちが使用している多くのデバイスで非常に一般的です。 これらを使用すると、これらの機器で使用されるデジタル信号を電子レベルに変換して、アナログで動作する他の周辺機器や部品と連携することができます。

POR ejemplo、サウンドカードで動作するアナログ信号を備えたスピーカーまたはマイク、またはアナログモニターポート用の有名なRAMDACチップを備えたデジタルグラフィックスカード... Arduinoでは、このタイプのコンバーターは、後で説明するように、複数のプロジェクトにも使用されます。 ..。。

PWMとは何ですか?

グラフィックデューティサイクル

しかし PWM(パルス幅変調)、またはパルス幅変調、 デジタルベースを備えており、その信号の形状はやや「正方形」のアナログ信号に似ています。 これにより、デジタルパルスを使用して信号を変化させ、以前にコメントしたようにアナログシステムをエミュレートできます。 実際、名前を見ると、デジタルパルスの幅を通して、それが何をしているのかについての手がかりがすでに得られています。

これは Arduinoの プロジェクトに追加できる自動化機能や電子コンポーネントがたくさんあるので、 真のアナログ信号を提供することはできません、しかし、彼らはこのPWMを使用して動作します。 また、離散化されたアナログ信号を使用することもできません。つまり、電圧ジャンプを行ってデジタル信号に似せることはできません。 彼らができることは、デジタル出力-VccまたはデジタルタイプのVccを使用して、この独特の信号を生成することです...

したがって、PWMは、Arduinoや他のシステムがこのタイプの信号と相互運用できる一種の「トリック」です。 それらは完全にアナログではなく、従来のデジタルでもありません。 それを可能にするために、彼らは常に関心に応じて、特定の時間またはオフの間デジタル出力をアクティブに保ちます。 これは、パルスの幅が同じであるデジタル時計やバイナリコード信号とはかけ離れています。

Arduinoを使用したプロジェクトでは、パルストリガーの一定周波数が時間の経過とともに維持されるこのタイプのPWM信号を確認できますが、 これらのパルスの幅は変化します。 実際、サイクル全体に対して信号がハイに保たれている場合、これはデューティサイクルと呼ばれます。 したがって、デューティサイクルは%で表されます。

PWMでは、いくつかの電圧値の間でアナログ信号のように機能せず、それらの間で変動することを忘れないでください。 PWMの場合、それはデジタルスタイルの方形信号であり、 その最大値はVccです。 たとえば、3V電源を使用する場合、3Vまたは0Vのパルスを与えることはできますが、実際のアナログで発生する1Vまたはその他の中間値を与えることはできません。 その場合に変化するのはパルスの幅であり、その高いVcc値で30%を維持したり、より多くの電力を与えるために60%を維持したりすることができます。

ただし、デバイスがVcc制限をサポートし、PWMで超過すると、デバイスが損傷する可能性があるため、注意してください。 したがって、メーカーから提供されたデータシートの値を常に尊重する必要があります。 また、DCモーターなどの一部のデバイスでは、 リレー、電磁石など、デューティサイクル後の電圧低下は、誘導性負荷が損傷を引き起こす可能性があることを意味する場合があります。 だからこそ 保護 タイムリーな。

ArduinoのPWM

ArduinoI2Cバス

それがどのように機能するかがわかったので、Arduinoの世界でのPWMの特定のケースを見てみましょう...

PWM:Arduinoのピン配置

Arduinoボードには、ハードウェアPWMを実装するいくつかのピンがあります。 それらはPCB自体で識別できます。 シンボル〜(小さな頭) ピン番号と一緒に。 Arduinoコードのソフトウェアで実行することもできますが、マイクロコントローラーに過負荷がかかり、ネイティブでハードウェアで実行できる場合は不条理です...

  • Arduino UNO、ミニおよびナノ-ピン6、8、3、5、6、および9に10つの11ビットPWM出力があり、番号の直前に〜があります。
  • Arduinoメガ-この最も強力なArduinoボードには、15個の8ビットPWM出力があります。 それらはピン2から13および44から46にあります。
  • Arduino の期限:この場合、13個の8ビットPWM出力があります。 それらはピン2から13に加えて、12ビット分解能でDACによって離散化された他のXNUMXつのアナログ出力にあります。

このタイプのPWM出力で8ビットまたは12ビットの分解能などについて話すとき、あなたはあなたが持っている操縦の余地を指します。 と 8ビットには256レベルがあります その間で変化させることができ、12ビットは最大4096レベルになります。

タイマーによる制御

ハードウェアPWM制御の場合、Arduino タイマーを使用します それのための。 現在の各タイマーは、2つまたは3つのPWM出力を提供できます。 各出力の比較レジスタはこのシステムを補完するため、時間がレジスタの値に達すると、出力の状態または値が変更されて、これらのデューティサイクルが停止します。 同じタイマーによって制御されるXNUMXつの出力がありますが、同じ周波数を共有していても、両方のデューティサイクルが異なる場合があります。

各PWMピンに関連付けられたタイマーの場合、それは変化します Arduinoボードの種類によって異なります あなたが持っていること:

  • Arduino UNO、ミニおよびナノ:
    • タイマー0-5および6
    • タイマー1-9および10
    • タイマー2-3および11
  • Arduinoメガ:
    • タイマー0-4および13
    • タイマー1-11および12
    • タイマー2-9および10
    • タイマー3-2、3、5
    • タイマー4-6、7、8
    • タイマー5-44、45、46

事前にスケーリングされたレジスタは時間を整数で除算し、残りはタイマーが関連する各PWM出力を制御するために実行します。 レジストリ値を変更すると、頻度が変わる可能性があります。 ザ・ 頻度 また、タイマーとプレートによっても異なります。

  • Arduino UNO、ミニおよびナノ:
    • Timer0:1、8、64、256、および1024のプリスケーリングを許可します。周波数は62.5Khzです。
    • Timer1:1、8、64、256、および1024のプリセットを使用。周波数は31.25Khz。
    • Timer2:Timer1と同じですが、前のスケーリングに加えて32と128のプリスケーリングが追加されます。
  • Arduinoメガ:
    • Timer0、1、2:上記と同じ。
    • Timer3、4、および5:周波数は31.25 Khzで、1、8、64、256、および1024に事前スケーリングされています。

非互換性と競合

タイマー 出力に関連付けられているのは、その機能だけではありません、他の人にも使用されています。 したがって、それらが別の機能によって使用されている場合は、どちらかを選択する必要があります。両方を同時に使用することはできません。 たとえば、これらはプロジェクトに見られる非互換性の一部です。

  • サーボライブラリ:サーボモータを使用する場合、タイマーを多用するため、競合が発生する可能性があります。 具体的には、UNO、Nano、MiniにTimer1を使用します。つまり、そのライブラリでスケッチを使用している間は、ピン9と10を使用できません。 メガでは、サーボの数に依存します...
  • SPI:ArduinoボードでSPI通信が使用されている場合、ピン11はMOSI機能に使用されています。 そのため、そのPWMピンは使用できません。
  • Тон:この関数はTimer2を使用して動作します。 したがって、これを使用すると、ピン3と11(またはMegaの場合は9と10)が役に立たなくなります。

Arduinoでのハンズオンテスト

LED付きArduinoPWM回路図

ArduinoでPWMがどのように機能するかをインプレースで確認したい場合、できる最善のことは、の測定リードを接続することです。 電圧計またはマルチメータ (電圧を測定する機能で)使用することを選択したPWMピンとArduinoボードのグランドピンまたはGNDの間。 このように、測定デバイスの画面で、このPWMトリックのおかげでデジタルの出力で電圧がどのように変化しているかを確認できます。

電圧計/マルチメーターをLEDに置き換えて、光の強度がどのように変化するかを確認したり、DCモーターを使用したり、その他の必要な要素を使用したりできます。 図では、LEDを使用したフリッツをこれ以上使用せずに簡略化していますが、マルチメータの先端を表すこともできます...

LEDを使用する場合は、カソードとGNDの抵抗を覚えておいてください。

ソースコード Arduinoボードマイクロコントローラーを制御してすべてを機能させるには、これをArduino IDEに挿入する必要があります(この場合、私はのPWMピン6を使用しました Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
値を試してみることをお勧めします 光または電圧計の結果。 プログラムは0から9までの値を受け取ることができるので、すべてがどのように変化するかを確認できます。 詳細については、私はあなたにアドバイスします arduinoコース 私たちが無料でダウンロードしていること..。

コメント、あなたのコメントを残してください

コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   ホセ

    ごきげんよう。 まずは、この最新の説明に時間を割いていただき、ありがとうございました。
    質問をさせていただきます。 ArguinoMega用のproteus8エミュレーターでコードを実行しようとしています。 電圧計をピン6に接続し、Proteusをシリアルポートに接続しましたが、異なる電圧が出力されるようにどのように、または何を変更するかがわかりません。 コードをコンパイルするには、コードを少し調整する必要がありました。 手伝ってくれてありがとうございます