インテリジェント安全運転支援システム STM32 - MQ3 アルコールセンサーの応用(HAL ライブラリ)
準備:
MQ3 アルコール センサー 1 台、STM32 開発ボード (この実験では F103RCT6 を使用します。他のモデルでも同じ設定についてはこの記事を参照してください)
1. MQ3 アルコールセンサーの紹介
MQ3 アルコールセンサーは主にアルコール検知に使用され、清浄な空気中では導電率が低い二酸化スズ (SnO2) をガス感知材料として使用する原理です。センサーが設置されている環境にアルコール蒸気が存在する場合、空気中のアルコールガス濃度の増加に伴ってセンサーの導電率が増加します。簡単な回路で導電率の変化をガス濃度に応じた出力信号に変換できます。
MQ-3 ガスセンサーはアルコールに対する感度が高く、ガソリン、スモッグ、水蒸気の干渉に耐性があります。さまざまな濃度のアルコール雰囲気を検知できるため、さまざまな用途に適した低コストのセンサです。
このモジュールの主な機能は次のとおりです。
信号出力表示付。
2チャンネル信号出力(アナログ出力とTTL出力)。
TTL出力有効信号はローレベルです。
アナログ出力電圧は0~5Vで、濃度が高くなるほど電圧が高くなります。
感度が高く、エタノール蒸気に対する選択性が良好です。
長い耐用年数と信頼できる安定性を備えています。
高速応答回復機能。
MQ3 モジュールの物理マップ:
2. STM32
この記事では、主にADCを使用して MQ3 アルコール センサーの AO ポートのアナログ データを収集し、ADC の DMA 取得フォームを使用して電圧データを取得します。
同時に外部割り込み EXTIを使用して DO ポートのアルコール濃度が一定値に達したかどうかを判断し、アルコールを検出すると DO ポートは出力 High レベルから出力 Low レベルに変化しますので、PA4 ポートを設定します。STM32を立ち下がりエッジモードに移行 外部割り込みモードでアルコールの有無を検出(入力モードを設定してDOポートがLowレベルかどうかを確認することでもアルコールの有無を確認できますが、この方法はCPU時間を消費するため、アルコールの有無を確認できません)ハードウェア割り込みに適しています)。アルコールの有無を判定するために、割り込みコールバック関数でLEDライト(PB9)を点灯するように設定します。
CubeMX グラフィック設定:基本クロックの選択とその他の省略については、 Blue Bridge Cup モノのインターネットの基本グラフィック チュートリアルを
参照してください- GPIO 出力制御 LD5 のオンとオフADC DMA モードを設定し、ADC1 チャネル 1 を選択し、PA4 を外部割り込みモードとして設定します (モニター用) DO ポートのレベル遷移ADC DMA モード設定、その他はデフォルトデータを表示するシリアル ポート アシスタントにデータを出力するシリアル ポートを選択プロジェクトの生成
追加コード:
main.c
/* USER CODE BEGIN PV */
uint32_t adc_value=0;
uint32_t Alcohol=0;
uint8_t a=1;
/* USER CODE END PV */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start_DMA(&hadc1,&adc_value,1);
Alcohol=((float)adc_value*3.3/4096*0.36-1.08)*10000;//电压数据转换(此处由于还未找到相关公式,暂时这样代替,如有了解的大佬可以在评论区补充一下)
printf("Alcohol=%d\r\n",Alcohol);
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
//中断回调函数,当有酒精时,DO口电平由高电平边低电平,PA4触发外部中断,进入中断函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin==Alcohol_DO_Pin){
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
}
//设置一个按键中断,为了把酒精触发的LED点亮之后熄灭(实际项目中可改为关闭蜂鸣器等)
if(GPIO_Pin==KEY1_Pin){
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,0);
}
}
/* USER CODE END 4 */
リダイレクトコード:
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
return ch;}
ハードウェア接続
MQ-3 STM32
AO口 接 PA1 (ADC_IN1)
DO口 接 PA4 (外部中断)
GND 接 GND
VCC 接 VCC5V
PB9 连接LED灯
PA9/10 UART TX/RX
プロジェクトコードのコメントに返信することに注意を払うことができます