概要:传感器内部有一个红外对管。 当光穿过一定量的水时,透过的光量取决于水的浑浊程度。 水越脏,穿过它的光就越少。 从上面的原理我们知道,只要获得电压就可以得到水的浊度,所以我们采用模数转换的方式来求水的浊度。
水浊度传感器文章目录 硬件使用 软件使用 实现步骤 - 水浊度原理 - 具体操作代码说明 - 通道规则配置 - 软件使能转换 - 判断转换完成,读取 ADC值-,通过串口计算出水的浊度-,并发送给串口调试助手。 最终硬件使用STM32F103 RCT6(32个芯片)TSW-30(水浊度传感器)。 该软件使用keil5 MDK串口调试助手实现步骤。
1、水浊度传感器原理 该浊度传感器利用光学原理,根据溶液中光的透过率和散射率来综合判断浊度状态。 传感器内部有一对红外管。 当光穿过一定量的水时,透过的光量取决于水的浑浊程度。 水越脏,穿过它的光就越少。 接收端将发射光的强度转换成相应的电流大小。 通过的光越多,电流就越大。 相反,当穿过的光较少时,电流就会减小。
根据以上原理,我们知道只要得到电压就可以得到水的浊度,所以我们利用ADC的模/数转换来求出水的浊度。
2、具体操作代码说明
(1)首先,为了方便后面的步骤,将TSW30(水浊度)定义对应的LED引脚的传感器)。 验证
p> 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) 对应模拟引脚和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, );RCC_ADCCLKConfig( Div4); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStruct .GPIO_Pin = GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_DeInit(ADC1);ADC_InitStruct.ADC_ContinousConvMode = 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 ct.A DC_ScanConv 模式 = DISABLE;ADC_Init( ADC1,&ADC_InitStruct);ADC_Cmd(ADC1,启用); / Enable ADCADC_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_APB2PeriphC lockCmd(RCC_APB2Peri ph_USART1,ENABLE); //USART1GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP Enable; //多个推挽输出1_Tx USB Rx是STM32的Tx,必须是连接USB转TTL串口的RxGPIO_InitStrue.GPIO_Pin = GPIO_Pin_9;GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStrue);//USART1_Rx USB TxGPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_InitStrue.GP IO_P in = 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_Par 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 = Enabled; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; //子优先级 1NVIC_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++;}}
最后
这是我第一次写博客。 如果您有什么建议,请批评我。
我会一点点更新部分内容,但源代码会在上一篇文章中上传。
如果您觉得这篇文章有帮助或者认为写得很好,请帮助我们并给我们点赞。 连续3次!
评论前必须登录!
注册