课设 stm32的8路电压表采集系统
基于stm32的8路电压表
- 程序架构
- 连接阿里云
- 阿里云
- wifi
- mqtt
- 电压采集
- ADC
- 分压电路
- 声光报警
- 蜂鸣器及LED
- 蜂鸣器
- LED
- 串口屏
- 数据存储
- AT24C02
- 供电
程序代码及PCB
程序架构
我们使用嵌入式实时系统中的UCOS III作为框架,进行程序的开发。
UCOS III资料:UCOSIII简介
连接阿里云
阿里云
在本课设中,我们使用的是阿里云的物联网平台。阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。
详细介绍:什么是物联网平台
wifi
WiFi模块使用ESP8266,型号为安信可的ESP-12S,使用AT指令配置相关的功能。
esp8266资料:安信可ESP8266简介
ESP8266有三种工作模式:
1.Station (客户端模式)模块相当于一个客户端,可以链接到其他路由器发出的WIFI信号。主要应用在网络通信中。
2.AP (接入点模式)模块本身相当于一个路由器,其他设备可链接到该模块发送的信号,主要应用在主从设备的主机部分。
3.Station+AP (两种模式共存)就是说模块可以当成一个设备(client)连接区域网内的路由,也可以设置成是一个路由(sever),也可以既作为局域网里面的client同时又是其他client的sever。
本课设中使用STA模式,并连接WiFi,AT指令配置如下
AT+CWMODE=1
AT+RST
AT+CWJAP="iQOO Z1x","12345678"
mqtt
MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的支持在各方之间异步通信的消息协议。MQTT在空间和时间上将消息发送者与接收者分离,因此可以在不可靠的网络环境中进行扩展。虽然叫做消息队列遥测传输,但它与消息队列毫无关系,而是使用了发布和订阅(Pub/Sub)的模型。
MQTT 是一种轻量级的、灵活的网络协议,致力于为 IoT 开发人员实现适当的平衡:
- 这个轻量级协议可在严重受限的设备硬件和高延迟/带宽有限的网络上实现。
- 它的灵活性使得为 IoT 设备和服务的多样化应用场景提供支持成为可能。
详细介绍:MQTT 入门介绍
使用AT指令连接阿里云
连接指令参考
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
AT+MQTTUSERCFG=0,1,"","","",0,0,""
AT+MQTTUSERNAME=0,"voltmeter&a1LF9tJmi7L"
AT+MQTTPASSWORD=0,"00D54361109FD2F1F4537F928C0CBB6EEA81E253"
AT+MQTTCLIENTID=0,"12345|securemode=3\,signmethod=hmacsha1\,timestamp=789|"
AT+MQTTCONN=0,"a1LF9tJmi7L.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
使用AT指令对阿里云发布话题
AT+MQTTPUB=0,"/sys/a1LF9tJmi7L/voltmeter/thing/event/property/post","{\"method\":\"thing.service.property.set\"\,\"id\":\"2012934115\"\,\"params\":{\"ch2\":4.7231}\,\"version\":\"1.0.0\"}",1,0
电压采集
ADC
我们所使用的stm32f411拥有1个ADC,12通道,其拥有12位的分辨率,对于3.3v,可以达到约0.00081v的精度。我们在程序中配置通道0-8进行测量,配置采样速率25MHz,每个规则序列中只包含一个通道,并配置连续扫描。
每次采样时会采集10个值,经过冒泡法排序后,去除最小、最大值,并计算平均值从而达到滤波的效果。
//排序
void my_sort(u16 *buf,u8 num)
{u8 i,j,flag=1;u16 k;
for(i=0;i<9;i++){for(j=0;j<9-i;j++){flag = 0; //在内循环中设这个标记,如果没有发生互换,就设为0if(buf[j]>buf[j+1]){k = buf[j];buf[j] = buf[j+1];buf[j+1] = k; flag = 1; //发生互换就设为1 } } if(flag==0)//最后利用一个分支来始没有交换的时候跳出,这样可以减少计算次数{break;}}
}
//adc采集任务
static void ADC_task ( void * p_arg )
{u16 buf[10];u8 i=0;OS_ERR err;while(1){OSSemPend(&STAER_ADC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求ADC开始信号量 for(i=0;i<9;i++)//采集9个通道电压{Get_Adc(channel_list[i].ADC_channels,buf);my_sort(buf,10);channel_list[i].current=my_average(buf,1,8)/4096*3.3*10000;//转化为3.3V电压值if(i!=8)bouns_light(&channel_list[i]);}OSSemPost(&END_ADC_SEM,OS_OPT_POST_1,&err);//发送信号量 OSTimeDlyHMSM(0, 0, 0, 5, 0, &err);}
}
同时我们使用优质的LDO芯片XC6203为stm32及adc供电,保证了其基准电压的稳定。
stm32的adc详细介绍:STM32—ADC详解
分压电路
由于stm32的ADC只能测量0-3.3v电压,我们使用精密电阻(精度0.1%)进行分压,并且增加了一个100nf的电容稳定电压,从使8个通道的特性相差较小。分压电阻为1.2M和1M,经过分压,stm32可以测量0-6.05V电压
声光报警
蜂鸣器及LED
蜂鸣器
我们使用5V的有源蜂鸣器,保证了声音足够大。但是stm32无法输出5V电压,于是我们将IO口配置为开漏输出,通过上拉电阻实现5v输出。
void BEEP_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;//蜂鸣器配置开漏输出,使用上拉电阻输出5VGPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure);BEEP_OFF();}
LED
我们通过相关的电路设计,实现通过stm321的一个IO口控制两个LED的亮灭。正常时,stm32的IO配置为高阻态,此时红灯、绿灯都不亮;超过上限,IO口配置为推挽输出、低电平,此时红灯亮;低于下限,IO配置为推挽输出、高电平,此时绿灯亮。
void LED_set(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pinx,unsigned char state)
{GPIO_InitTypeDef GPIO_InitStructure;if(state==0)//两个灯都不亮{GPIO_InitStructure.GPIO_Pin = GPIO_Pinx;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//高阻态GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOx, &GPIO_InitStructure);}else if(state==1)//下侧亮{GPIO_InitStructure.GPIO_Pin = GPIO_Pinx;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOx, &GPIO_InitStructure); GPIO_SetBits(GPIOx,GPIO_Pinx);//置为高电平}else if(state==2)//下侧亮{GPIO_InitStructure.GPIO_Pin = GPIO_Pinx;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOx, &GPIO_InitStructure); GPIO_ResetBits(GPIOx,GPIO_Pinx);//置为低电平}}
串口屏
电压值的显示及上、下限的设置,我们使用串口屏,通过上位机制作其显示的界面并烧录。通过串口屏,我们可以设置相关的上下限、查看当前值及掉电保存的值。并且通过串口于stm32通讯
数据存储
AT24C02
尽管stm32用于内部flash,当时由于其读写寿命只有1万次左右。而我们的课设中以10Hz的速度更新9个通道值,每个电压值对应的存储块每秒读写就有10次,一分钟就有600次,所以我们选择EEPROM作为存储介质,AT24C02拥有30万次的读写寿命,再通过均衡读写,就可以实现课设的要求。
详细介绍:AT24C02
存储器FLASH,EEPROM介绍:FLASH和EEPROM的区别
static void AT24C02_task ( void * p_arg )
{OS_ERR err;u16 temp=0;u8 i=0;while(1){OSSemPend(&END_ADC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量 for(i=0;i<9;i++){temp=channel_list[i].current;screen_send_value(channel_list[i].screen_name_current,temp);AT24CXX_WriteOneByte(channel_list[i].AT24C02_Palce,temp%256);//写入低字节OSTimeDlyHMSM(0, 0, 0, 5, 0, &err);AT24CXX_WriteOneByte(channel_list[i].AT24C02_Palce+1,temp/256);//写入高字节OSTimeDlyHMSM(0, 0, 0, 5, 0, &err);}if(ch>0){temp=channel_list[ch-1].current;screen_send_value("chnael.x0.val",temp); } OSSemPost(&STAER_ADC_SEM,OS_OPT_POST_1,&err);//发送信号量 }
}
供电
供电一开始我们选择使用AMS117,将12V降至5v,但压差过大,AMS117发热较大,无法正常使用。或许可以考虑使用7805或LM2956进行压降。不过我们后来想了一下,不如直接用5V供电。至于stm32的3.3v供电,我们使用了LDO芯片XC6204
课设 stm32的8路电压表采集系统相关推荐
- 基于STM32的智能温室控制系统仿真电路设计(温控补光)-基于STM32的智能蓝牙温控风扇控制系统设计-基于STM32的无线蓝牙心电监护仪系统设计【毕设课设分享】
1609 基于STM32的智能蓝牙温控风扇控制系统设计-毕设课设 1.LCD1602液晶显示当前温度,温度上下限值,风扇等级,自动手动模式: 2.设置有4个按键,按键1可以设置自动和手动2种模式切换: ...
- 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...
- 5.3学习计划 ADC课设思路
你要特别努力地生活,但也别忘了快乐! 1.任务计划 (1)课设选题开题 (2)做负反馈放大电路的实验 2.计划完成度 (1)这学期的课设,我选择的题目是模数转换 ...
- sr锁存器 数电_数电课设其实也没那么难2.1
1 引言 如上就是 课题二.数字式抢答器 课题三.多路彩灯控制器 相比天天在路口见的红绿灯 这俩题可能抽象了一点 我自己是课题三 做的时候发现 这题还真不是最简单的一个... 一步一步来吧 数电并不是 ...
- stm32采集脉冲信号_基于STM32+FPGA的数据采集系统的设计与实现
引言 由于火控系统工作环境特殊,所需采集信号复杂多样,传统的以微控制器或PC为主的采集系统往往难以胜任.针对上述问题,提出了一种基于STM32+FPGA的数据采集系统的设计方案,该方案不仅能够完成对多 ...
- linux嵌入式红绿灯,嵌入式上机课设(红绿灯)..doc
嵌入式上机课设(红绿灯). 成绩 _______ 指导教师评定成绩: 审定成绩: 重 庆 邮 电 大 学 移 通 学 院 课程设计报告 设计题目: 学 校: 重庆邮电大学移通学院 学 生 姓 名: 专 ...
- 2021年数据库课设该怎么做?一个超市管理系统,简单的前后端分离项目,带你从概要设计走到项目发布!(Vue.js+SpringBoot+MybatisPlus)
由于本文格式原来是word,所以文中有些格式不太对.如果这篇文章对你有帮助,麻烦点赞评论一下谢谢!源码和word文档可私聊领取~ 目录 一.相关技术介绍 1.1 RDBMS: 1.2应用程序开发环境: ...
- 研讨班管理系统的设计与实现【数据库课设】
觉得好请点个赞,谢谢!笔者用ProcessOn作的图 一.绪论 随着计算机技术的发展和数据库技术的广泛应用,各种以数据库为核心,以高级程序语言搭建用户软件的管理系统应运而生,不仅实现了自动化办公大大提 ...
- 基于单片机波形发生器PCB原理图报告设计资料-基于单片机比赛计时计分电路仿真设计-基于单片机报警器与旋转灯设计-基于单片机八路数据电压采集报警控制系统-基于单片机病房呼叫系统控制系统设计【毕设课设资】
1302基于单片机波形发生器PCB原理图报告设计资料-毕设课设原理图程序资料 设计一个信号发生器,能在单片机的基础上控制并产生三角波.方波.正弦波和矩形波,且频率幅度和波形可以通过按键改变. #inc ...
- 数据结构课设_网页形式的景区导游
一.前言 欢迎大家来到这里~~ 1.这次数据结构课设,笔者的题目是网页形式的导航系统. 2.数据结构方面应用了链表存储商品信息.图来存储景点和路径信息.在图的广度优先中还用到了队列: 3.具体的算法有 ...
最新文章
- python hmac
- 八个最好的开源机器学习框架和库
- vue项目 一行js代码搞定点击图片放大缩小
- Scrapy-Item Loaders(项目加载器)
- linux切换到字符界面stemctl,CentOS7两种模式
- 计算机应用基础的客观题,计算机应用基础专题库客观题参考答案11
- [今日白学]组件的基础的基础的基础
- POJ3750 小孩报数问题【模拟】
- python缩写转换成全拼_Python中文转拼音代码(支持全拼和首字母缩写)
- SQL 四舍五入 同时取规定小数位的数值
- 软件基本功:不要给代码加系数
- 编译的html帮助文件(.chm)打不开,chm文件无法打开怎么办
- 读书笔记 | 财务会计理论(第7版 William R.Scott)(上)
- PMP考试 工作绩效数据 工作绩效信息 工作绩效报告 区别与联系
- Aidlux实践-快速实现街道人流量统计系统
- 游戏本地文件乱码问题
- 极客日报第83期:百度92年程序员因“篡改数据”被抓;运营商辟谣首批 5G 用户被抛弃;特斯拉回应上海工厂摄像头被入侵
- Python+Selenium2(上)
- [激光原理与应用-62]:激光器 - 光学 - 怎样测量光斑和光束质量?
- 哈佛大学搞出声波传数据芯片,抗干扰能力更强,适用于量子计算等新兴领域...