0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

采用STM32F103硬件ADC功能进行光照强度采集

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-05-31 11:32 次阅读

硬件配置

单片机型号STM32F103C8
屏幕:0.96寸OLED
传感器光照传感器(ADC采集)

功能实现
光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。
0.96寸OLED分辨率为128*64(128列,64行)。我们可以定义一个数组buff[128],数组下标作为横坐标,数组中的值作为纵坐标。这样即可把采集到的值实时刷新即可。由于需要先采集的数据先显示,这样就可以采用环形队列特性实现波形显示。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_centerpoYBAGKVjAqASijEAAsNlF_HczA081.png

功能实现:

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;
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43971

    浏览量

    620794
  • adc
    adc
    +关注

    关注

    95

    文章

    5648

    浏览量

    539439
  • STM32F103C8
    +关注

    关注

    1

    文章

    23

    浏览量

    8011
收藏 人收藏

    评论

    相关推荐

    stm32f103 ADC采集问题 ,着急!!!!求大神帮忙

    1.stm32f103 可以使用pd2进行ADC采集吗?2.如果不能,怎么映射到别的管脚?(硬件已经不能改动了)求大神帮助!!!
    发表于 06-29 11:50

    STM32采集光照强度显示波形硬件配置

    STM32采集光照强度显示波形硬件配置  单片机型号:STM32F103C8  屏幕:0.96寸OLED屏  传感器:
    发表于 08-18 06:58

    如何对STM32F103 ADC寄存器进行配置

    STM32F103系列有几个ADCSTM32F103系列的ADC主要特征有哪些?如何对STM32F103
    发表于 09-27 09:08

    GD32F103STM32F103硬件是怎样进行替换的

    GD32F103STM32F103硬件有什么区别?GD32F103STM32F103硬件
    发表于 10-15 07:25

    如何去实现STM32采集光照强度显示波形?

    如何去实现STM32采集光照强度显示波形?
    发表于 11-23 07:15

    stm32f103ADC是如何去实现四路模拟信号采集

    12位ADC是什么?stm32f103ADC有何功能stm32f103ADC是如何去实现四
    发表于 12-14 07:35

    BH1750光强度传感器Stm32f103驱动的相关资料推荐

    1. 实验:Stm32f103 驱动 bh1750采集光照强度,串口打印采集到的数据。2. 实验准备器材 开发版:stm32f103c8t6
    发表于 01-18 07:02

    基于STM32光照强度传感器程序

    此程序利用STM32精确地测量光照强度传感器,程序可直接下直接用
    发表于 01-20 15:59 211次下载

    基于单片机的GY-30光照强度采集

    利用单片机写的关于光照强度采集
    发表于 11-05 11:42 105次下载

    stm32f103采集四路ADC并且显示到OLED上程序

    stm32f103采集四路ADC并且显示到OLED上程序
    发表于 01-16 18:07 181次下载

    如何基于STM32F103对4路ADCDMA进行改进的详细资料概述

    本文的主要内容详细介绍了基于STM32F103的4路ADC采集用的DMA进行改进的详细资料概述
    发表于 06-04 10:00 12次下载

    STM32采集光照强度显示波形

    STM32采集光照强度显示波形硬件配置  单片机型号:STM32F103C8  屏幕:0.96寸OLED屏  传感器:
    发表于 12-24 19:33 61次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>采集</b><b class='flag-5'>光照强度</b>显示波形

    用于stm32f103 A/D信号采集的处理

    用于stm32f103 A/D信号采集的处理
    发表于 08-01 18:13 3次下载

    基于51单片机的光照强度系统设计

    本次光照强度系统使用的是STC89C52单片机作为主控芯片,通过光敏电阻模块进行光照强度检测,通过ADC模块将模拟信号转换为数字信号,采集
    的头像 发表于 09-01 09:18 710次阅读
    基于51单片机的<b class='flag-5'>光照强度</b>系统设计

    学习STM32F103ADC功能

    三勺最近在学习STM32F103ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。
    的头像 发表于 10-24 16:06 957次阅读
    学习<b class='flag-5'>STM32F103</b>的<b class='flag-5'>ADC</b><b class='flag-5'>功能</b>