STM32勉強日記(2023/3/5):トリガカウント,DA_DMA
STM32マイコンで
トリガカウントについて確認する。
→トリガカウント(TP1FP1)を使用する場合、外部からクロック信号を入れる必要がある。
nucleof401を外部クロックで使用する場合下記及び水晶振動子などクロックを生成するものを別途用意する必要がある。
PF0/PD0/PH0及びPF1/PD1/PH1をGPIO又は、外部クロックとして使用する場合。
SB55をON
SB50をOFF
R35、R37を外す。
今回は、一旦保留とする。
nucleo f401
DA変換
参考:https://www.computex.co.jp/article/use_stm32f_3.htm
https://umuoumu.blog.fc2.com/blog-entry-48.html
ADCについて
下記リファレンス参照
https://www.st.com/resource/en/user_manual/dm00105879-description-of-stm32f4-hal-and-ll-drivers-stmicroelectronics.pdf
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
は、STM32F401には存在しない。
使用ピン:
PA4(A2)
PB0(A3)
uDMA(マイクロDMA)は、STM32マイコンのDMA(Direct Memory Access)機能の一種で、
低レイテンシで高速なデータ転送を実現するために使用されます。uDMAは、CPUの負荷を減らし、メモリアクセスを高速化することができます。
uDMAは、ソフトウェアによってプログラムされ、DMA転送をトリガーするためにハードウェアイベントを使用します。uDMAは、メモリ間、ペリフェラル間、およびメモリとペリフェラル間でデータを転送することができます。
uDMAは、STM32マイコンの一部のシリーズで使用可能であり、設定と制御は、DMAの他のモードと同様に、DMAコントローラーレジスタの設定を通じて行います。uDMAは、バーストモードでのデータ転送に特に適しており、より高速なメモリアクセスが可能です。
uDMAの使用により、高速なデータ転送を実現し、処理の効率を向上させることができます。しかし、正しく設定されない場合、データの整合性が損なわれ、システムの安定性に影響を与えることがあります。そのため、uDMAを使用する場合は、適切な設定を行い、データの整合性を確保する必要があります。
CubeIDEのADC1のNumber of Vonversion
CubeIDEのADC1のNumber of Conversionとは、ADC変換を行うチャネルの数を設定する項目です。つまり、一度のADC変換処理で変換するチャネルの数を指定することができます。
この項目には、1から16の値を設定することができます。値を1に設定する場合、ADC変換処理が1つのチャネルのみを変換することになります。値を16に設定する場合、ADC変換処理が16のチャネルを連続して変換することになります。
Number of Conversionを設定する際には、変換するチャネル数に応じて変換時間が増加することを考慮する必要があります。また、変換時間が長い場合には、変換結果を取得するタイミングや処理のタイミングを調整することも必要です。
External Trigger Conversion Source
ADC変換を開始するトリガーソースを選択する設定項目です。
この設定は、外部からのトリガーによってADC変換を開始する必要がある場合に使用されます。
例えば、外部のタイマーからトリガーを送信し、そのタイミングでADC変換を開始することができます。
External Trigger Vonversion Sourceには、以下のオプションがあります。
TIM1_CC1: TIM1のキャプチャコンペア1(TRIG)をトリガーソースとして使用します。
TIM1_CC2: TIM1のキャプチャコンペア2をトリガーソースとして使用します。
TIM1_CC3: TIM1のキャプチャコンペア3をトリガーソースとして使用します。
TIM2_CC2: TIM2のキャプチャコンペア2をトリガーソースとして使用します。
TIM3_TRGO: TIM3のトリガーアウトプットをトリガーソースとして使用します。
TIM4_TRGO: TIM4のトリガーアウトプットをトリガーソースとして使用します。
EXTI11: 外部割り込みライン11をトリガーソースとして使用します。
SOFTWARE: ソフトウェアトリガーをトリガーソースとして使用します。
これらのオプションから、外部からのトリガーを受け取るピンや、内部タイマーからのトリガーを選択することができます。
TIM1のキャプチャコンペア1について
TIM1は、STM32マイクロコントローラのタイマー/カウンターの1つであり、キャプチャ/コンペア機能を備えています。キャプチャ/コンペア機能は、外部イベントを検出したり、PWM信号を生成したりするために使用されます。
TIM1のキャプチャコンペア1は、タイマーのカウンター値が指定された値に達したときに外部イベントを生成するための機能です。この外部イベントをトリガーとして、他のタイマー/カウンターの動作を制御することができます。また、キャプチャ/コンペア機能を使用して、外部からのパルスを計測することもできます。
具体的には、TIM1のキャプチャコンペア1は、TIM1のCCR1レジスタに設定された値とタイマーのカウンター値が一致したときに、外部トリガーを生成します。この外部トリガーを使用することで、他のタイマー/カウンターの動作を制御することができます。また、外部からのパルスを計測する場合には、キャプチャ機能を使用して、パルスの立ち上がり/立ち下がりエッジを検出し、タイマーのカウンター値を読み取ることができます。
ADC_Regular_ConversionModeのRankについて
STM32マイコンのADC (Analog to Digital Converter) モジュールでは、複数のアナログ入力チャンネルの定期的な変換が可能です。ADC Regular Conversion のRankとは、変換するチャンネルの順序を指定するためのパラメータです。
Rank 1 から始まり、複数のRankを設定することができます。設定した順序に従って、ADCが変換を行います。
たとえば、Rank 1に ADC_IN0、Rank 2に ADC_IN1、Rank 3に ADC_IN2を設定すると、ADCは定期的にADC_IN0からADC_IN2の順に変換を行います。
Rankを設定するには、CubeIDEのMXコンフィギュレーターでADC Regular Conversionを選択し、"Rank"パラメータで変換順序を設定します。また、変換するチャンネル数に合わせて、"Number of Conversion"パラメータを設定する必要があります。
https://gyazo.com/496b61b3312fa64b1e026a9459751727
ADC Regular ConversionのSampling Time(サンプリング時間)は、
アナログ入力ピンからアナログ信号を取り込む時間の長さを設定します。
この時間は、アナログ信号がキャプチャされ、デジタル値に変換されるための時間です。
STM32のADCは、サンプリング時間を1.5サイクルから239.5サイクルの範囲で設定できます。
サンプリング時間が長いほど、より正確な変換結果を得ることができますが、変換速度が低下します。
一方、サンプリング時間が短い場合、変換速度が向上しますが、精度が低下する可能性があります。
ADC Regular ConversionのSampling Timeは、CubeIDEなどの開発環境で設定できます。
通常、アプリケーションの要件に合わせて、最適なサンプリング時間を設定します。
ADC Injected Conversionについて
ADC(Analog-to-Digital Converter)は、アナログ信号をデジタル信号に変換するためのデバイスで、様々な種類があります。ADC Regular ConversionとADC Injected Conversionは、それぞれ異なる変換モードを持っています。
ADC Regular Conversionは、ADCが連続的に入力信号をサンプリングし、デジタル信号に変換する方法です。
この変換モードでは、一般的に1つのアナログチャネルに対して1回の変換が行われます。
つまり、変換を完了するまでに複数のサンプルが必要な場合でも、同じチャネルで実行する必要があります。
一方、ADC Injected Conversionは、ADCが複数のアナログチャネルから1回の変換を行う方法です。
この変換モードでは、ADCによって定義された複数のチャネルが、同時にまたは順次変換されます。
この変換モードでは、チャネルごとに変換結果を取得できます。
例えば、電子秤などで使用される場合、ADC Injected Conversionを使用すると、複数のセンサーからの信号を同時に変換できます。これにより、処理速度が向上し、システムの全体的な精度が向上します。
ADC分解能:12bit = 4096
https://www.st.com/resource/en/datasheet/stm32f401re.pdf
参考:https://rt-net.jp/mobility/archives/19153
table:CubeIDEのADC設定
項目 内容
Independent mode
ADC_Setting
Clock Prescaler
Resolution
Data Alignment
Scan Conversion Mode
Continuous Conversion Mode
Discontinuous Conversion Mode
DMA Continuous Requests
End Of Conversion Selection
ADC_Regular_ConversionMode
Number Of Conversion
External Trigger Conversion Source
External Trigger Conversion Edge
Rank
Channel
Sampling Time
ADC_Injected_ConversionMode
Number Of Conversions
WatchDog
Enable Analog WatchDog Mode
table:ADC設定項目について
項目 説明
Clock Prescaler ADCのクロック周波数を設定する
PCLK2 divided by 2/4/6/8 PCLK2を2/4/6/8で分割する。
Resolution 変換結果のビット幅を設定する
12bits/10bit/8bit/6bit ADCの変換分解能を設定。下記に詳細を示す。
Data Alignment 変換結果のアラインメント方法を設定する
Right alignment 右寄せ
Left alignment 左寄せ
Scan Conversion Mode 複数チャンネルをスキャン変換するかどうかを設定する
Enable 設定を有効にする。
Disable 設定を無効にする。
Continuous Conversion Mode 変換を継続的に行うかどうかを設定する
Enable 設定を有効にする。
Disable 設定を無効にする。
Discontinuous Conversion Mode 途中で変換を一時停止するかどうかを設定する
Enable 設定を有効にする。
Disable 設定を無効にする。
DMA Continuous Requests 変換終了時にDMAを継続的にリクエストするかどうかを設定する。
Enable 設定を有効にする。
Disable 設定を無効にする。
End Of Conversion Selection 変換終了時のシーケンスを選択する
EOC flag at the end of single channel vonversion 単一チャンネル変換後にEOCフラグを立てる
EOS flag at the end of all conversions すべてのチャンネル変換後にEOSフラグを立てる
ADC_Regular_ConversionMode 通常変換モードの設定をする
Number Of Conversion 変換するチャンネル数を設定する
External Trigger Conversion Source トリガソースを設定する
Regular Conversion launched by software ソフトウェアプログラムによってADC変換を開始するトリガソース
Timer 1 Capture Compare 1event タイマー1(TIMER1)が特定の値に達した時、ADC変換を開始するトリガーソース
Timer 1 Capture Compare 2event タイマー1(TIMER1)が特定の値に達した時、ADC変換を開始するトリガーソース
・・・
External Trigger Conversion Edge トリガのエッジを設定する
Trigger detection on the rising edge トリガの立ち上がりエッジ検出時に、ADCを開始する。
Trigger detection on the falilin edge トリガの立下りエッジ検出時に、ADCを開始する。
Trigger detection on both the rising and fallin. トリガの立ち上がり、立下り両方検出時に、ADCを開始する。
Rank 変換するチャンネルの順序を設定する
Channel 変換するチャンネルを選択する。
Sampling Time サンプリング時間を設定する。:3,15,28,56,84,112,144,480
ADC_Injected_ConversionMode インジェクション変換モードの設定をする
Number Of Conversions インジェクション変換するチャンネル数を設定する
External Trigger Source トリガソースを設定する
External Trigger Edge トリガのエッジを設定する
Injected Conversion Mode インジェクション変換モードの設定
Discontinous Mode 複数変換時、1つの変換が完了する度にADC変換を停止、変換間の時間を空ける。
Auto Injected Mode 自動的に切り替え、複数のインジェクションチャンネルで変換を行う
WatchDog アナログウォッチドッグモードを有効にするかどうかを設定する
Enable Analog WatchDog Mode アナログウィッチモードを有効にする。
Resolution
12bits(15 ADC Clock cycles)
ADCを12bitで変換。12bitの変換結果を得るために15クロックサイクル必要
STM32F103のADC_DMA(AD変換時間計算)
Data Alignment
データアライメントとは、コンピュータのメモリ内でデータを格納する際に、
どのようにアドレスを割り当てるかを決定する方法です。
右寄せ又は左寄せの設定を行います。
アライメントとは
メモリやストレージなどの記憶装置にデータを書き込む際、書き込むデータの大きさや先頭の位置(アドレス)を、装置の管理単位の整数倍になるように調節することをアライメントという。
ータの先頭アドレスがどのバイト境界に合わせられるかを示します。
例えば、32ビットの整数を4バイト単位でアライメントする場合、
先頭アドレスは4の倍数になるように割り当てられます。
ADCでのデータアライメントは、変換結果のビット幅が12ビットの場合、
右寄せまたは左寄せの方法で行われます。
右寄せの場合、変換結果は下位ビットから順にメモリに格納されます。
左寄せの場合、変換結果は上位ビットから順にメモリに格納されます。
データアライメントの設定は、
データを処理する際にどのようにアクセスするかに影響を与えるため、正しく設定することが重要です。
8ビットの符号なし整数データを変換する場合、変換後のデータの桁数も8ビットになるため、Data Alignmentはそのままで構いません。しかし、16ビットの符号付き整数データを変換する場合、変換後のデータの桁数が16ビットになるため、Data Alignmentを設定する必要があります。
EOC flag at the end of single channel vonversion
シングルチャンネル変換が完了したときに、ADCがフラグをセットすることを意味します。
このフラグは、変換結果が読み取り可能であることを示します。
このフラグがセットされたら、結果を読み取ることができます。
一方、「EOC flag at the end of all channel conversion」は、
複数チャネル変換で使用されるAD変換モジュールのフラグの1つです。
これは、すべてのアナログ入力ピンの変換が完了したことを示します。
つまり、複数チャネル変換ですべてのアナログ入力ピンの変換が完了した後に、このフラグがセットされます。
これらのフラグを使用することで、マイコンは変換が完了するまで待機し、変換データを読み取ることができます。これにより、正確で信頼性の高いAD変換が可能になります。
Regular Conversion launched by software
マイコン内のソフトウェアプログラムによってトリガーされるADCの変換モードのことです。
つまり、ソフトウェアプログラムがADC変換を開始するためにトリガー信号を送信します。
このトリガー信号が送信されることで、ADCが変換を開始し、変換結果をレジスタに格納します。
このモードは、タイマー等の外部トリガーソースを使用しない場合に選択されます。
Regular Conversion launched by softwareを使用する場合、
ADCを起動するためにHAL_ADC_Start()関数を使用します。
この関数は、ADCコンバータを開始し、指定したチャンネルで変換を開始します。
また、変換結果が利用可能になると、HAL_ADC_PollForConversion()関数またはHAL_ADC_Start_IT()関数を使用して結果を取得することができます。
最後に、HAL_ADC_Stop()関数を使用してADCを停止する必要があります。
※DMAで使用する場合は、HAL_ADC_Start()ではなく、HAL_ADC_Start_DMAを使用する。
DMAを使用して変換を開始し、変換が完了するとDMA割り込みを発生させます。
Timer 1 Capture Compare 1event 
タイマー1(TIMER1)が特定の値に達したときにADC変換を開始するトリガーソースの1つです。
TIMER1は、マイクロコントローラ内のタイマー/カウンターの1つであり、Capture/Compare機能を備えています。
この機能により、タイマーが特定の値に達すると、
タイマー1のCapture Compareレジスタ1(CCR1)で定義されたイベントが発生します。
このイベントは、ADC変換をトリガーするのに使用できます。
具体的には、CCR1レジスタに設定された値と一致すると、
タイマー1 Capture Compare 1eventが発生し、ADC変換が開始されます。
1eventは、タイマー1のキャプチャ/コンペアユニットのCCR1が一定の値に達したときに発生するイベントを指します。
2eventは、CCR2が一定の値に達したときに発生するイベントを指します。
Sampling Time
ADCのSampling Time(サンプリング時間)は、アナログ信号をデジタル信号に変換するためのADCの変換時間を指します。Sampling Timeは、アナログ信号の周波数、信号の信号レベル、外部ファクター(電圧のレベル、外部負荷、キャパシタンスなど)などによって決まります。
通常、ADCの仕様書には、ADCのクロック周波数とSampling Timeの最大値が示されています。
Sampling Timeは、クロック周期数で表され、クロック周波数と共に、変換精度に影響します。
Sampling Timeが短いほど、変換時間は短くなりますが、変換精度が低下する可能性があります。
逆に、Sampling Timeが長いほど、変換時間が長くなりますが、変換精度が高くなります。
Sampling Timeは、アプリケーションの要件に合わせて適切に設定する必要があります。
Sampling Timeの決め方には、以下のような方法があります。
アナログ信号の周波数と信号レベルを確認し、適切なSampling Timeを選択する。
クロック周波数と変換精度を確認し、Sampling Timeを決定する。
実験的に、異なるSampling Timeで変換を行い、最適なSampling Timeを見つける。
ADC_Injected_ConversionMode
STM32マイクロコントローラのADC(Analog-to-Digital Converter、アナログ・デジタル変換器)のモードの一つで、ADCのインジェクト(注入)チャンネルでの変換を有効にするためのモードです。
通常のADCモードとは異なり、インジェクトチャンネルは、通常のチャンネルよりも高い優先順位を持ち、通常の変換が実行されている間にインジェクト変換を実行することができます。
インジェクト変換は、ADCのキャプチャコンペアイベントを使用してトリガされます。
また、ADC_Injected_ConversionMode モードでは、1つのチャンネルに対して複数回のインジェクト変換を行うこともできます。
このモードを使用することで、例えば電流や温度など、アプリケーションで重要な値を測定するための高速で正確な変換を実行することができます。
インジェクトチャンネルとは、ADCにおいて、通常の変換(Regular Conversion)とは別に、
より高速な変換を行うために用意されたチャンネルのことです。
通常の変換とは異なり、インジェクトチャンネルは専用の変換回路を持ち、
独自の変換時間や変換開始トリガーを持っています。
インジェクトチャンネルは、主にアナログ信号のピーク値の検出や、オーバーシュートの検出、ピークホールド回路の制御など、高速で正確なアナログ測定が必要な場合に使用されます。
Discontinuous Mode
ADCが複数の変換を行う際に、1つの変換が完了するたびにADC変換を停止することで、変換間の時間を空けるモードです。このモードを使用することで、ADC変換によるノイズが減少し、精度の高い変換を実現できます。
例えば、4つのチャンネルを持つADCで、Discontinuous Modeを使用する場合、1つの変換が完了すると、ADCは変換を停止し、指定された時間(Discontinuous Modeの設定値)を待ってから次の変換を開始します。これにより、ADC変換間の時間を空けることができます。
Discontinuous Modeは、通常、オペアンプを使用してシグナルを増幅する必要がある場合や、シグナルが不安定な場合に使用されます。このモードを使用することで、シグナルのノイズが減少し、より正確な変換結果を得ることができます。
Auto Injected Mode
ADCが自動的にインジェクションチャンネル間で切り替えながら、複数のインジェクションチャンネルで変換を行うモードです。このモードでは、1回の変換で最大4つのインジェクションチャンネルを使用できます。
Auto Injected Modeでは、変換シーケンスを開始するためのトリガーが必要です。
トリガーは、ソフトウェアトリガー、外部トリガー、またはレギュラーチャンネル変換の完了トリガーなど、複数のオプションから選択できます。トリガーが発生すると、ADCはインジェクションチャンネル変換を開始し、自動的にインジェクションチャンネルを切り替えながら変換を行います。最後のインジェクションチャンネル変換が完了すると、ADCが変換シーケンスの終了を通知するフラグが立ちます。
Auto Injected Modeでは、変換結果はDMA転送を使用して転送することができます。
また、複数のインジェクションチャンネル変換結果を取得するには、JDR1、JDR2、JDR3、JDR4といった複数のレジスタを使用します。
Enable Analog WatchDog Mode
ADCが取得したアナログ信号の値が、あらかじめ設定した上限値と下限値の範囲外になった場合に、割り込みまたはDMA転送をトリガーする機能です。これにより、入力信号が範囲外になった場合にすばやく対応することができます。
このモードを有効にするには、ADCのクロックを設定し、チャンネルを構成し、ADCのアナログウォッチドッグモードを有効にする必要があります。具体的には、次の手順を実行します。
1.ADCのクロックを設定する。
2.変換するチャンネルを構成する。
3.ADCのアナログウォッチドッグモードを有効にする。
4.アナログウォッチドッグレジスター(AWD)の上限値と下限値を設定する。
5.ADCを有効にする。
AWDレジスターには、上限値と下限値を設定するためのビットフィールドがあります。
このビットフィールドを設定することで、ADCは変換結果をチェックし、範囲外の場合に割り込みまたはDMA転送をトリガーします。
AWDレジスターは、アナログウォッチドッグモードが有効になっている場合にのみ使用されます。
Continuous Conversion ModeをEnableにすると、
HAL_ADC_ConvCpltCallbackが永遠と呼ばれ、メイン処理のwhileに戻れない。
とりあえず、Normalモードで、Start,Stop使えば、DMAでAD変換出来るので、これで一旦終る。
会社のやり方確認して、別途確認。
DMAは、Direct Memory Accessの略で、CPUを介さずにデバイス間でデータ転送を行うことができる技術です。つまり、CPUがデジタルデータを処理する必要がなくなり、処理速度を向上させることができます。
AD変換は、アナログ信号をデジタル信号に変換することができますが、この変換は時間がかかるため、高速にデータを処理することが難しい場合があります。このような場合、AD変換のDMAを用いることで、デジタルデータを格納するためのメモリ領域を指定し、DMAコントローラによって自動的にデータを転送するように設定することができます。これにより、AD変換結果を高速かつ効率的に処理することができます。
table:ADC設定項目について
項目 説明
Mode Independent mode
Clock Prescaler PCLK2 divided by 2
Resolution 12bit(15 ADC Clock cycles)
Data Alignment Right alignment
Scan Conversion Mode Enable
Continuous Conversion Mode Disable
Discontinuous Conversion Mode Disable。
DMA Continuous Requests Enable
End Of Conversion Selection EOS flag at the end of all conversions
ADC_Regular_ConversionMode 通常変換モードの設定をする
Number Of Conversion 2
External Trigger Conversion Source Regular Conversion launched by software
External Trigger Conversion Edge none
Rank 1
Channel Channel4
Sampling Time 15 Cycles
Rank 2
Channel Channel8
Sampling Time 15 Cycles
ADC_Injected_ConversionMode
Number Of Conversions 0
WatchDog
Enable Analog WatchDog Mod ☐
HAL_ADC_Start_DMAは、STM32マイクロコントローラのHALドライバーにおいて、アナログデジタルコンバータ(ADC)を使用する際にDMA(Direct Memory Access)を介してデータを転送するために使用される関数です。
この関数は、
ADCの変換を開始し、DMAコントローラによってADCからの変換結果が直接メモリに転送されるようにします。
これにより、CPUの負荷が軽減され、より高速で効率的なデータ収集が可能になります。
HAL_ADC_Start_DMA関数は、以下の引数を受け取ります。
ADC_HandleTypeDef *hadc: ADCハンドル構造体へのポインタ
uint32_t *pData: DMA転送用のデータバッファへのポインタ
uint32_t Length: DMA転送のデータ数(バイト数)
使用する場合、HAL_ADC_Init関数によってADCが初期化され、DMAの設定も行われている必要があります。また、DMA割り込みを使用する場合は、適切にDMA割り込みハンドラを設定する必要があります。
例えば、以下のようにHAL_ADC_Start_DMAを使用することができます。
HAL_ADC_Stop_DMAは、STM32マイクロコントローラのHALドライバーにおいて、DMAを介してデータを転送しているアナログデジタルコンバータ(ADC)を停止するための関数です。
DMA転送中にADCの変換を停止することができます。DMA転送が停止すると、ADCからの変換結果の収集も停止します。これにより、CPUの負荷が軽減されます
HAL_ADC_ConvCpltCallbackは、
STM32マイクロコントローラのHALドライバーにおいて、アナログデジタルコンバータ(ADC)の変換が完了したときに呼び出されるコールバック関数です。
この関数は、DMAによってADCからの変換結果が直接メモリに転送される際に使用されます。ADC変換が完了するたびに、DMA割り込みが発生し、この関数が自動的に呼び出されます。この関数をカスタマイズすることで、変換結果を処理することができます。
HAL_ADC_ConvCpltCallback関数は、以下の引数を受け取ります。
ADC_HandleTypeDef *hadc: ADCハンドル構造体へのポインタ
使用する場合、HAL_ADC_Start_DMA関数によってDMA転送が開始され、適切なDMA割り込みハンドラが設定されている必要があります。また、この関数を使用する場合、以下のようにHAL_ADC_Start_IT関数によってDMA割り込みを有効にする必要があります。
DAC
https://qiita.com/amutou/items/f0b8b6bff411b4cb8d98