硬件配置
单片机型号: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;
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6030文章
44504浏览量
632305 -
adc
+关注
关注
98文章
6417浏览量
543890 -
STM32F103C8
+关注
关注
1文章
23浏览量
8069
发布评论请先 登录
相关推荐
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
•31次下载
GD32F103与STM32F103的区别 2021.6.2
GD32F103和STM32F103区别介绍关键词Key words:GD32F103、STM32F103摘要Abstract:本文主要是GD32F
发表于 12-08 11:06
•82次下载
评论