[Blue Bridge Cup] [組み込み部門] セクション 9: MCP4017 プログラミング設計

デジタル ポテンショメータ MCP4017 の回路原理

これは本質的には IC デバイス、つまり本質的にはチップです。
チップ内にはいくつかの抵抗ネットワークがあり、多くのアナログ スイッチを通じてさまざまな抵抗値を切り替えます。
では、チップ内のさまざまなスイッチを制御してさまざまな抵抗値を実現するにはどうすればよいでしょうか? この競合開発ボードでは、CPU が IIC バスを介してデータをチップに送信し、開くスイッチの数、どのスイッチを開くか、したがって抵抗値をチップに伝えます。
ここに画像の説明を挿入します
上の図からわかるように、ピン 3 と 4 は IIC の通信ラインで、ピン 1 と 2 はチップの電源ラインです。では、ピン 5 と 6 は何をするのでしょうか?
ここに画像の説明を挿入します

5 番ピンは可変抵抗の一端、6 番ピンは可変抵抗器のダイシングに相当し、A 端子はフローティングなので、5 番端子と 6 番端子から得られる情報は次のようになります。

  • スクライブ W が左端に移動すると、RWB = RAB R_{WB}=R_{AB}になります。RWB _=RAB _
  • スクライビング W が中央に移動すると、RWB = 1 / 2 RAB R_{WB}=1/2R_{AB}となります。RWB _=1/ 2RAB _
  • スクライブ W が右端に移動すると、RWB はほぼ 0 に等しい R_{WB} はほぼ 0 に等しいRWB _ほぼ0に等しい

そして、このチップの構造範囲は 104E なので、10 ∗ 1 0 4 = 100 K Ω 10*10^4=100KΩ101 04=100KΩレンジ_

次に、典型的な分圧構造である回路図を見てみましょう。
ここに画像の説明を挿入します
つまり、PB14 の電圧は次のようになります。
V = 3.3 ∗ RWBRWB + 10 V=3.3* \frac{R_{WB}}{R_{WB}+10}V=3.3RWB _+10RWB _
PB14 は、この分圧された電圧を読み取り、デジタル値に変換するための ADC ピンとして使用できます。

次に、変更を開始する前に、この IIC デバイスのアドレスも知る必要があります:
ここに画像の説明を挿入します
ここに画像の説明を挿入します
上記のメーカーから提供された情報から、次のことがわかります:
STM32 がチップの情報を読み取る場合、アドレスは 0x5f であり、
STM32 が情報を書き込む場合は、チップ、アドレスは 0x5e

ここに画像の説明を挿入します
上の図は MCP4017 チップの抵抗ネットワークを示していますが、実際、内部で抵抗を変更する方法は非常に簡単で、さまざまなスイッチを閉じることで実現されます。たとえば、スイッチ 00h を閉じると、抵抗が接続されておらず、抵抗値が 0 になることを意味します。スイッチ 01h が閉じている場合、1 つのRS R_Sが接続されますRS入る。後で、接続されているRS R_Sである別のスイッチを変更します。RSただ違う数字です。これにより、チップ内部の抵抗が変化します。

プログラミング

  1. [リソースデータパッケージ]内のi2c-hal.cファイルとhファイルを[プログラミングプロジェクト]にコピーします。
  2. main.c で呼び出される 12C 部分の IO 初期化コード (PB6、PB7)。
  3. i2c.c ファイルでのプログラミング: MCP4017 関数の読み取りおよび書き込み。
  4. main.c で MCP4017_WriteMCP4017_Read 関数を呼び出して、デジタル ポテンショメータの読み取りおよび書き込みプログラムを完了します。

このチップが IIC プロトコルを使用して読み取りおよび書き込みコマンドを指定する方法については、チップのマニュアルからも確認できます。
ここに画像の説明を挿入します
上の図によると、チップにコマンドを書き込むコードは次のようにする必要があることがわかります。

チップは 7 ビットのデータしか受信できないため、何を送信しても最上位ビットは破棄されるため、上の図では代わりに同じ X 番号が使用されています。

