【stm32/CubeMX、HAL庫】swjtu嵌入式實驗七 ADC 實驗

相關電路與IO引腳

注意:串口打印重定向后使用printf打印需要在keil里勾選?Use MicroLIB ,否則會卡住。?

參看:https://zhuanlan.zhihu.com/p/565613666

串口重定向:

/* USER CODE BEGIN Includes */#include <stdio.h>// 包含標準輸入輸出頭文件/* USER CODE END Includes */int fputc(int ch,FILE *f){//采用輪詢方式發送1字節數據,超時時間設置為無限等待HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;}int fgetc(FILE *f){uint8_t ch=0;// 采用輪詢方式接收 1字節數據,超時時間設置為無限等待HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );return ch;}

ADC的GPIO復用引腳表:

?參考:

視頻教程:14.1和14.2節

【【14.1】STM32 ADC模數轉換器 感知世界的鑰匙——Kevin帶你讀《STM32Cube高效開發教程基礎篇》】 https://www.bilibili.com/video/BV1CV4y1k71M/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

博客:

https://blog.csdn.net/little_grapes/article/details/121154513

ADC相關函數:

?實驗內容

1、利用 ADC1 通道 3 采樣 PA3 的電壓值,將 ADC 采樣值和轉換的電壓值通過串行口返回, 調節電位器,觀察運行結果。

根據前面的復用引腳表,選擇ADC1的通道IN3。

CubeMX配置如下,

采樣時間(sampling time)選擇55.5cycles,采樣時間長一些結果更準確。

因為也要使用中斷方式,所以要開啟中斷

?

輪詢方式:

  /* USER CODE BEGIN 2 */HAL_ADCEx_Calibration_Start(&hadc1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///輪詢HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1,50);//is it finished?if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){adc_res=HAL_ADC_GetValue(&hadc1);printf("voltage value:%.1f V\r\n",adc_res*3.3/4095);}//延時一段時間再啟動轉換HAL_Delay(1000);}/* USER CODE END 3 */

?中斷方式(直接把輪詢相關的代碼替換,詳見參考的文章)

  /* USER CODE BEGIN 2 *///中斷方式啟動ADC轉換HAL_ADC_Start_IT(&hadc1);/* USER CODE END 2 */

?回調函數:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{if(hadc->Instance==ADC1){adc_res=HAL_ADC_GetValue(&hadc1);printf("voltage value:%.2f V,original value:%d \r\n",adc_res*3.3/4095,adc_res);}
}

2、編寫程序,利用光敏電阻設計光電開關,控制 LED1 點亮和熄滅。

光敏電阻對應引腳PA2,選擇ADC1的IN2通道,選擇使用定時器作為中斷源,注意此時要關閉連續轉換,cubemx配置:

記得開啟ADC中斷。

然后配置定時器,這里用定時器3,頻率為72mhz/(7200*5000)

?

?代碼:

  /* USER CODE BEGIN 2 *///中斷方式啟動ADC轉換HAL_ADC_Start_IT(&hadc1);//開啟定時器3HAL_TIM_Base_Start(&htim3);/* USER CODE END 2 */

?回調函數(這里設置設置計算電壓的方法也是按照3.3V作為參考電壓,大于2.1V就點亮燈(這里點亮了兩個燈),燈的引腳看前面的GPIO實驗)

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{if(hadc->Instance==ADC1){adc_res=HAL_ADC_GetValue(&hadc1);//	printf("voltage value:%.1f V\r\n",adc_res*3.3/4095);if(adc_res*3.3/4095>2.1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,1);}	else{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,0);}}
}

3、設計一個室內溫控系統,PA3 采樣電壓表示采集的溫度,閾值上限為 2.5V,下限為 1V,采樣電壓顯示在數碼管上。

(1)當采樣電壓低于 1V(溫度過低),蜂鳴器鳴叫(模擬聲音報警),LED1 閃爍(模 擬光報警),全彩燈打開(模擬加熱)。

(2)當采樣電壓位于 1V~2.5V 時,正常,蜂鳴器不叫,發光二極管不亮,電機不轉。

(3)當采樣電壓高于 2.5V 時(溫度過高),蜂鳴器鳴叫(模擬聲音報警),LED1 閃爍 (模擬光報警),電機旋轉(模擬風扇降溫)。

這里蜂鳴器(PB8)用定時器4通道3輸出一定頻率的PWM控制,led閃爍間隔時間用cnt控制,循環了一定次數才翻轉電平。配置如下:

段碼表10以后是原來的數字加上了小數點顯示?

/* USER CODE BEGIN 0 */uint8_t flag=0;int res=0;
//uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80 };//10表示'-'
uint8_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80+0x3f,0x80+0x06,0x80+0x5b,0x80+0x4f,0x80+0x66,0x80+0x6d,0x80+0x7d,0x80+0x07,
0x80+0x7f,0x80+0x6f, };//10表示'-'
uint8_t s[]={0,0,0,0,0,0,10,0};
uint16_t adc_res=0;
int light_flag=0;uint8_t n1;uint8_t n2;void write_byte(uint8_t date){unsigned char i;for(i=0;i<8;i++){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(date>>(7-i))&0x01);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,0);}HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,1);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,0);}int fputc(int ch,FILE *f){//采用輪詢方式發?1字節數據,超時時間設置為無限等待HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;}int fgetc(FILE *f){uint8_t ch=0;// 采用輪詢方式接收 1字節數據,超時時間設置為無限等待HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );return ch;}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{if(hadc->Instance==ADC1){adc_res=HAL_ADC_GetValue(&hadc1);float vol=adc_res*3.3/4095;printf("voltage value:%.2f V\r\n",vol);if(vol <1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);light_flag=1;HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 0);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, 0);HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);}	else if(adc_res*3.3/4095 >=1 &&adc_res*3.3/4095<=2.5){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 0);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, 0);HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_3);light_flag=0;}else{light_flag=1;HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, 1);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, 0);HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);       }n1=(uint8_t)vol;n2=(uint8_t)(vol*10)%10;//printf(" value:%d V\r\n",n1);//printf(" value:%d V\r\n",n2);}
}

  int cnt=0;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(light_flag==1){cnt++;if(cnt==50){cnt=0;HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_0);}}else{HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0,0);cnt=0;}s[7]=n2;s[6]=n1+10;for(int i=8;i<11;i++){write_byte(table[s[15-i]]);HAL_GPIO_WritePin(GPIOF,0x01<<i,0);HAL_Delay(1);HAL_GPIO_WritePin(GPIOF,0x01<<i,1);}}/* USER CODE END 3 */

