|
最近需要用STM32F103系列的单片机来检测HR202湿敏电阻传感器的湿度数值。
但是网上则可参考资料少得可怜,基本是51单片机或者是其他单片机的历程,有参考意义,但是不大(可能是个人能力问题)。
但是在检测过程中遇到了几个问题,目前检测到的读数有偏差,所以在论坛中请教一下各位大神:
1.在检测过程中,我将HR202湿敏电阻替换为定值电阻,想利用单片机检测电阻的阻值,来验证是否阻值读取是否正确,如果定值电阻阻值读取正确则表示湿敏电阻也会读取正确,但是在读取过程中,单片机读取到的阻值误差过大下面我会附上我采集到的电阻数值,不知道是我的电路问题还是代码问题,所以想请教一下论坛大神解答。
以下是我的检测电路以及代码。
我使用的检测方法是IO测电阻法
定时器等库函数是正点原子标准库历程。
变量time_jishi我放在定时器中++。
- #include "stm32f10x.h"
- #include "sys.h"
- #include "delay.h"
- #include "gpio.h"
- #include "key.h"
- #include "timer.h"
-
- #define test1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
- #define hr202 PAout(1) // 湿敏
- #define ref PAout(2) // 电阻
- #define test PAout(3) //io 读取高电平
- unsigned long time_ref = 0; //精确到us
- unsigned long time_hr = 0;
- unsigned long time_jishi = 0; //精确到us 去中断
- unsigned long res_hr;
- unsigned char humidity = 0;
- void gpio_out_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 打开gpio2 的时钟
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //拉高
-
- }
- //
- void gpio_in_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能B端口时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //shang拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOD3,6
- GPIO_SetBits(GPIOA, GPIO_Pin_1|GPIO_Pin_3);
- }
- void gpio_in_Init2(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能B端口时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2| GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //shang拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOD3,6
- GPIO_SetBits(GPIOA, GPIO_Pin_2|GPIO_Pin_3);
- }
-
- //查表函数
- void res2humidity(unsigned int res)
- {
- unsigned char humidity10 = 0; //十位
- unsigned char humidity1 = 0;//个位
- if((res>28)&&(res<50000))//湿度范围在20%~90%之间
- {
- if((res>28)&&(res<40))
- {humidity10 = 8;humidity1 = 10 - (res-28)*0.4;} //按直线关系处理 数据不是太准确
- if((res>40)&&(res<57))
- {humidity10 = 8;humidity1 = 5 - (res-40)*0.29;}
- if((res>57)&&(res<84))
- {humidity10 = 7;humidity1 = 10 - (res-57)*0.185;}
- if((res>84)&&(res<130))
- {humidity10 = 7;humidity1 = 5 - (res-84)*0.11;}
- if((res>130)&&(res<195))
- {humidity10 = 6;humidity1 = 10 - (res-130)*0.076;}
- if((res>195)&&(res<310))
- {humidity10 = 6;humidity1 = 5 - (res-195)*0.043;}
- if((res>310)&&(res<490))
- {humidity10 = 5;humidity1 = 10 - (res-310)*0.027;}
- if((res>490)&&(res<870))
- {humidity10 = 5;humidity1 = 5 - (res-490)*0.0131;}
- if((res>870)&&(res<1600))
- {humidity10 = 4;humidity1 = 10 - (res-870)*0.0068;}
- if((res>1600)&&(res<3100))
- {humidity10 = 4;humidity1 = 5 - (res/100-16)*0.33;}
- if((res>3100)&&(res<6300))
- {humidity10 = 3;humidity1 = 10 - (res/100-31)*0.156;}
- if((res>6300)&&(res<13000))
- {humidity10 = 3;humidity1 = 5 - (res/100-63)*0.07;}
- if((res>13000)&&(res<26000))
- {humidity10 = 2;humidity1 = 10 - (res/1000-13)*0.38;}
- if((res>26000)&&(res<5000))
- {humidity10 = 2;humidity1 = 5 - (res/1000-26)*0.208;}
- }
- humidity = humidity10*10+humidity1;
- }
-
- int main()
- {
- TIM3_Int_Init(71,71);//10Khz的计数频率,计数到1000为100ms
- // 初始化TIM3,设置1us的定时周期
- // arr = 0 (因为计数器从0开始,并在达到1时溢出)
- // psc = 71 (72MHz / (71 + 1) = 1MHz,即每个时钟周期1us)
- // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- SystemInit();
- delay_init();
-
- while(1)
- {
- gpio_out_Init();
- test=0;
- hr202=0;
- ref=0;
- delay_ms(5);
-
- gpio_in_Init();
- ref = 1;
- TIM_Cmd(TIM3, ENABLE); //定时器开启
- while(!test1);
- TIM_Cmd(TIM3, DISABLE); //定时器关闭
- time_ref=time_jishi; //开启定时器 us级 去中断 读取变量 us级 us级 us级 !!!
- time_jishi=0;
-
- gpio_out_Init();
- test=0;
- hr202=0;
- ref=0;
- delay_ms(5);
-
- //hr202充电
- gpio_in_Init2();
- hr202 = 1;
- TIM_Cmd(TIM3, ENABLE); //定时器开启
- while(!test1);
- TIM_Cmd(TIM3, DISABLE); //定时器关闭
- time_hr=time_jishi;
- time_jishi=0;
-
- //计算hr202电阻
- res_hr = time_hr*100/time_ref; //结果扩大了10倍 res_hf 范围 是否满足 20 30 40
- res2humidity(res_hr);
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|