内部温度センサー
1.内部温度センサーの紹介
STM32F1には、CPUとその周辺の温度を測定するために使用できる内部温度センサーがあります。温度センサーは、ADCx_IN16入力チャネルに内部接続されています。このチャネルは、センサー出力電圧をデジタル値に変換します。温度センサーアナログ入力の推奨サンプリング時間は、17.1usです。内部温度センサーは、-40〜125℃の温度範囲をサポートします。精度は約±1.5℃です
ADCチャネル16の値を読み取ることにより、現在の温度は次の計算式で計算できます。
T = {(V 25 -V センス)/ Avg_Slope} + 25
上記の式では:
V 25 = 25°CでのV センスの値(標準値:1.43)
Avg_Slope =温度とV センス曲線の平均勾配(標準値:4.3 mV /°C)
上記の代表的な値については、データシートの電気的特性の章の概要を参照してください
2.ハードウェア設計
この実験では、内部温度がADC1チャネル16を介して収集され、サンプリングされたAD値と変換された温度値がUSART1シリアルポートを介して出力されます。同時に、D1インジケーターが点滅し、システムが正常に動作していることを示します
- D1インジケーター
- ADC1_INT1
- USART1シリアルポート
3.ソフトウェア設計
3.1 STM32CubeMX設定
- RCCは外部HSEを設定し、クロックは72Mに設定され、ADCプリスケーラー係数は6に設定されます。ADC_CLKは12MHzです
- PC0はGPIOプッシュプル出力モード、プルアップ、高速に設定され、デフォルトの出力レベルは高
- USART1は非同期通信モードとして選択され、ボーレートは115200ビット/秒に設定され、送信データ長は8ビット、パリティなし、1ストップビットです。
- ADC1温度センサーチャネルをアクティブにし、正しい配置を設定し、スキャンをオフにし、連続モードと断続モードを有効にし、定期的な変換を有効にし、ソフトウェアトリガーを設定し、サンプリング時間を239.5サイクル(19.96us)に設定します。
- プロジェクト名を入力し、プロジェクトパス(中国語以外)を選択し、MDK-ARM V5を選択します。IPごとに「.c / .h」ファイルのペアとして生成されたペリフェラルの初期化を確認します。「コードを生成」をクリックしてプロジェクトコードを生成します
3.2 MDK-ARMプログラミング
- ADC初期化関数は、adc.cファイルで確認できます。
void MX_ADC1_Init(void){
ADC_ChannelConfTypeDef sConfig = {
0};
/** Common config */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK){
Error_Handler();
}
/** Configure Regular Channel*/
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){
Error_Handler();
}
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle){
if(adcHandle->Instance==ADC1) {
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
}
}
- main関数のwhileループに次のテストプログラムを追加します。
while (1){
HAL_ADC_Start(&hadc1); //启动ADC转换
HAL_ADC_PollForConversion(&hadc1,10); //等待转换完成,10ms表示超时时间
AD_Value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据(12位数据)
printf("ADC1_IN16 ADC value: %d\r\n",AD_Value);
Vol_Value = AD_Value*(3.3/4096); //AD值乘以分辨率即为电压值
printf("ADC1_IN16 VOL value: %.2fV\r\n",Vol_Value);
Temperature = (1.43 - Vol_Value)/0.0043 + 25; //根据公式算出温度值
printf("MCU Internal Temperature: %.2f¡æ\r\n",Temperature);
printf("\r\n");
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
HAL_Delay(1000);
}
4.ダウンロードの確認
コンパイルが完了したら、開発ボードにダウンロードします。システムの実行中にD1インジケーターライトが点滅し続け、シリアルポートが読み取った温度データを印刷し続けることがわかります