问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁能提供一下STM32W108无线射频无线传感器网络烦雾采集的程序源代码与实例?非常感谢

发布网友 发布时间:2022-04-30 03:23

我来回答

2个回答

热心网友 时间:2023-10-09 13:31

STM32W108无线射频模块AD转换器烟雾传感器数据采集
STM32W108 AD转换器是一个一阶∑-△转换器,具有以下特性:
l 分辨率可达12位
l 采样最小时间5.33us(188KHz)
l 6个外部和4个内部输入源,可进行差分和单端转换
l 两个电压转换范围(差分):-VREF~+VREF,-VDD_PADS~+VDD_PADS
l 可选择内部和外部参考标准VREF:内部的VREF可用于输出
l 数字偏移和增益校准
l 专用DMA通道,通道支持一次和连续的操作模式
应用实例解析
编写烟雾传感器测试程序,读取烟雾传感器的AD值,并输出到串口显示。
9.3.1开发环境与硬件说明
硬件:STM32W108 无线开发板、烟雾传感器、J-LINK调试器、PC机等。
软件:IAR Embedded Workbench开发软件、SimpleMac协议栈。

图9.13为烟雾传感器的原理图,烟雾传感器的引脚连接图如图9.14所示,烟雾传感器的5V接引脚1,GND接引脚4,DOUT接引脚2(即芯片中的PA3),AOUT接引脚3(即芯片中的PA4)。

图9.14. 烟雾传感器与STM32W108芯片管脚连接图
9.3.2软件设计与规划
本实例烟雾传感器中用到adc.c中的函数,有StStatus halStartAdcConversion(ADCUser id, ADCReferenceType reference, ADCChannelType channel, ADCRateTyperate),该函数是开启AD转换功能;其中ADCUser id在adc.h中定义,有三种,本实例中用到ADC_USER_APP;ADCReferenceType reference为参考类型,adc.h中定义,本实例中用ADC_REF_INT,ADCChannelType channel为模拟输入通道,在adc.h中定义,本实例中用到的是PA4作为模拟输入的通道;ADCRateType rate为AD转换频率,在adc.h中定义,本实例中用到的是ADC_CONVERSION_TIME_US_4096,4096us,12个有效位。
无线节点上电首先进行硬件初始化,然后等按键S2被按下,只要S2被按下,无线节点就周期性的进行AD转换。
9.3.3传感器数据采集程序设计
在烟雾传感器的驱动程序中涉及到了AD转换的内容:
其中adc.h中的内容有:

static int16u adcData; //DMA中的ADC转换结果

在烟雾传感器的驱动程序中涉及到了AD转换的函数:
在adc.c中的添加函数有:

/**************************************************************************

功能描述:完成对AD转换后数据的获取

输入参数:无

输出参数:AD转换后的16位无符号数

*************************************************************************/

int16u getData(void)

{

int16s data; //存放AD转换后的电压的数值

while ( !(INT_ADCFLAG & INT_ADCULDFULL)); //无效时,空等待

data=halConvertValueToVolts(adcData); //将AD转换的电压数据存至data变量中

return (int16u)data;

}

/**************************************************************************

功能描述:内部ADC初始化

输入参数:无

输出参数:无

*************************************************************************/

void halInternalInitAdc(void)

{

//初始化状态变量

adcPendingRequests = 0;

adcPendingConversion = NUM_ADC_USERS;

adcCalibrated = FALSE;

adcStaticConfig = ADC_1MHZCLK | ADC_ENABLE; //初始化配置:1MHz, 低压范围

// 设置所有ADC读取无效

adcReadingValid = 0;

// 关闭ADC

ADC_CFG = 0; //禁用ADC,关闭HV缓冲区

ADC_OFFSET = ADC_OFFSET_RESET;

ADC_GAIN = ADC_GAIN_RESET;

ADC_DMACFG = ADC_DMARST;

ADC_DMABEG = (int32u)&adcData;

ADC_DMASIZE = 1;

ADC_DMACFG = (ADC_DMAAUTOWRAP | ADC_DMALOAD);

//清空ADC中断,并使能中断

INT_ADCCFG = INT_ADCULDFULL;

INT_ADCFLAG = 0xFFFF;

INT_CFGSET = INT_ADC;

stCalibrateVref(); //校准参考电压

}

MQ2.h编写(烟雾传感器)