void MCP4017_Write(u8 val)
{
    
    
	I2CStart();
	I2CSendByte(0x5e);
	I2CWaitAck();
	I2CSendByte(val);
	I2CWaitAck();
	I2CStop();
}

ここに画像の説明を挿入します
上の図によれば、読み取りコードは次のように記述できます。

u8 MCP4017_Read(void)
{
    
    
	u8 val;
	I2CStart();
	I2CSendByte(0x5f);
	I2CWaitAck();
	val=I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	return val;
}

上記の 2 つのコードをi2c.cファイルにコピーし、i2c.hファイル内で忘れずに宣言するだけです。
その後、main 関数で呼び出すことができます。

特別な点は、EEPROM とは異なり、MCP4017 は 2 つの書き込みプロセスの間に遅延機能を追加する必要がないことです。

ADCピンを使用してチップの電圧を収集する方法

ステップ:

  1. [テンプレート] STM32CUBEMX 生成コードのプロジェクトとして。
  2. ADC 関連の GPI0 を [ADC 入力] モードに設定し、[シングルエンド モード] に設定します: (PB15、PB12、PB14)
  3. ADC1 (Number 0f Conversion) の変換チャネル数を 2 に設定します (ADC1_IN5 と ADC1_IN11 のランクと取得速度を設定します)
  4. ADC 関連の HAL ライブラリ ドライバ ファイル (stm32g4xx hal adc.c および stm32g4xx hal adc_exc) を追加します。
  5. main.c に adc, h を追加し、ADC 初期化コードを追加します; [注意] 周辺クロックの初期化が必要です。
  6. HAL ADC Start の ADC スタートアップ関数と HAL ADC GetValue の ADC 読み取り関数をテストします。

上の回路図によると、チップが ADC サンプリング ピン PB14 に接続されていることがわかっているため、テンプレート プロジェクトを開いてこのピンの関連パラメーターを構成します。PB14 を ADC モードとしてチェックし、対応するチャネルをシングルとして選択します
。 -終了モード。

ここに画像の説明を挿入します
ここで注意すべき点が 1 つあります
現在、ADC1 ピンが 2 つあるため (異なるチャネルに対応)、ADC1 の「変換数」を 2 に変更する必要があります。これは、ADC が 2 つのアイルを使用する必要があることを意味します。
この数値を 2 に変更すると、上記の「スキャン変換モード」が自動的にオンになることがわかります。これは、ADC の 2 つのチャネルを周期的にスキャンして、各チャネルの値が確実に取得されることを意味します。どのチャンネルを最初にスキャンするかについては、次のように設定することもできます。
ここに画像の説明を挿入します

これは、このランク レベルを構成することで実現できます。ここでは、チャネル 11 をレポート レベルとして設定し、チャネル 5 を低レベルとして設定します。これにより、最初にチャネル 1 がサンプリングされ、次にチャネル 5 がサンプリングされます。また、複数のチャネルを使用する場合は、後で「サンプリング時間」を調整することをお勧めします
。 . . ここでは最も遅い値に調整します。つまり、1 回のサンプリングに 640.5 クロック サイクルかかることになります。

ADC2 では 1 つのピンと 1 つのチャネルのみが使用されるため、これらの設定を実行する必要はありません。
次に、コードを生成して移植します。
mcp をサンプリングするための 2 行のコードを追加するだけです。

u16 adc1_val,adc2_val;
float volt_r37,volt_r38,volt_mcp;
void ADC_Process(void)
{
    
    
	HAL_ADC_Start(&hadc1);
	volt_mcp=HAL_ADC_GetValue(&hadc1)/4096.0f*3.3f;
	
	HAL_ADC_Start(&hadc1);
	adc1_val=HAL_ADC_GetValue(&hadc1);
	volt_r38=adc1_val/4096.0f*3.3f;
	HAL_ADC_Start(&hadc2);
	adc2_val=HAL_ADC_GetValue(&hadc2);
	volt_r37=adc1_val/4096.0f*3.3f;
}

おすすめ

転載: blog.csdn.net/Gorege__Hu/article/details/129913505