STM32項目實戰:ADC采集

?? ? ? ?STM32F103C8T6的ADC配置。PB0對應的是ADC1的通道8。在標準庫中,需要初始化ADC,設置通道,時鐘,轉換模式等。需要配置GPIOB的第0腳為模擬輸入模式,然后配置ADC1的通道8,設置轉換周期和觸發方式。

????????接下來是I2C屏幕的驅動,通常使用SSD1306 OLED屏,I2C地址一般為0x7a或0X7b。需要編寫I2C的初始化函數,包括GPIO配置(PB8和PB9作為SCL和SDA),設置I2C的時鐘和模式,以及實現數據的發送函數。同時,需要整合SSD1306的驅動代碼,包括初始化命令、清屏、寫字符串等函數(這里我們為了省事,直接使用江協科技)。

????????用戶提到使用標準庫,所以需要避免使用HAL的函數,轉而使用如stm32f10x_gpio.h、stm32f10x_adc.h、stm32f10x_i2c.h等頭文件中的函數。比如,ADC的初始化需要配置ADC_InitTypeDef結構體,啟動校準,然后進行轉換。I2C部分需要手動處理起始、地址發送、數據發送和停止條件。

????????另外,ADC的轉換結果需要通過計算得到電壓值,這里使用3.3V參考電壓,12位分辨率,所以電壓=adc_value * 3.3 / 4095。顯示部分需要將數值轉換為字符串,并格式化輸出到OLED上。

????????需要注意的問題包括:I2C的時序是否正確,是否添加了上拉電阻;ADC的采樣時間是否足夠,是否需要多次采樣取平均以減少噪聲;標準庫中的函數調用是否正確,例如I2C的等待標志位是否處理妥當,避免死循環。

????????最后,代碼結構應包括初始化函數(GPIO、ADC、I2C)、OLED驅動函數、主循環中的ADC讀取和顯示更新。可能還需要實現簡單的延時函數,因為標準庫中沒有HAL_Delay,可以使用SysTick或簡單的循環延時。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "stdlib.h"int adc_value;
float voltage;
u8 buff[30];
/*** 坐標軸定義:* 左上角為(0, 0)點* 橫向向右為X軸,取值范圍:0~127* 縱向向下為Y軸,取值范圍:0~63* *       0             X軸           127 *      .------------------------------->*    0 |*      |*      |*      |*  Y軸 |*      |*      |*      |*   63 |*      v* */// 初始化水泵ADC
void ADC_Init_Config(void)
{ADC_InitTypeDef ADC;GPIO_InitTypeDef GPIO;// 使能ADC1和GPIOB時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);// 配置PB0為模擬輸入模式GPIO.GPIO_Pin = GPIO_Pin_0;GPIO.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOB, &GPIO);// 配置ADC1ADC.ADC_Mode = ADC_Mode_Independent;ADC.ADC_ScanConvMode = DISABLE;ADC.ADC_ContinuousConvMode = DISABLE;ADC.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC.ADC_DataAlign = ADC_DataAlign_Right;ADC.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC);// 配置ADC1的通道8(PB0),采樣時間為1.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);// 使能ADC1ADC_Cmd(ADC1, ENABLE);// 初始化ADC校準值ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1));
}int main(void)
{ADC_Init_Config();/*OLED初始化*/OLED_Init();/*在(0, 0)位置顯示字符'A',字體大小為8*16點陣*/OLED_ShowChar(0, 0, 'A', OLED_8X16);/*在(16, 0)位置顯示字符串"Hello World!",字體大小為8*16點陣*/OLED_ShowString(16, 0, "Hello World!", OLED_8X16);/*在(0, 18)位置顯示字符'A',字體大小為6*8點陣*/OLED_ShowChar(0, 18, 'A', OLED_6X8);/*在(16, 18)位置顯示字符串"Hello World!",字體大小為6*8點陣*/OLED_ShowString(16, 18, "Hello World!", OLED_6X8);/*在(0, 28)位置顯示數字12345,長度為5,字體大小為6*8點陣*/OLED_ShowNum(0, 28, 12345, 5, OLED_6X8);/*在(40, 28)位置顯示有符號數字-66,長度為2,字體大小為6*8點陣*/OLED_ShowSignedNum(40, 28, -66, 2, OLED_6X8);/*在(70, 28)位置顯示十六進制數字0xA5A5,長度為4,字體大小為6*8點陣*/OLED_ShowHexNum(70, 28, 0xA5A5, 4, OLED_6X8);/*在(0, 38)位置顯示二進制數字0xA5,長度為8,字體大小為6*8點陣*/OLED_ShowBinNum(0, 38, 0xA5, 8, OLED_6X8);/*在(60, 38)位置顯示浮點數字123.45,整數部分長度為3,小數部分長度為2,字體大小為6*8點陣*/OLED_ShowFloatNum(60, 38, 123.45, 3, 2, OLED_6X8);/*在(0, 48)位置顯示漢字串"你好,世界。",字體大小為固定的16*16點陣*/OLED_ShowChinese(0, 48, "你好,世界。");/*在(96, 48)位置顯示圖像,寬16像素,高16像素,圖像數據為Diode數組*/OLED_ShowImage(96, 48, 16, 16, Diode);/*在(96, 18)位置打印格式化字符串,字體大小為6*8點陣,格式化字符串為"[%02d]"*/OLED_Printf(96, 18, OLED_6X8, "[%02d]", 6);/*調用OLED_Update函數,將OLED顯存數組的內容更新到OLED硬件進行顯示*/OLED_Update();/*延時3000ms,觀察現象*/Delay_ms(3000);/*清空OLED顯存數組*/OLED_Clear();while (1){// 啟動ADC轉換ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 等待轉換完成while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));// 獲取ADC轉換結果adc_value = ADC_GetConversionValue(ADC1);// 計算電壓值// STM32F103C8T6的ADC分辨率是12位,參考電壓為3.3Vvoltage = (adc_value * 3.3) / 4096;sprintf((char*)buff,"%fV  ",voltage);OLED_ShowString(16, 18, buff, OLED_6X8);OLED_Update();}
}

優化建議:

? ? ? ? 1.添加ADC軟件平均濾波:

uint16_t ADC_ReadAvg(uint8_t times) {uint32_t sum = 0;for(uint8_t i=0; i<times; i++) {ADC_SoftwareStartConvCmd(ADC1, ENABLE);while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));sum += ADC_GetConversionValue(ADC1);}return sum/times;
}