/*****************************************************************

文件名:MQ2.h

版本号:v1.0

创建日期:2012-4-1

硬件描述:烟雾传感器的数字输出接STM32W芯片的PA3,模拟输出接STM32W芯片的PA4

主要函数描述:MQSetStatus(int32u status):设置对应引脚;

MQGetStatus():获得对应端口值

MQGetDCData():获得烟雾传感器数字输出的值

MQADCInit():设置PA4为模拟输入状态

MQGetADCStart():开启AD转换

*****************************************************************/

#ifndef __MQ_H__

#define __MQ_H__

//设置MQ2烟雾传感器的数字输出端口与STM32W的PA3端口相连接

#define MBUS PORTA_PIN(3)

#define MBUS_INPUT_GPIO GPIO_PAIN

#define MBUS_OUTPUT_GPIO GPIO_PAOUT

#define MBUS_GPIO_PIN PA3_BIT

#define MBUS_WAKE_SOURCE 0x00000080

#define MBUS_SET (GPIO_PASET_ADDR+((GPIO_PBCFGL_ADDR

-GPIO_PACFGL_ADDR)*(MBUS/8)))

#define MBUS_CLR (GPIO_PACLR_ADDR+((GPIO_PBCFGL_ADDR

-GPIO_PACFGL_ADDR)*(MBUS/8)))

extern void MQSetStatus(int32u status); //设置对应引脚;

extern u8 MQGetStatus(); //获得对应端口值

extern u8 MQGetDCData(); //获得烟雾传感器数字输出的值

extern void MQADCInit(); //设置PA4为模拟输入状态

extern void MQGetADCStart(); //开启AD转换

#endif

MQ2.c编写(烟雾传感器)

/*****************************************************************

文件名:MQ2.c

版本号:v1.0

创建日期:2012-4-1

硬件描述:烟雾传感器的数字输出接STM32W芯片的PA3,模拟输出接STM32W芯片的PA4

主要函数描述:MQSetStatus(int32u status):设置对应引脚;

MQGetStatus():获得对应端口值

MQGetDCData():获得烟雾传感器数字输出的值

MQADCInit():设置PA4为模拟输入状态

MQGetADCStart():开启AD转换

*****************************************************************/

#include PLATFORM_HEADER

#include BOARD_HEADER

#include "MQ2.h"

#include "hal/micro/micro-common.h"

#include "hal/micro/cortexm3/micro-common.h"

#include "hal/micro/adc.h"

#include "stdio.h"

#define LOW 0//低电平

#define HIGH 1//高电平

/**************************************************************************

功能描述:完成对特定端口的设置

输入参数:status:端口参数,高电平或低电平

输出参数:无

*************************************************************************/

void MQSetStatus(int32u status)

{

halGpioConfig(MBUS,GPIOCFG_OUT);

if(MBUS/8 < 3)

{

if(status==HIGH) //设置为高电平

*((volatile int32u *)MBUS_SET) = BIT(MBUS&7);

else //设置为低电平

*((volatile int32u *)MBUS_CLR) = BIT(MBUS&7);

}

}

/**************************************************************************

功能描述:完成获取对应端口的值

输入参数:无

输出参数:对应端口的值

*************************************************************************/

u8 MQGetStatus()

{

return (MBUS_INPUT_GPIO & (1<<MBUS_GPIO_PIN)) ? 1 : 0;

}

/**************************************************************************

功能描述:完成对烟雾传感器数字输出的获取

输入参数:无

输出参数:烟雾传感器数字输出值

*************************************************************************/

u8 MQGetDCData()

{

halGpioConfig(MBUS,GPIOCFG_IN);

if(MQGetStatus()==0)

{

halCommonDelayMicroseconds(500); //延时抗干扰

if(MQGetStatus()==0)

return 0;

else

return 1;

}

else

return 1;

}

/**************************************************************************

功能描述:设置PA4端口为模拟输入输出

输入参数:无

输出参数:无

*************************************************************************/

void MQADCInit()

{

halGpioConfig(PORTA_PIN(4),GPIOCFG_ANALOG);

}

/**************************************************************************

功能描述:完成对给定数字的显示

输入参数:无

输出参数:无

*************************************************************************/

void MQGetADCStart()

{

halAdcCalibrate(ADC_USER_APP); //设置ADC校准

halStartAdcConversion(ADC_USER_APP,ADC_REF_INT, ADC_SOURCE_ADC4_VREF2,ADC_CONVERSION_TIME_US_4096 ); //开启AD转换,ADC4,转换速率4096

}

9.3.4测试程序编写
编写测试程序源文件solar-system.c:

