资讯专栏INFORMATION COLUMN

水浊度传感器

zzbo / 2976人阅读

摘要:传感器内部是一个红外线对管,当光线穿过一定量的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。根据上面的原理可知,了解到只要获取到电压就可以获取水浊度,所以采取模拟数字转换来实现获取到水浊度。

水浊度传感器

文章目录

硬件使用

  • STM32F103 RCT6 (32芯片)
  • TSW-30 (水浊度传感器)

软件使用

  • keil5 MDK
  • 串口调试助手

实现说明

1. 水浊度传感器原理

  这款浊度传感器利用光学原理,通过溶液中的透光率和 散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量 的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过的光少,电流小。

​   根据上面的原理可知,了解到 只要获取到电压就可以获取水浊度,所以采取 ADC 模拟/数字转换来实现获取到水浊度。

  

2. 具体操作代码说明

 (1)首先先定义 TSW30(水浊度传感器)上所对应的 LED 引脚,方便后续校验

GPIO_InitTypeDef GPIO_InitStrue;		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);		GPIO_InitStrue.GPIO_Mode = GPIO_Mode_Out_PP;										GPIO_InitStrue.GPIO_Pin = GPIO_Pin_13;	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;		GPIO_Init(GPIOC,&GPIO_InitStrue);

 (2)再定义 STM32 上对应的 模拟 引脚和 ADC 引脚,这个需要根据下面的图来进行定义

 博主这边采取的是 通道1 PA1 口 的 ADC1

 大概实现步骤为:

- 开启 PA 口时钟和 ADC1 时钟,设置 PA1 为模拟输入- 复位 ADC1, 同时设置 ADC1 分频因子- 初始化 ADC1 参数- 使能 ADC 并校准

 所以可得出的代码为:

	GPIO_InitTypeDef GPIO_InitStruct;	ADC_InitTypeDef ADC_InitStruct;		RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);	RCC_ADCCLKConfig(RCC_PCLK2_Div4);			GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;		GPIO_Init( GPIOA, &GPIO_InitStruct);		ADC_DeInit(ADC1);	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;	ADC_InitStruct.ADC_NbrOfChannel = 1;	ADC_InitStruct.ADC_ScanConvMode = DISABLE;		ADC_Init(ADC1,&ADC_InitStruct);		ADC_Cmd(ADC1,ENABLE);  //使能 ADC		ADC_ResetCalibration( ADC1); //使能复位校准	while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束		ADC_StartCalibration( ADC1);	while(ADC_GetCalibrationStatus(ADC1));

​  注意: 需要额外注意的是 RCC_ADCCLKConfig(RCC_PCLK2_Div4); //需要对 ADC时钟进行分频

3. 配置通道规则

ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5);参数1: ADCx 选择 ADC 外设参数2: 设置 ADC 通道  (更多参阅 STM32 库函数 中的 ADC_Channel)参数3: 规则组采样顺序    --这里我们只使用一种,所以直接定义为 Rank = 1 即可参数四: 指定 ADC 通道的采样时间值   

4. 开启软件转换

ADC_SoftwareStartConvCmd( ADC1, ENABLE);

5. 判断转换完成,读取 ADC 值

while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //判断是否转换结束   	return ADC_GetConversionValue(ADC1); //返回最近一次 ADC 采取的数值**再写个函数 取平均值,大概每 10 次取平均值即可**

​  

6.计算水浊度

​  根据商家提供的计算公式或例程可以计算出 所对应的 水浊度信息 (获取电流)

	adcx=Get_Adc_Average(ADC_Channel_1,10); //获取到 电压平均值		temp=(float)adcx*(3.3/4096);	temp = temp*100/3.3;	if(temp > 100) temp = 100;

7.通过串口发送到串口调试助手

(1)初始化串口

GPIO_InitTypeDef GPIO_InitStrue;	USART_InitTypeDef USART_InitStrue;	NVIC_InitTypeDef NVIC_InitStrue;		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能 USART1		GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出								//USART1_Tx  USB Rx  STM32中为 Tx,需要接到 USB转TTL串口中的 Rx	GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9;	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;		GPIO_Init(GPIOA,&GPIO_InitStrue);		//USART1_Rx  USB Tx	GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入						GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;		GPIO_Init(GPIOA,&GPIO_InitStrue);		USART_InitStrue.USART_BaudRate = 115200;	USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	USART_InitStrue.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;			USART_InitStrue.USART_Parity = USART_Parity_No; 	USART_InitStrue.USART_StopBits = USART_StopBits_1; 	USART_InitStrue.USART_WordLength = USART_WordLength_8b;		USART_Init(USART1,&USART_InitStrue);		USART_Cmd(USART1,ENABLE);															USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 		NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;//设置中断	NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;	   	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1	NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;			//子优先级1		NVIC_Init(&NVIC_InitStrue);


(2)中断发送数据

void USART1_IRQHandler(void)                {			  u8 s;	  while(*s!="/0")	{ 		while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET);			USART_SendData(USART1,*s);		s++;	}} 

最后

​  第一次尝试编写博客,若是有什么建议,欢迎批评指出。

​  后续会逐步分块更新,并会在最后一篇文章上传源代码。

​  若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121369.html

相关文章

  • 基于ShineBlink物联网开发板和机智云平台开发的“针对短期内宠物无人照顾的智能宠物屋”系统

    摘要:为了解决人们因工作出差旅游等短期时间内家中宠物无人照顾的问题,我们基于物联网开发板机智云平台和各类传感器模块研究设计了一套针对短期内宠物无人照顾的智能宠物屋系统。 正式介绍作品前先说明一下,我是湖南文理学院计算机与电气工程学院的一名大三学生,我叫陈海涛。作品全部内容均为个人创意、个人设计并手...

    jerryloveemily 评论0 收藏0
  • “云原生边缘计算”会成为“嵌入式计算”的终结者吗?

    摘要:全球最大的开源基金会软件基金会的董事甚至认为,云原生边缘计算意味着嵌入式计算的终结。这次我们不妨更加透彻的谈谈,云原生边缘计算和嵌入式计算,将如何融合相互借势。云原生应用,即指专门为在云平台部署和运行而设计的应用。这是我在【物女心经】专栏写的第105篇文章。嵌入式计算已经笑傲江湖多年,然而,最近它的地位似乎正在受到某种撼动。全球最大的开源基金会——Apache软件基金会的董事Roman Sh...

    chnmagnus 评论0 收藏0
  • 边缘计算对企业的业务适用吗?

    摘要:对于采取边缘计算的企业来说,制定全面战略的五个主要组成部分如下确定目标和要求,包括业务目标驱动因素以及品牌,客户和投资回报要求。 像大多数新的IT技术发展一样,边缘计算并不是一场革命,相反,它更像是一个进化。边缘计算的根源在于早期的内容交付和点对点网络以及网格计算。然而,随着网络,计算和分析技术能力的提高以及...

    zhangfaliang 评论0 收藏0
  • 边缘计算对企业的业务适用吗?

    摘要:对于采取边缘计算的企业来说,制定全面战略的五个主要组成部分如下确定目标和要求,包括业务目标驱动因素以及品牌,客户和投资回报要求。 像大多数新的IT技术发展一样,边缘计算并不是一场革命,相反,它更像是一个进化。边缘计算的根源在于早期的内容交付和点对点网络以及网格计算。然而,随着网络,计算和分析技术能力的提高以及大规模数据增长的需求,意味着计算对于IT管理人员而言将变得越来越重要。 随着大量数据...

    whjin 评论0 收藏0

发表评论

0条评论

zzbo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<