原理

通过 ADC3 通道 6 采集光敏传感器的AD 值,并将该值转换为光照度值 0-100,0 对应最暗,100 对应最亮,并通过串口1输出光照强度值

步骤

  1. 编写USART驱动程序(STM32F1系列通用)

    1. 将固件库文件stm32f10x_usart.c添加至工程
    2. 编写头文件:函数声明
    3. 编写驱动文件:
      1. 初始化函数:

        1. 使能端口时钟,串口时钟:RCC_APB2PeriphClockCmd
        2. 配置GPIO口Tx、Rx引脚:GPIO_InitTypeDef
        3. 配置串口:波特率、字长、停止位、校验位
        4. 使能串口:USART_Cmd(USART1, ENABLE)
      2. fputc函数覆写:printf中循环调用fputc
  2. 编写光敏传感器驱动程序
    1. 将固件库文件stm32f10x_adc.c添加至工程
    2. 编写头文件:函数声明
    3. 编写驱动文件:
      1. 初始化函数:

        1. 开启端口时钟,ADC时钟
        2. 设置ADC分频因子
        3. 配置引脚,ADC3通道6对应PF8
        4. 配置ADC
        5. 开启ADC并复位校准
      2. 获取ADC转换值函数:
        1. 规则通道设置
        2. 软件触发ADC转换
        3. 返回转换值
      3. 获取光强度值函数:
        1. 获取ADC转换值
        2. (u8)(100-(temp/40)转换为光强度值
  3. 主函数:初始化串口,初始化滴答定时器,初始化光敏传感器,定时获取光强度值

代码

//usart.h#ifndef _usart_H
#define _usart_H#include "system.h"void USART1_Init(u32 bound);#endif//usart.c#include "usart.h"
#include "stdio.h"//printf重定向,printf中循环调用fputc
int fputc(int ch, FILE* p)
{USART_SendData(USART1, (u8)ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);//发送数据寄存器为空,已传至发送移位寄存器,但不一定发送完成return ch;
}void USART1_Init(u32 bound)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;//开启端口时钟、串口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//配置Tx引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//配置Rx引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//配置串口USART_InitStructure.USART_BaudRate = bound;//波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位USART_InitStructure.USART_Parity = USART_Parity_No;//校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//工作模式USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE);//使能串口}
//lsens.h
#ifndef _lsens_H
#define _lsens_H#include "stm32f10x.h"void Lsens_Init(void);
u16 Get_ADC3_Value(u8 channel);
u8 Lsens_Get_Value(void);#endif//lsens.c
#include "lsens.h"
#include "SysTick.h"void Lsens_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;//开启端口时钟,ADC3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_ADC3, ENABLE);//设置ADC的分频因子,确保ADCCLK不要超过14Mhz,72/6=12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC3通道6对应PF8GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;//关闭扫描模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//关闭外部触发,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道数ADC_Init(ADC3, &ADC_InitStructure);//开启ADC并且复位校准才能正常工作ADC_Cmd(ADC3, ENABLE);ADC_ResetCalibration(ADC3);//复位校准while(ADC_GetResetCalibrationStatus(ADC3));ADC_StartCalibration(ADC3);//校准while(ADC_GetCalibrationStatus(ADC3));}u16 Get_ADC3_Value(u8 channel)
{//规则通道设置(ADC,输入通道,转换顺序第1个,采样时间)ADC_RegularChannelConfig(ADC3, channel, 1, ADC_SampleTime_239Cycles5);ADC_SoftwareStartConvCmd(ADC3, ENABLE);//软件触发ADC转换while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC));//等待转换结束return ADC_GetConversionValue(ADC3);//返回最近一次ADC3规则组的转换结果
}u8 Lsens_Get_Value(void)
{u32 temp;for(u8 i=0; i<10; i++){temp += Get_ADC3_Value(ADC_Channel_6);delay_ms(5);}temp = temp / 10;if(temp>4000)temp=4000;return (u8)(100-(temp/40));
}
//main.c#include "usart.h"
#include "Systick.h"
#include "lsens.h"int main()
{SysTick_Init(72);//延时USART1_Init(115200);//串口调试Lsens_Init();//初始化ADCwhile(1){printf("光照强度 = %d\r\n", Lsens_Get_Value());delay_ms(1000);//每秒读取一次ADC转换值 }
}

STM32基础(11)光敏传感相关推荐

  1. STM32 基础系列教程 11 – ADC 轮询

    前言 学习stm32 adc模数转换接口使用,学会用STM32对模拟信号时行采样,通过轮询模式得到ADC结果. 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM ...

  2. STM32 基础系列教程 41 – SDMMC

    前言 SDIO(Secure Digital Input and Output) 安全数字输入输出接口,它支持多种类型的MMC卡,如SD卡,SDIO卡,MMC卡等.STM32 的SD/SDIO MMC ...

  3. STM32 基础系列教程 24 - USB_HID_key

    前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开 ...

  4. 【正点原子STM32连载】第五章 STM32基础知识入门 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  5. STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集

    STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...

  6. 『Python基础-11』集合 (set)

    # 『Python基础-11』集合 (set) 目录: 集合的基本知识 集合的创建 访问集合里的值 向集合set增加元素 移除集合中的元素 集合set的运算 1. 集合的基本知识 集合(set)是一个 ...

  7. STM32 基础系列教程 50 – MbedTls

    前言 mbed TLS(以前称为PolarSSL)是TLS和SSL协议的实现,并且需要相应的加密算法和支持代码.这是双重许可与Apache许可证 2.0版(与GPLv2许可也可).网站上指出,mbed ...

  8. STM32 基础系列教程 49 – Jansson

    前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...

  9. STM32 基础系列教程 48 – CJSON

    前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...

  10. STM32 基础系列教程 47 - MD5

    前言 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信 ...

最新文章

  1. LSTM之父:吐槽了两年,来划划重点:“这5篇最高引论文都源于我们。”
  2. 维基链(WICC)当前币值应该还远远没有达到它本身应有的高度
  3. 如何扛住1.8亿/秒的双11数据洪峰?阿里流计算技术全揭秘
  4. 动态规划 —— 数位 DP
  5. margin系列之负值
  6. 阿里云迎来 2.0,重新定义软件系统应用开发方式
  7. module 'inn' not found:No LuaRocks module found for inn
  8. 台湾厂商:大陆投资DRAM工厂可能破坏全球市场
  9. python爬虫 动作链进阶
  10. C++ opencv人脸识别框
  11. java调用系统对话框,[求助]Swing如何调用通用对话框
  12. 在iOS设备上安装Windows、Linux等操作系统!
  13. 冲压模具中的回弹解决办法
  14. java dh_java DH加密算法备忘
  15. 波音 737 连续坠毁,AI 要背锅?
  16. 人民币终于大幅度贬值说明什么
  17. LaTex 连字符多篇连续引用
  18. 8位并行输入串行输出的移位寄存器的Verilog描述
  19. 【福利分享】阿里面试官叫我手写HashMap,我两分钟就给他整出来了!!!
  20. JAVA编程实战之编写小游戏-大球吃小球(eat ball game)

热门文章

  1. 德勤2022技术趋势:IT自我颠覆、技术跨界融合创新
  2. 我奋斗了18年,不是为了和你一起喝咖啡(转)
  3. 隐患重重遭诟病 细数固态硬盘“七宗罪”
  4. Charles系列破解激活License
  5. PL2303GC USB到串行桥控制器 Prolific旺玖
  6. ArrayList源码学习第二天全解
  7. 中科院计算机跨专业考研,往届生跨考北航计算机经验心得
  8. GPS模块和北斗的区别
  9. 密码学系列之:生日攻击
  10. java全文检索工具_TRS全文检索开发文档及API,工具包