/*****************************************************************

文件名:solar-system.c

版本号:v1.0

创建日期:2012-4-1

硬件描述:对于无线节点上烟雾传感器数字输出接PA3,模拟输出接PA4

主要函数描述:main( )函数实现对各个传感器的控制。

*****************************************************************/

#include PLATFORM_HEADER

#include BOARD_HEADER

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "error.h"

#include "hal/hal.h"

#include "include/phy-library.h"

#include "hal/micro/cortexm3/iap_bootloader.h"

#include "MQ2.h"

/**************************************************************************

功能描述:完成对某种传感器的检测

输入参数:无

输出参数:无

*************************************************************************/

int main(void)

{

boolean preesed = FALSE;

halInit();//初始化硬件

uartInit(115200, 8, PARITY_NONE, 1); //初始化UART

.

//配置PA4和PA5作为复用输出引脚,用于数据包的跟踪

halGpioConfig(PORTA_PIN(4),GPIOCFG_OUT_ALT);

halGpioConfig(PORTA_PIN(5),GPIOCFG_OUT_ALT);

GPIO_IRQDSEL = PORTB_PIN(2); //连接IRQD到PB2/SC1RXD

//允许IRQD标志位激活任何的IRQD

GPIO_INTCFGD = (3<<GPIO_INTMOD_BIT);

INT_GPIOFLAG = INT_IRQDFLAG;

INT_PENDCLR = INT_IRQD;

INTERRUPTS_ON();

halInitLed(); //初始化LED

halInitButton(); //初始化按键

halInternalInitAdc();//内部ADC初始化

MQADCInit(); //烟雾传感器接口初始化

printf("Press S2 to begin ADC Change\n");

while(TRUE)

{

halCommonDelayMilliseconds(10);

if (halGetButtonStatus(BUTTON_S2) == BUTTON_PRESSED||preesed == TRUE)

{

preesed = TRUE;

/********读取烟雾传感器AD值*******************/

MQGetADCStart();

u16 mqacdata=getData();

u8 flag=0;

if(mqacdata&(0x01<<15)!=0)

{

mqacdata=~(mqacdata-1);//负数,2进制补码

flag=1;

}

if(mqacdata<32768)

{

if(flag==1)

{

printf("Smoke -%d\n",mqacdata);

}

else

{

printf("Current ADC: %d\n",mqacdata);

}

}

halCommonDelayMilliseconds(2000);//2000ms

}

}

}

9.3.5测试结果及分析
烟雾传感器的模拟输出经过AD转换后的值通过串口发送到PC机,AD转换的电压范围最大为1.2V,操作各传感器时,可以调节烟雾传感器模块上面的滑动变阻器,以改变传感器的灵敏度。

本文出自《STM32W108嵌入式无线传感器网络》邱铁,夏锋,周玉编著.清华大学出版社,2014年5月
同时参考http://blog.csdn.net/u010273356/article/details/46932007

热心网友 时间:2023-10-09 13:32

请参考这个实例:烟雾传感器中用到adc.c中的函数,有StStatushalStartAdcConversion (ADCUser id, ADCReferenceType reference, ADCChannelTypechannel, ADCRateType rate),该函数是开启AD转换功能;其中ADCUserid在adc.h中定义,有三种,本实例中用到ADC_USER_APP;ADCReferenceTypereference为参考类型,adc.h中定义,本实例中用ADC_REF_INT,ADCChannelTypechannel为模拟输入通道,在adc.h中定义,本实例中用到的是PA4作为模拟输入的通道;ADCRateTyperate为AD转换频率,在adc.h中定义,本实例中用到的是ADC_CONVERSION_TIME_US_4096,4096us,12个有效位。
无线节点上电首先进行硬件初始化,然后等按键S2被按下,只要S2被按下,无线节点就周期性的进行AD转换。
/*****************************************************************
文件名:MQ2.c
版本号:v1.0
创建日期:2012-4-1
硬件描述:烟雾传感器的数字输出接STM32W芯片的PA3,模拟输出接STM32W芯片的PA4
主要函数描述:MQSetStatus(int32u status):设置对应引脚;
MQGetStatus():获得对应端口值
MQGetDCData():获得烟雾传感器数字输出的值
MQADCInit():设置PA4为模拟输入状态
MQGetADCStart():开启AD转换
*****************************************************************/
#includePLATFORM_HEADER
#includeBOARD_HEADER
#include"MQ2.h"
#include"hal/micro/micro-common.h"
#include"hal/micro/cortexm3/micro-common.h"
#include "hal/micro/adc.h"
#include"stdio.h"
#define LOW0//低电平
#define HIGH1//高电平