????????2.顯示刷新使用局部刷新代替全屏刷新提升性能

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

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

相關文章

第十四章:數據治理之數據源:數據源的數據接入、業務屬性梳理及監控

本章開始&#xff0c;將進入9大模塊的介紹。第一個模塊我們先介紹&#xff1a;數據源。數據源是整個數據中臺數據的來源&#xff0c;是一個起點。更好的管理好數據源這個起點&#xff0c;是數據治理的一個好的開始。 在【數據&#xff1a;業務生數據&#xff0c;數據生“萬物”…

【C/C++】多線程開發:wait、sleep、yield全解析

文章目錄 多線程開發&#xff1a;wait、sleep、yield全解析1 What簡要介紹詳細介紹wait() — 條件等待&#xff08;用于線程同步&#xff09;sleep() — 睡覺&#xff0c;定時掛起yield() — 自愿讓出 CPU 2 區別以及建議區別應用場景建議 3 三者協作使用示例 多線程開發&#…

阿里云CDN刷新預熱--刷新URL

文章目錄 一、全英文URL刷新預熱二、摻雜中文的URL刷新預熱2.1 對帶中文URL進行編碼2.2 預熱刷新 三、CDN刷新-核心作用與價值3.1 核心作用3.2 核心價值3.3 典型使用場景 *最后我想說&#xff1a;請你不要相信我說的每一句話&#xff0c;這只是我的個人經驗* 一、全英文URL刷新…

Oracle 19c DG備庫報錯ORA-00313、ORA-00312、ORA-27037

Oracle 19c DG備庫報錯ORA-00313、ORA-00312、ORA-27037 錯誤排查問題處理錯誤排查 DG同步完成后,DG Broker show database發現以下告警信息: Database Warning(s):ORA-16826: apply service state is inconsistent with the DelayMins propertyORA-16789: standby redo log…

開源與閉源之爭:AI時代的創新博弈與未來抉擇

在人工智能技術狂飆突進的今天&#xff0c;開源與閉源之爭已不再局限于技術圈的討論&#xff0c;而是演變為一場關乎技術倫理、商業格局乃至人類文明走向的深度博弈。當Meta的Llama 3開源模型下載量突破百萬&#xff0c;當OpenAI的GPT-5繼續加固技術壁壘&#xff0c;這場沒有硝…

NIFI的處理器:JSLTTransformJSON 2.4.0

該處理器使用JSLT轉換FlowFile JSON有效負載的格式。使用轉換后的內容創建新的FlowFile&#xff0c;并將其路由到“成功”關系。如果JSLT轉換失敗&#xff0c;則將原始FlowFile路由到“失敗”關系。 需要注意的是&#xff0c;編譯JSLT轉換可能相當昂貴。理想情況下&#xff0c…

MySQL 索引失效及其解決辦法

一、前言 在數據庫優化中,索引(Index)是一項至關重要的技術手段,可以顯著提升查詢性能。然而,在實際開發過程中,MySQL 索引并不總是如預期生效。本文將從原理出發,系統地介紹索引失效的常見場景及其解決方案,幫助開發者有效規避性能陷阱。 二、索引基礎回顧 MySQL 支…

趨勢觸發策略

趨勢觸發策略(TS版)是一種基于TrendTriggerFactor(TTF)的交易策略,通過柱狀圖顏色變化指示市場趨勢的強度,并根據TTF的穿越信號進行買賣操作。 TTF是通過計算買方力量和賣方力量的差值除以兩者之和的一半再乘以100得到的。 當TTF大于100時,柱狀圖顯示為綠色,表示市場…

