| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 太阳能心率智能骑行仪(STM32) -> 正文阅读 |
|
[嵌入式]太阳能心率智能骑行仪(STM32) |
光guan是用本文章讲解一下:太阳能心率智能骑行仪的部分软硬件。 主控使用:STM32C8T6RC 下面是要求实现的功能: 制作一款能实现太阳能充电的智能骑行仪,完成行驶过程中的即时速度/平均速度显示,总里程数显示,时间显示,实时心率显示,夜间行车自动开灯等。 主要研究内容和工作如下:(1)显示电量不足时,通过光照自动充电;有光线,即充电; (2)显示屏上能显示即时速度,平均速度,总里程数; (3)显示当前时间,断电后系统时间保持持续更新; (4)增加照明功能,当行驶环境变暗后,自动开启照明灯; (5)自行车把手增加心率检测电极,用于实时监测心率。当设定目标心率达到后进行声音报警;(可采用按键或实现蓝牙连接设置目标心率) 太阳能充电部分:使用CN3791 MPPT模块,选择对应规格的太阳能板,以及对应的锂电池。 在检测到光照部分时候,有光照则CN3791 MPPT模块则能够通过LED充电指示灯,来显示是否进行了充电。在断电期间,则使用锂电池通过BAT和GND引脚输出对应电压。如下为模块图: ?接口部分解释:SOLAR IN接入太阳能板,作者使用了6V的太阳能充电板,BAT引脚接入PH2.0接口的锂电池,之后通过OK指示灯进行充电的判断。BAT和GND引脚用来给其他外设和硬件电路进行供电。 速度测量:使用3144霍尔传感器。模块图如下: 接口:VCC GND A0 D0 ,供电3.3-5V,A0引脚采集模拟电压,D0采集数字信号。 使用要在轮子上或者被测对象上,粘上一个磁铁,通过霍尔传感器在轮子转动一圈,则能够在磁铁部分收到一个脉冲信号,进而单片机内部进行计数。通过定时器进行卡好对应阈值,在一个阈值中检测到的脉冲数量。阈值/脉冲数量,则为轮子在对应时间内的转动次数。 转速计算公式: 𝑠𝑝𝑒𝑒𝑑 = (𝑡𝑖𝑚𝑒1 ? 2 ? 𝛱 ? 𝑑)/𝑇1 里程数计算公式: 𝑚𝑖𝑙𝑒𝑎𝑔𝑒 = 𝑡𝑖𝑚𝑒2 ? 2 ? 𝛱 ? d 其中 time1 为一个周期内检测到的车轮转动的圈数;d 为车轮的半径;time2 是一个周 期内检测到的车轮旋转的圈数;T1 为单片机定时器定时的时间;speed 为车轮旋转的瞬时 速度;mileage 为总共行驶的里程数;Tim_prescaler 为时钟预分频数;TIM_period 为时 钟的技术次数;systick 是主控的时钟频率,因为主晶振为 8Mhz 通过了倍频到 72Mhz,因此 systick 数值为 72Mhz。 代码部分: 外部中断初始化:3144传感器,接在了PB12口上。
?定时器初始化:(设置阈值时间)
定时器中断计算:
实时时钟:使用DS3231模块,通过IIC协议进行数据的读写。同时内部集成了AT24C32作为内部的存储芯片。最大速度是400Khz。 ? ? ? 使用该实时时钟需要考虑的是初始数据的设置,默认的实时时钟为系统的出厂设置, 因此需要在第一次烧录的时候要将设计初始时间,通过软件 IIC 写入 AT24C32 中,更新 系统时间,之后 DS3231 在此基础上通过内部计时来完成时间的记录,并且将其数据实 时更新到 AT24C32 中,通过查询该模块的芯片手册能够获得 DS3231 的数据写地址为 1101 0000,数据读地址为 1101 0001,因此通过 IIC 来对该地址进行读写操作,则能够实 现实时时钟的功能。 初次使用,写入一次数据,之后通过读取即可,匹配IIC协议就行。代码部分不放了,太多了,淘宝买模块,都有的。 也可以使用STM32的时钟RTC进行实时时钟,我这边没有使用。RTC代码正点原子那部分有讲解。B站都有视频。 照明功能该部分,使用光敏电路部分,通过光敏电阻和电压比较器进行输出。单片机负责检测电压比较器出来的结果,如果是0则开启灯光,如果是1则关闭灯光,基本的模拟电路就可以实现。电路图如下: 如果要是驱动大功率灯,需要外部供电和通过继电器的方式来进行控制。 这边写了一个简单的控制:(控制普通的LED灯作为了模拟)。 代码: 配置对应的光敏信号接口初始化。
?光敏控制部分:B6是对应的光敏接口。通过这个口进行读取光敏信号。PA6接LED灯.
电压测量:使用ADC内部的12位高精度的ADC进行电池电压的测量和采集。 考虑到 STM32 上的内部基准电压位 3.3V,最大只可 以测量到 3.3V 的电压,18650 充满电电压达到 4. 2V,因此本设计中使用两个分压电阻 作为分压,在之后程序中根据分压比例乘以对应的分压系数,从而得到对应的电压数值。 为了确保数据转换的稳定性,本设计中使用 ADC 采样时间 239.5 个周期。 其中 SamplTime 是 ADC 采样周期;𝑉???是 ADC 采样的内部基准电压为 3.3V,Value 是单片机 ADC 转换后的数值;n 为单片机 ADC 的位数。 之后将其获得的电压值,通过硬件电路上的分压电阻,获得 ADC 计算电压的分压 系数,通过软件算法将获得 ADC 数值计算之后的电压数值乘以分压系数,最后能够获 得当前电池的实际电压,从而实现了 ADC 电压测量范围的扩大。 代码部分:
心率检测部分:使用了pulse sensor 原理:心率指的是人在一分钟以内心跳的次数,得到的心率数值最简单的方法就是计数一 个人在一分钟之内检测到了多少次的脉搏数。如果本设计采用这种方法,那么将无法及 时的得到心率数值,而且这种方法采集心率效率特别低。因此本设计采用了另外一种方 式来实时的采集心率数值:测量两次脉搏的时间间隔,之后用一分钟除以两次脉冲信号 之间的时间差,间接得到个体的心率实时数据。 首先计算实时心率数值要引入 IBI 和 BPM 两个概念,其中 IBI 指代两次脉搏之间 特征点的时间间隔数值,BPM 指代的是一个人在一分钟之内的心跳次数。并且两者之间 的换算关系为:BPM = 60/IBI。 脉搏信号波形图 ?脉搏信号阈值波形图 通过检测脉搏信号获得到的则是一个波形图,但是计算则需要的是一个 IBI 的数值 点,因此需要通过从一段一段的波形中选取一个点,称之为该脉搏信号上的特征点。这 一个脉搏信号特征点代表了一个有效的脉搏信号,通过检测两个相邻的特征点并且做差, 则能够获得到对应的 IBI 数值,之后通过 IBI 和 BPM 两者之间的换算关系从而能够实 时的获得到当前心率值。在本设计中则是选取当信号上升到振幅的一半时,将该点作为 了这一个脉冲信号的特征点。? 代码部分: 通过ADC来进行脉冲之间的信号采集,之后做动态阈值的检测,之后通过以上算法来对数据进行处理。(这里一般处理出来的信号很飘的,需要滤波,并且波形图容易收到很大的影响)。 为啥不用MAX30102,我试过那个官方算法,数据完全不稳定的。可能是我实力有限,个人问题把。 Pulse sensor结果: 没有检测到信号时: 结果展示: ? ? ?上位机部分,以后再讲咋做。图我先不放了,因为有我个人的信息在上面。emmm以后在更新。以下是各个功能的结果图。如果有问题的,可以问我,我有空会解答的。最近摸的嵌入式内容比较少,大部分时间在做深度学习和机器学习部分的。 代码部分:我不提供完成的全套代码, 因为代码中,涉及到我的许多个人信息,不太方便,提供大家一个思路。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:06:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |