硬件配置
單片機型號:STM32F103C8
屏幕:0.96寸OLED屏
傳感器:光照傳感器(ADC采集)
功能實現
光照強度采集ADC方式采集,STM32F103本身自帶有硬件ADC功能。將采集到的數據實時刷新到屏幕上即可完成波形顯示。
0.96寸OLED分辨率為128*64(128列,64行)。我們可以定義一個數組buff[128],數組下標作為橫坐標,數組中的值作為縱坐標。這樣即可把采集到的值實時刷新即可。由于需要先采集的數據先顯示,這樣就可以采用環形隊列特性實現波形顯示。
功能實現:
int main()
{
u8 cnt=40;
u8 buff[20];
Beep_Init();//蜂鳴器初始化
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20000);//通過定時器2輔助串口接收數據,20ms
OLED_Init();//OLED初始化
OLED_Display_Font(8,0,16,5);//光
OLED_Display_Font(8+16,0,16,6);//照
OLED_Display_Font(8+16*2,0,16,7);//強
OLED_Display_Font(8+16*3,0,16,8);//度
OLED_Refresh_PageGram();
ADC1_InjectionChannel_Init();
printf("串口初始化完成\r\n");
while(1)
{
ADC1->CR2|=1<<21;//開啟注入通道轉換
Delay_Ms(1);
while(adc.adc_len)
{
OLED_RowGram_Clear(adc.r);
OLED_DrawPoint(adc.r,adc.buff[adc.r],1);
adc.r=(adc.r+1)%ADC_LEN;
adc.adc_len--;//緩沖區長度-1
}
OLED_RefreshGram();//更新數據到屏幕
cnt++;
if(cnt>=40)
{
cnt=0;
snprintf((char *)buff,20,"%d",ADC_Data);
OLED_Display_str(16+16*4,0,16,buff);//顯示光照值
OLED_Display_Font(8,0,16,5);
OLED_Display_Font(8+16,0,16,6);
OLED_Display_Font(8+16*2,0,16,7);
OLED_Display_Font(8+16*3,0,16,8);
OLED_Refresh_PageGram();//更新數據到屏幕
}
}
}
硬件ADC配置:
#include "adc.h"
/********************注入通道配置********************/
void ADC1_InjectionChannel_Init(void)
{
//1.開時鐘
RCC->APB2ENR|=1<<9;//ADC1時鐘
RCC->APB2ENR|=1<<3;//PB0時鐘
RCC->APB2RSTR|=1<<9;//ADC復位時鐘
RCC->APB2RSTR&=~(1<<9);//關復位
/*2.GPIO配置*/
GPIOB->CRL&=0xFFFFFFF0;//模式輸入方式
/*3.ADC時鐘頻率配置*/
RCC->CFGR&=~(0x3<<14);//清除原來配置
RCC->CFGR|=0x2<<14;//ADC工作頻率72MHZ/6=12MZH
/*4.配置ADC核心寄存器*/
// ADC1->CR1&=~(0xF<<16);//獨立模式
ADC1->CR1|=1<<8;//掃描模式
ADC1->CR2|=1<<23;//啟動溫度傳感器(測量CPU溫度)
ADC1->CR2|=1<<15;//注入通道外部觸發轉換模式
ADC1->CR2|=0x7<<12;//注入通道事件方式啟動轉換
// ADC1->CR2&=~(1<<11);//右對齊(地位對齊,高位補0)
ADC1->SMPR1|=0x7<<18;//溫度傳感器采樣時間通道16
ADC1->SMPR2|=0x2<<24;//通道8采用時間
// ADC1->CR2&=~(1<<1);//單次轉換模式
ADC1->JSQR|=0x1<<20;//注入通道轉換序列的通道數為2
/*設置要轉換通道*/
ADC1->JSQR&=~(0x1F<<15);//清除原來寄存器中值
ADC1->JSQR|=(8<<15);
ADC1->JSQR&=~(0x1F<<10);//清除第三個注入序列中的值
ADC1->JSQR|=(16<<10);
/*開中斷*/
ADC1->CR1|=1<<7;//開啟注入通道中斷
STM32_NVIC_SetPriority(ADC1_2_IRQn,1,1);//設置優先級
ADC1->CR2|=1<<0;//開啟ADC
ADC1->CR2|=1<<3;//初始化校準
while(ADC1->CR2&1<<3);//等待初始化校準完成
ADC1->CR2|=1<<2;//開始校準
while(ADC1->CR2&1<<2){}//等待校準完成
}
/************ADC中斷服務函數*******************/
u16 ADC_Data=0;
ADC_DATA adc;//獲取的光照強度結構體數據
void ADC1_2_IRQHandler(void)
{
u16 data;
if(ADC1->SR&1<<2)//注如通道轉完成標志
{
ADC_Data=ADC1->JDR2;
data=10+ADC_Data*(64.0/4095.0);
if(data>63)data=63;//保證ADC采集的值為10~63,保證和屏幕高度一致
adc.buff[adc.w]=data;//寫入數據到緩沖區
adc.w=(adc.w+1)%ADC_LEN;
adc.adc_len++;
}
ADC1->SR=0;
}
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
單片機
+關注
關注
6037文章
44558瀏覽量
635227 -
adc
+關注
關注
98文章
6498瀏覽量
544629 -
STM32F103C8
+關注
關注
1文章
23瀏覽量
8088
發布評論請先 登錄
相關推薦
STM32F103控制ad7606采集程序分享
本文首先分析了了stm32f103系列的性能如何,其次介紹了ad7606特性,最后介紹了STM32F103控制ad7606采集程序。
BH1750光強度傳感器Stm32f103驅動的相關資料推薦
1. 實驗:Stm32f103 驅動 bh1750采集光照強度,串口打印采集到的數據。2. 實驗準備器材 開發版:stm32f103c8t6
發表于 01-18 07:02
如何基于STM32F103對4路ADCDMA進行改進的詳細資料概述
本文的主要內容詳細介紹了基于STM32F103的4路ADC采集用的DMA進行改進的詳細資料概述
發表于 06-04 10:00
?12次下載
使用STM32F103單片機采集16路ADC的工程文件和程序免費下載
本文檔的主要內容詳細介紹的是使用STM32F103單片機采集16路ADC的工程文件和程序免費下載。
發表于 09-26 08:00
?32次下載
GD32F103與STM32F103的區別 2021.6.2
GD32F103和STM32F103區別介紹關鍵詞Key words:GD32F103、STM32F103摘要Abstract:本文主要是GD32F
發表于 12-08 11:06
?83次下載
評論