一、STM32 环境光传感器模块
TEMT60000光传感器把光信号转变成为电信号,PA作为模拟输入,接收光传感器的电压,
将PA4设置成ADC
二、Stm32CubeMx配置ADC
打开PA4并使能ADC1通道9
配置完ADC之后,GPIO模式自动为模数转换模式
使能外部高速时钟
配置时钟
不要让ADC时钟超过14MHz,否则可能不准
ADC参数设置
配置USART1为异步模式
PA10和PA9被使能作为串口的收发端
生成代码
三、Keil编写程序
在uart.c中做printf、scanf的重定向以便于串口通信
#include
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive(&huart1,(uint8_t *)&ch,1,0xfff);
return ch;
}
在adc.c中有ADC的初始化void MX_ADC1_Init(void),和在STM32CubeMx配置的一样,ADC的配置也可在这修改
定义变量用于保存ADC采样值
int ADC_value = 0 ;
float voltage = 0 ;
在while(1)里
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1); //开始ADC转换
HAL_ADC_PollForConversion(&hadc1,100); //等待ADC转换完成,第二个参数表示超时时间,单位ms
ADC_value = HAL_ADC_GetValue(&hadc1);//获取ADC采样值
voltage = (float)(value *3.3/4096);//ADC采样值到电压的转换
printf("Light voltage:%.3frn",voltage);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
ADC采样值到电压的转换:
ADC12位分辨率,也就是说ADC模块读到的数据是12位的数据。。二进制的12位可表示0-4095个数。 电压值 = ADC采样值*(3.3V/4096)
右键我的电脑选择管理,进入计算机管理界面,在设备管理器的端口可以看到串口的端口为COM4
远程连接工具串口连接要选择一样的参数
然后就可以看到串口打印出来的电压值
用手机手电筒照到环境光传感器可以看到电压变化
关键字:STM32 环境光传感器 ADC采样
引用地址:
STM32 环境光传感器ADC采样
推荐阅读最新更新时间:2024-11-04 18:00
STM32_ SPI读写Flash
今天讲解“STM32F103SPI读写Flash”,其实这第一阶段主要是讲解STM32的SPI功能,所有今天的重点是SPI,关于FLASH我应该要在后面再次讲述。 今天提供并讲解的软件工程,基于软件工程“A0.0.0(STM32F10x_TIM延时)”修改而来。若不知道如何而来,请关注微信公众号“EmbeddDeveloper”获取更多信息。 本着免费分享的原则,将讲解的工程源代码分享给大家,还望看到的朋友关注和推广一下微信公众号,增加一下人气。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cP
[单片机]
单片机ADC采样算法----限幅滤波法
限幅滤波法就是通过软件来限制本次采样值的上次采样值的偏差,若本次采样值和上次采样值的偏差超过了设定的最大偏差值,则丢弃本次的采样值。 下面看C代码的实现 //返回两个整数差 unsigned int num_sub( unsigned int a, unsigned int b ) { return ( a = b ? ( a - b ) : ( b - a ) ); } #define A 200 //允许最大误差值 unsigned int filter1( void ) { static unsigned int value; unsigned int new
[单片机]
采用STM32 单片机的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功
[电源管理]
STM32系列第32篇--NRF24L01无线通信
简介: NRF24L01是NORDIC公司生产的一款无线通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。 NRF24L01采用SPI通信,可以很方便的连接到MCU上面。 特点: 2.4G全球开放的ISM频段,免许可证使用。 最高工作速率2Mbps,高效的GFSK调制,抗干扰能力强。 126个可选的频道,满足多点通信和调频通信的需要。 内置CRC检错和点对多点的通信地址控制。 可设置自动应答,确保数据可靠传输。 模块引脚介绍: CE:模式控制线。在 CSN为低电平的情况下,CE 协同CONFIG
[单片机]
STM32中USART串口通讯:RS232,RS485
作为单片机开发,经常使用的协议,进行程序的正确性的测试使用。但其实I2C,SPI(串行通信使用最多)在各个器件中使用最多,后面再复习。8位,16位并行通讯也使用多。USART使用也多,蓝牙转串口,wifi转串口这2个模块就是使用USART口实现的,你只需要配置好波特率,分频等一些参数。再使用数据缓存寄存器接收发送就可以使用这2个模块了。(但是这2个模块前提是集成了程序例如:我使用过的蓝牙转串口,用户名,密码都集成进去了,只需要对串口引脚:RXD,TXD数据操作即可。) 废话不多说,复习USART通信协议: USART是异步方式进行通信(一条数据输入线,一条数据输出线),与SCI协议相同。 起始位+8位数据+奇偶
[单片机]
【STM32平衡小车】STM32定时器配置为编码器模式
一、编码器原理 如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距离、如果再加上定时器的话还可以计算出速度。 二、为什么要用编码器 从上图可以看出,由于TI1,TI2一前一后有个90度的相位差,所以当出现这个相位差时就表示轮子旋转了一个角度。但有人会问了:既然都是脉冲,为什么不用普通IO中断?实际上如果是轮子一直正常旋转当然没有问题。仔细观察上图,如果出现了毛刺呢?这就是需要我们在软件中编写算法进行改正。于是,我们就会想到如果有个硬件能够处理这种情况那不是挺好吗? 对应的硬件的编码器就来
[单片机]
STM32学习之路-外部中断(2)
继续上篇的内容. 配置好外部中断源以后, 就得使能外部中断线了. 为了方便看再借下这个图: 对外部中断的使能其实就是配置上面这些寄存器.即使能哪EXIT线,选择上面模式,是中断还是事件,选择下降沿还是上升沿. 具体怎么写寄存器这就不研究了, = = 太麻烦了.. 直接用STM32的库就行了,来看看它的代码吧 这是EXTI结构体的初始化函数, void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) { EXTI_InitStruct- EXTI_Line = EXTI_LINENONE; EXTI_InitStruct- EXTI_Mode = EXTI
[单片机]
STM32-GPIO口设为外部中断时,中断函数名称
以A口为例,A0~A4中断函数名称为: void EXTI0_IRQHandler(void ); void EXTI1_IRQHandler(void ); void EXTI2_IRQHandler(void ); void EXTI3_IRQHandler(void ); A5~A9: void EXTI9_5_IRQHandler(void ); A10~A15: void EXTI15_10_IRQHandler(void );
[单片机]