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

发布者:MysticGarden最新更新时间:2023-09-07 来源: elecfans关键字:STM32F103 手机看文章 扫描二维码
随时随地手机看文章

硬件配置


单片机型号:STM32F103C8

屏幕:0.96寸OLED屏

传感器:光照传感器(ADC采集)

1b3c2042b9828b4e3dac51b9f4405099_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center.jpg

4ebcc3ddd32227bc349aaad1563affd5_poYBAGKVjAqASijEAAsNlF_HczA081.png

功能实现

光照强度采集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("串口初始化完成rn");

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;

}


关键字:STM32F103 引用地址:采用STM32F103硬件ADC功能进行光照强度采集

上一篇:STM32L4单片机无法进入低功耗模式的原因及解决方法
下一篇:STM32CubeMx图形化配置工具的主要特征与安装教程

推荐阅读最新更新时间:2024-11-13 10:05

如何在STM32F103C8中使用中断
中断是一种机制,通过该机制,I/O 或指令可以暂停处理器的正常执行,并像具有最高优先级一样为自己提供服务。例如,执行正常执行的处理器也可以持续监视某种事件或中断的发生。也就是说,当发生外部中断(例如来自某些传感器)时,处理器暂停其正常执行并首先提供中断,然后继续其正常执行。 在本项目中,为了理解STM32F103C8中的中断,我们将使用按钮作为外部中断。在这里,我们将从 0 开始递增一个数字并将其显示在 16x2 LCD 上,每当按下按钮时,LED 就会亮起,LCD 显示屏就会显示中断。松开按钮后,LED 立即熄灭。 中断和 ISR 的类型 中断大致可分为两种类型: 硬件中断:如果发给处理器的信号来自某些外部设备(如按钮或
[单片机]
如何在<font color='red'>STM32F103</font>C8中使用中断
STM32F103 与 STM32F407引脚兼容问题
解决方案1: STM32F103有的功能407都有,并且这些功能的引脚完全兼容,只是程序不同而已。。。 而STM32F407有的功能103不一定有,因为407强大些。。。。。。希望对你有用 解决方案2: 不能。407支持摄像头,I2S等引脚,103都没有 解决方案3: 普通IO都一样,407有更多的附加功能。值得注意的是,407的电源引脚与103的有很大的区别,一定要注意!
[单片机]
STM32f103 定时器之编码器接口模式
背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数。这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数。阅读Arduino关于该编码器的介绍,该编码器还可以实现旋转的速度、加速度的计算。应该算是算法层级的吧,还没做到实际应用,暂时不深究,本篇仅仅对旋转编码器的原理以及STM32编码器接口模式的配置使用方法做个简介。 正文 编码器分类: 按工作原理:光电式、磁电式和触点电刷式; 按码盘的刻孔方式:增量式和绝对式两类; 这是从网上看到一个简介,只接触过Arduino的编码器,其他暂未使用过。 Arduino的编码器属于增量式。它一共有5根线。分
[单片机]
<font color='red'>STM32f103</font> 定时器之编码器接口模式
基于stm32f103zet6的FAT16文件系统学习4
本博文所用到的代码: http://download.csdn.net/detail/king_bingge/5739167 好几天没有写博客了,这几天都在忙挑战杯的事情,由于某些不和谐因素,昨天才开始准备今天的挑战杯答辩,虽然不知道结果是怎样的,但是个人感觉创新点还是有的,就是主评委老师拽着我们这个消费对象来说事,过去了就不再想了,也不知道能不能进入省赛,但是学习还是要继续的,今天总结的这个实验是实现从SD卡里面读bmp图片,bin图片,同时在将我制作的字库存放在SD卡中,从里面读取所需要的汉字,虽然之前早就实现了bmp图片读取和字库的读取,但是一直困扰我的就是bin格式的图片读取,今天下午花了些时间终于弄出来的,刷图是比bm
[单片机]
移植ds18b20到stm32f103遇到的问题
之前在AVR单片机上用过DS18B20温度传感器,现在需要在STM32F103平台下使用,就直接在原先的代码基础上做了相应修改,调试时遇到的问题是测量值总是显示127.9375(读取的温度数据为0x7fff),用示波器看波形也没有发现问题,以为是18B20出问题了,又回到AVR下测试,结果正常。后来发现,不同之处在于供电:AVR用的5V,而STM32是3.3V。把18B20的供电电压换成5V就能正常工作了。又测试了18B20用3.3V供电,DQ脚5V上拉,测量数据还是不对,而且与上拉电阻值无关。数据手册上明明写的供电电压3~5.5V,难道是管子的问题? 总结一下STM32与AVR单片机在使用DS18B20的区别。 1
[单片机]
STM32F103封装方式与功能配置
STM32F103封装主要包括LQFP48、LQFP100、LQFP64、VFQFPN36、BGA100 STM32F103管脚功能配置,引脚功能如下图所示:
[单片机]
<font color='red'>STM32F103</font>封装方式与功能配置
基于Cortex-M3和CAN的印染机同步控制系统设计
随着社会生活的发展,人们对现在的印染品的要求也越来越高,特别是布匹与包装外壳,那么对现代印染工艺的要求也越来越高。随着工艺的增加,对印染设备是个不小的挑战,这里面最主要的是大型印染联合机中多电机的同步控制问题。 在印染设备中,电机的同步控制主要有3方面决定:一是处理器对张力传感器数据的处理速度,以及电机对张力传感器的反应速度;二是不同的电机组之间机械性能的差异以及它们产生的实时同时控制问题;三是控制单元与各电机组之间的通信问题,包括速率,抗干扰等。传统印染联合机的做法是采用单片机加AD/DA芯片进行数据的处理与执行,也有为了提高数据的处理能力而采用DSP加单片机的做法。随着现在技术的发展,在研究了基于ARM的CORTEX-
[单片机]
基于Cortex-M3和CAN的印染机同步控制系统设计
STM32F103中的systick滴答时钟出错
STM32F103中的systick滴答时钟出现.ObjTemplate.axf: Error: L6218E: Undefined symbol SysTick_CLKSourceConfig (referred from systick.o).这种错误 解决方法: 意思就是SysTick_CLKSourceConfig()这个库函数未定义,这是因为没有添加misc.c这个库文件在你的外设驱动文件中、而SysTick_CLKSourceConfig()这个函数存在于后面提到的这个库文件里、解决过程如下 找到你的库文件的文件夹(个人不同、自己看自己的),双击进入Libraries文件夹— STM32F10x_StdPeriph
[单片机]
<font color='red'>STM32F103</font>中的systick滴答时钟出错
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved