完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件配置
单片机型号:STM32F103C8 屏幕:0.96寸OLED屏 传感器:光照传感器(ADC采集) 功能实现 光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。 0.96寸OLED分辨率为128*64(128列,64行)。我们可以定义一个数组buff[128],数组下标作为横坐标,数组中的值作为纵坐标。这样即可把采集到的值实时刷新即可。由于需要先采集的数据先显示,这样就可以采用环形队列特性实现波形显示。关于环形队列的示例可以参考示例:https://blog.csdn.net/weixin_44453694/article/details/113502472 效果展示 代码示例 主函数 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; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
648浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 18:01 , Processed in 0.679343 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号