硬件配置
單片機(jī)型號(hào):STM32F103C8
屏幕:0.96寸OLED屏
傳感器:光照傳感器(ADC采集)
功能實(shí)現(xiàn)
光照強(qiáng)度采集ADC方式采集,STM32F103本身自帶有硬件ADC功能。將采集到的數(shù)據(jù)實(shí)時(shí)刷新到屏幕上即可完成波形顯示。
0.96寸OLED分辨率為128*64(128列,64行)。我們可以定義一個(gè)數(shù)組buff[128],數(shù)組下標(biāo)作為橫坐標(biāo),數(shù)組中的值作為縱坐標(biāo)。這樣即可把采集到的值實(shí)時(shí)刷新即可。由于需要先采集的數(shù)據(jù)先顯示,這樣就可以采用環(huán)形隊(duì)列特性實(shí)現(xiàn)波形顯示。


功能實(shí)現(xiàn):
int main()
{
u8 cnt=40;
u8 buff[20];
Beep_Init();//蜂鳴器初始化
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20000);//通過(guò)定時(shí)器2輔助串口接收數(shù)據(jù),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);//強(qiáng)
OLED_Display_Font(8+16*3,0,16,8);//度
OLED_Refresh_PageGram();
ADC1_InjectionChannel_Init();
printf("串口初始化完成\r\n");
while(1)
{
ADC1->CR2|=1<<21;//開(kāi)啟注入通道轉(zhuǎn)換
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--;//緩沖區(qū)長(zhǎng)度-1
}
OLED_RefreshGram();//更新數(shù)據(jù)到屏幕
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();//更新數(shù)據(jù)到屏幕
}
}
}
硬件ADC配置:
#include "adc.h"
/********************注入通道配置********************/
void ADC1_InjectionChannel_Init(void)
{
//1.開(kāi)時(shí)鐘
RCC->APB2ENR|=1<<9;//ADC1時(shí)鐘
RCC->APB2ENR|=1<<3;//PB0時(shí)鐘
RCC->APB2RSTR|=1<<9;//ADC復(fù)位時(shí)鐘
RCC->APB2RSTR&=~(1<<9);//關(guān)復(fù)位
/*2.GPIO配置*/
GPIOB->CRL&=0xFFFFFFF0;//模式輸入方式
/*3.ADC時(shí)鐘頻率配置*/
RCC->CFGR&=~(0x3<<14);//清除原來(lái)配置
RCC->CFGR|=0x2<<14;//ADC工作頻率72MHZ/6=12MZH
/*4.配置ADC核心寄存器*/
// ADC1->CR1&=~(0xF<<16);//獨(dú)立模式
ADC1->CR1|=1<<8;//掃描模式
ADC1->CR2|=1<<23;//啟動(dòng)溫度傳感器(測(cè)量CPU溫度)
ADC1->CR2|=1<<15;//注入通道外部觸發(fā)轉(zhuǎn)換模式
ADC1->CR2|=0x7<<12;//注入通道事件方式啟動(dòng)轉(zhuǎn)換
// ADC1->CR2&=~(1<<11);//右對(duì)齊(地位對(duì)齊,高位補(bǔ)0)
ADC1->SMPR1|=0x7<<18;//溫度傳感器采樣時(shí)間通道16
ADC1->SMPR2|=0x2<<24;//通道8采用時(shí)間
// ADC1->CR2&=~(1<<1);//單次轉(zhuǎn)換模式
ADC1->JSQR|=0x1<<20;//注入通道轉(zhuǎn)換序列的通道數(shù)為2
/*設(shè)置要轉(zhuǎn)換通道*/
ADC1->JSQR&=~(0x1F<<15);//清除原來(lái)寄存器中值
ADC1->JSQR|=(8<<15);
ADC1->JSQR&=~(0x1F<<10);//清除第三個(gè)注入序列中的值
ADC1->JSQR|=(16<<10);
/*開(kāi)中斷*/
ADC1->CR1|=1<<7;//開(kāi)啟注入通道中斷
STM32_NVIC_SetPriority(ADC1_2_IRQn,1,1);//設(shè)置優(yōu)先級(jí)
ADC1->CR2|=1<<0;//開(kāi)啟ADC
ADC1->CR2|=1<<3;//初始化校準(zhǔn)
while(ADC1->CR2&1<<3);//等待初始化校準(zhǔn)完成
ADC1->CR2|=1<<2;//開(kāi)始校準(zhǔn)
while(ADC1->CR2&1<<2){}//等待校準(zhǔn)完成
}
/************ADC中斷服務(wù)函數(shù)*******************/
u16 ADC_Data=0;
ADC_DATA adc;//獲取的光照強(qiáng)度結(jié)構(gòu)體數(shù)據(jù)
void ADC1_2_IRQHandler(void)
{
u16 data;
if(ADC1->SR&1<<2)//注如通道轉(zhuǎn)完成標(biāo)志
{
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;//寫(xiě)入數(shù)據(jù)到緩沖區(qū)
adc.w=(adc.w+1)%ADC_LEN;
adc.adc_len++;
}
ADC1->SR=0;
}
-
單片機(jī)
+關(guān)注
關(guān)注
6058文章
44822瀏覽量
644726 -
adc
+關(guān)注
關(guān)注
99文章
6611瀏覽量
547738 -
STM32F103C8
+關(guān)注
關(guān)注
1文章
23瀏覽量
8235
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32F103控制ad7606采集程序分享
STM32采集光照強(qiáng)度顯示波形硬件配置
BH1750光強(qiáng)度傳感器Stm32f103驅(qū)動(dòng)的相關(guān)資料推薦
基于stm32f103的數(shù)據(jù)采集
如何基于STM32F103對(duì)4路ADCDMA進(jìn)行改進(jìn)的詳細(xì)資料概述
使用STM32F103單片機(jī)采集16路ADC的工程文件和程序免費(fèi)下載

GD32F103與STM32F103的區(qū)別 2021.6.2

STM32采集光照強(qiáng)度顯示波形

學(xué)習(xí)STM32F103的ADC功能

評(píng)論