/**************************************************************************
功能描述:完成对特定端口的设置
输入参数:status:端口参数,高电平或低电平
输出参数:无
*************************************************************************/
voidMQSetStatus(int32u status)
{
halGpioConfig(MBUS,GPIOCFG_OUT);
if(MBUS/8 < 3)
{
if(status==HIGH) //设置为高电平
*((volatile int32u *)MBUS_SET) =BIT(MBUS&7);
else //设置为低电平
*((volatile int32u *)MBUS_CLR) =BIT(MBUS&7);
}
}

/**************************************************************************
功能描述:完成获取对应端口的值
输入参数:无
输出参数:对应端口的值
*************************************************************************/
u8 MQGetStatus()
{
return (MBUS_INPUT_GPIO &(1<<MBUS_GPIO_PIN)) ? 1 : 0;
}

/**************************************************************************
功能描述:完成对烟雾传感器数字输出的获取
输入参数:无
输出参数:烟雾传感器数字输出值
*************************************************************************/
u8MQGetDCData()
{
halGpioConfig(MBUS,GPIOCFG_IN);
if(MQGetStatus()==0)
{
halCommonDelayMicroseconds(500); //延时抗干扰
if(MQGetStatus()==0)
return 0;
else
return 1;
}
else
return 1;
}

/**************************************************************************
功能描述:设置PA4端口为模拟输入输出
输入参数:无
输出参数:无
*************************************************************************/
voidMQADCInit()
{
halGpioConfig(PORTA_PIN(4),GPIOCFG_ANALOG);
}

/**************************************************************************
功能描述:完成对给定数字的显示
输入参数:无
输出参数:无
*************************************************************************/
voidMQGetADCStart()
{
halAdcCalibrate(ADC_USER_APP); //设置ADC校准
halStartAdcConversion(ADC_USER_APP,ADC_REF_INT,ADC_SOURCE_ADC4_VREF2,ADC_CONVERSION_TIME_US_4096 ); //开启AD转换,ADC4,转换速率4096
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女人梦见蛇的七大预兆解梦 PHOTOSHOP 怎么把眼睛点大 这些月销量10000+的防晒霜,是噱头还是真的好用? 大宝水凝保湿防晒露适合哪些肤质的人使用? 拥有人口过亿的国家最多的大洲是( )A.非洲B.亚洲C.欧洲D.大洋 世界国家最多的大洲是:( ) A.亚洲 B.大洋州 C.非洲 D.欧 拥有人口过亿的国家最多的大洲是:( ) A.非洲 B.亚洲 C.欧洲 D.大洋 餐厅一般中餐都有哪些摆台要求和标准 如何做味道正宗的中餐? 河南文科跟理科高考分数线相差多少 最常见的心律失常是什么 pending 的状态是什么意思 pending conversion要多久 企业营业执照注册资金大写还是小写 分公司的营业执照样本是什么样的啊 国企有营业执照吗 民企和央企的营业执照分别由谁核发? 营业执照上打印的字体是什么字体? 营业执照副本数字和内容分别用的是什么字体 上海世博会烟花花费多少钱? 央企有营业执照吗 被本科学校以专科批录取的学生 营业执照上能否分辨出该公司是否央企、国企、民企? 东风风光580豪华版自动挡转向拨杆不回复位? 央企控股的营业执照样本 大一学电子信息工程,买这个电脑够不够用? 电气工程及其自动化专业需不需要买太好的笔记本电脑,看重什么呢 51单片机和气体传感器的连接 用于单片机编程的USB转9针RS232转换器,哪种品牌好?价格大概是多少? 中国电信无线网卡一年多少钱 OZ9992是什么品牌的IC pending conversion 什么意思 pending状态是什么意思 pending是什么状态? 什么是adovbs.inc paypal里面的付款状态pending和pending payment有什么区别?分别表示的是什么意思? review pending是什么状态 美国专利审查通知书中pending是什么意思 用Chrome 开网页发现状态一直是 Pending,什么情况 人事问题 HR说状态是pending 简述STM32 中断“抢占(Preempt)”和“挂起(Pending)”的的含义? 华为p50pro微信收到pdf打不开? 华为mate8浏览pdf文件打不开原因 为什么华为mate30打不开招商证券的PDF? 怎样才能让父母开心起来? 怎么才能让我爸妈和睦相处? 针灸真的能减肥吗 钉钉打卡任务已经完结还可以补卡吗?怎么补 让爸妈快乐的秘诀是什么? 针灸真的可以减肥嘛?、