源文件見個人主頁。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23253.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

銳捷校園網自助服務系統 login_judge.jsf 任意文件讀取漏洞復現(XVE-2024-2116)

0x01 產品簡介 銳捷校園網自助服務系統是銳捷網絡推出的一款面向學校和校園網絡管理的解決方案。該系統旨在提供便捷的網絡自助服務,使學生、教職員工和網絡管理員能夠更好地管理和利用校園網絡資源。 0x02 漏洞概述 校園網自助服務系統/selfservice/selfservice/module/sc…

求解數組中N數之和最接近目標值的算法詳解

目錄 問題定義問題背景常見解決思路 暴力枚舉法排序雙指針法動態規劃法 具體實現方法 暴力枚舉法的實現排序雙指針法的實現動態規劃法的實現 優化技巧總結 問題定義 給定一個整數數組 nums 和一個目標值 target&#xff0c;需要在數組中找到 n 個數&#xff0c;使得這 n 個數…

apollo 環境配置

輸入法 安裝輸入google pinyin法 sudo apt install fcitx-bin sudo apt install fcitx-table sudo apt-get install fcitx fcitx-googlepinyin -y 最后需要reboot 系統環境 修改文件夾名稱為英文 將Ubuntu主文件夾里的中文文件夾名稱改成英文_番茄炒雞蛋z的博客-CSDN博客…

selenium中switch_to.window切換窗口的用法

打開百度多個窗口&#xff0c;遍歷切換每個窗口&#xff0c;切到【百度地圖】就停止。 使用了driver.switch_to.window&#xff08;&#xff09; 來切換&#xff0c; 參數是handle值 from selenium import webdriver import time# 創建瀏覽器驅動對象 from selenium.webdrive…

JSQLParser用于解析SQL語句并創建抽象語法樹(AST)

JSQLParser簡介 JSQLParser是一個Java庫&#xff0c;用于解析SQL語句并創建抽象語法樹(AST)。該庫非常強大&#xff0c;可以解析大多數標準SQL語法&#xff0c;并支持許多數據庫的專用語法。 主要特點 語法支持廣泛&#xff1a;支持大多數SQL語法&#xff0c;包括SELECT、IN…

java中事務中遇到鎖會造成什么問題,以及該如何解決?

在spring中實現事務有多種方式&#xff0c;主要是兩種&#xff1a;一種是聲明式事務&#xff0c;一種是編程式事務&#xff0c;今天我們就講聲明式事務中的一種&#xff0c;使用注解Transactional&#xff0c;這個注解的作用就是幫助我們在代碼執行完畢之后自動提交事務&#x…

淘寶評論數據爬取全攻略

一、淘寶評論數據爬取的背景與意義 隨著互聯網的快速發展&#xff0c;電子商務平臺如淘寶、京東等在我國市場占有率逐年上升。消費者在購買商品時&#xff0c;除了關注商品的價格、質量等因素外&#xff0c;還會參考其他消費者的評價和評論。淘寶評論數據爬取是指通過技術手段…

C# NX二次開發-設置背景顏色