DeepSeek-R1 模型現已在亞馬遜云科技上推出

亞馬遜云科技提供眾多免費云產品&#xff0c;可以訪問&#xff1a;亞馬遜云科技 在剛剛過去的 Amazon re&#xff1a;Invent 期間&#xff0c;Amazon 首席執行官 Andy Jassy 分享了從 Amazon 自己在全公司開發近 1000 個生成式 AI 應用程序的經驗中汲取的寶貴經驗。從這種廣泛…

中臺項目-微前端qiankun-umimax

學習視頻&#x1f50a; 基礎&#xff1a; 黑馬前端基于qiankun搭建微前端項目實戰教程_嗶哩嗶哩_bilibili 路由、部署配置注意&#xff1a;qiankunvite微前端上線注意事項&#xff0c;base公共路徑設置_嗶哩嗶哩_bilibili 微前端 什么是微前端&#xff1f; 微前端是將前端應…

【Java學習筆記】代碼塊

代碼塊 介紹&#xff1a;代碼塊又稱為初始化塊&#xff0c;屬于類中的成員&#xff08;即是類的一部分&#xff09;&#xff0c;類似于方法&#xff0c;將邏輯語句封裝在方法體中&#xff0c;通過{}包圍起來 與類方法的不同點 無方法名 無返回類型 無參數 只有方法體&#…

spring boot 2.7集成舊的springfox-boot-starter swagger oas 3.0

舊版本目前已經不維護推薦使用 springdoc-openapi-ui&#xff0c;這里為了演示使用舊的最新依賴 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dep…

Linux按鍵驅動測試方式詳細介紹

Linux按鍵驅動測試可采用以下分層方法&#xff1a; 基礎事件檢測 使用輸入子系統調試工具&#xff1a; sudo apt install evtest # 安裝事件測試工具 evtest # 選擇對應設備編號觸發按鍵后觀察終端輸出&#xff0c;正常情況應顯示&#xff1a; Event:…

USB學習【13】STM32+USB接收數據過程詳解

目錄 1.官方的描述2.HAL的流程把接收到的數據從PMA拷貝到用戶自己定義的空間中 3.處理接收到的數據4.最后再次開啟準備接收工作 1.官方的描述 2.HAL的流程 以上的官方說法我們暫時按下不表。 如果接收到數據&#xff0c;會激活中斷進入到USB_LP_CAN1_RX0_IRQHandler&#xff0…

上海內推 | 上海算法創新研究院-上海交大聯合招收空間智能/具身智能算法實習生

最近這一兩周不少公司已開啟春招和實習招聘。 不同以往的是&#xff0c;當前職場環境已不再是那個雙向奔赴時代了。求職者在變多&#xff0c;HC 在變少&#xff0c;崗位要求還更高了。 最近&#xff0c;我們又陸續整理了很多大廠的面試題&#xff0c;幫助一些球友解惑答疑&am…

C語言速成12之指針:程序如何在內存迷宮里找寶藏?

程序員Feri一名12年的程序員,做過開發帶過團隊創過業,擅長Java、鴻蒙、嵌入式、人工智能等開發,專注于程序員成長的那點兒事,希望在成長的路上有你相伴&#xff01;君志所向,一往無前&#xff01; 0. 前言&#xff1a;程序如何在內存迷宮里找寶藏&#xff1f; 想象內存是一個巨…

部署n8n

https://github.com/n8n-io/n8n docker volume create n8n_data docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n Discover 2192 Automation Workflows from the n8ns Community

ABP VNext + Orleans:Actor 模型下的分布式狀態管理最佳實踐

ABP VNext Orleans&#xff1a;Actor 模型下的分布式狀態管理最佳實踐 &#x1f680; &#x1f4da; 目錄 ABP VNext Orleans&#xff1a;Actor 模型下的分布式狀態管理最佳實踐 &#x1f680;一、引言&#xff1a;分布式系統的狀態挑戰 &#x1f4a1;二、架構圖與技術棧 &am…

構建安全AI風險識別大模型:CoT、訓練集與Agent vs. Fine-Tuning對比

構建安全AI風險識別大模型:CoT、訓練集與Agent vs. Fine-Tuning對比 安全AI風險識別大模型旨在通過自然語言處理(NLP)技術,檢測和分析潛在的安全威脅,如數據泄露、合規違規或惡意行為。本文從Chain-of-Thought (CoT)設計、訓練集構建、以及Agent-based方法與**AI直接調優…

Baklib內容中臺的主要構成是什么?

Baklib內容中臺核心架構 Baklib作為一站式知識管理平臺的核心載體&#xff0c;其架構設計圍繞智能搜索引擎優化技術與多終端適配響應系統展開。通過模塊化內容組件的靈活配置&#xff0c;企業可快速搭建知識庫、FAQ頁面及幫助中心等標準化場景&#xff0c;同時借助可視化數據看…