使用UF函數能直接設置UG背景顏色: 1.設置背景顏色選項為純色: 2.編寫更新背景顏色代碼: var nxColor NXColor.Factory._Get(186);var rgb nxColor.GetRgb();double[] arr [rgb.R, rgb.G, rgb.B];theUf.Disp.SetColor(UFConstants.UF_DISP_BACKGROUND_COLOR, UFConstants.UF…

oracle刪除表空間和用戶命令

創建表空間和用戶可參考 ORACLE創建表空間,用戶,修改密碼,分配權限,以及導入導出_oracle表空間的密碼-CSDN博客 1.刪除表空間 --刪除空的表空間&#xff0c;但是不包含物理文件 drop tablespace tablespace_name; --刪除非空表空間&#xff0c;但是不包含物理文件 drop tabl…

化妝品FDA認證需要注意哪方面

化妝品FDA認證概述 化妝品FDA認證是指化妝品產品通過美國食品藥品監督管理局&#xff08;FDA&#xff09;的審核和認證&#xff0c;證明其符合相關法規和標準&#xff0c;具備在美國市場合法銷售的條件。這一認證過程不僅涉及產品的成分合規性&#xff0c;還包括產品的標簽、安…

C#字符串格式化之$語法

引言 字符串是編程中使用較廣的一種數據&#xff0c;它由數字、字母、下劃線等組成。在使用過程中會對字符串進行格式化。在C#語言中&#xff0c;.NET 6及以上使用字符串插值&#xff08;$""語法&#xff09;對字符串格式化。 $語法 .NET 6 及以上提供的一種新的語…

Facebook海外企業廣告賬戶是什么?有什么優勢?

隨著全球化的迅速發展&#xff0c;越來越多國內企業開始將目光轉向海外市場&#xff0c;尋求更為廣闊的商機與更高的發展空間。而在這個全球化的時代&#xff0c;Facebook作為全球最大的社交媒體平臺之一&#xff0c;自然成為了眾多企業進軍海外市場的首選平臺之一。那么如果想…

flask輕松入門,概念講解

Hello World Flask 是輕量級web框架&#xff0c;僅保留了核心功能&#xff1a; 請求響應處理模板渲染URL路由 文章目錄 Hello Worldflask命令模式python命令模式兩種模式對比修改入口文件配置flask命令修改python命令修改 修改端口和地址flask命令修改python命令修改 修改 URL …

java——順序表

前言&#xff1a;順序表是線性表的一種&#xff0c;它是較于數組更加靈活的一種儲存方式。線性表通常是邏輯上是連續的一條直線&#xff0c;但在物理上不是連續的。java中已經實現好了一個順序表&#xff0c;搭配泛型可以支持各種類型的使用&#xff0c;下面就來介紹該如何使用…

以太網:ARP和信息處理狀態機+代碼實現

ARP過程只需要一次發送和一次接受就可以完成了&#xff1b; 在實際實現協議棧的時候我個人認為要以主動ARP開始&#xff1b; 主動ARP&#xff1a;發送一次ARP請求&#xff0c;接受一個ARP報文&#xff1b; 使用這種方式的原因是上位機可能不知道你的IP地址&#xff08;當然如…

Mysql疑難報錯排查 - Field ‘XXX‘ doesn‘t have a default value

項目場景&#xff1a; 數據庫環境 &#xff1a;mysql8; 工程使用&#xff1a;MyBatisPlus 表情況&#xff1a; 問題描述 某一個插入語句使用了 MyBatisPlus 的 save 方法&#xff0c;因為end_time1 end_time2都并沒有值&#xff0c;所以在MyBatisPlus默認情況下&#xff0c;…

如何使自己寫的代碼易讀易懂?

〓● 如果代碼可讀性不佳、不容易理解&#xff0c;可能造成如下問題&#xff1a; 〓? 其他工程師浪費時間解讀它&#xff1b; 〓? 誤解導致引入缺陷&#xff1b; 〓? 其他工程師修改時破壞代碼。 〓● 提高代碼可讀性&#xff0c;有時候可能使其變得更為冗長、占用更多的…

【Python】深入認識Python數據類型和變量

???? 文章目錄 1. 引言數據類型的重要性Python中的數據類型概述 2. 數字類型整型&#xff08;int&#xff09;浮點型&#xff08;float&#xff09;復數&#xff08;complex&#xff09; 3. 字符串類型字符串的定義與使用字符串操作方法 4. 布爾類型布爾值和布爾運算 5. 列…

docker網絡詳解

1. 網絡模式 1.1 網絡結構 當安裝Docker以后&#xff0c;會自動創建三個網絡。可以使用docker network ls命令列出這些網絡。 $ docker network ls NETWORK ID NAME DRIVER SCOPE 440aefe8afa3 bridge bridge local aa8d6325580f host host …

02JAVA字符串和集合

1.字符串 1.String 介紹: String在java.lang包下,使用不需要導包,String代表字符串,帶""字符串都是String類的對象 字符串的特點: 字符串不可變,他們的值在創建后不能被改變 字符串效果相當于(char[]),底層原理是字節數組(byte[]) String構造方法: String 變量名 ne…