1方案介绍设计思路
做一个测距仪,需要几部分:
1. 信号采集;
2. 信号转换成距离;
3. 将距离显示出来;
这次在网上分别买了超声测距、红外测距、激光测距的模块,一直放那里没有试,等需要用的时候,发现就红外测距的模块有几根线,可以直接插到板子上用,那么就用红外测距模块了。
红外测距模块的型号是SHARP GP2D12,输出的信号是模拟电压信号,电压值跟距离有关,那么用板子采集分析这个电压,就能得到距离;分析模拟电压,需要用到ADC。本次使用基于GD32F450VET6的小红板,其中GD32F4系列MCU集成的ADC采样速率可达2.6M SPS,性能非常高。
2方案框图
信号换算成距离,ADC得到AD转换后的数据,但是跟距离还没有关联起来,需要用一个公式将ADC输出数据换算成一个距离值;这个模块的测程大概是10cm到80cm的样子,测了4组数据,分别是20cm、40cm、60cm、80cm距离时候的ADC输出值,将这四组数据拟合一个曲线出来,就可以得到全测程的距离计算公式了;实际拟合的时候用的是指数函数。
关于距离的显示,可以用串口显示,也可以用LCD显示,这里用了串口在调试的时候显示,调好了用OLED显示。
测试:
1. while (1)
2. {
3. static uint8_t i;
4. uint16_t adc_data;
5. float m;
6. uint8_t d;
7. uint8_t d_lcd[2] = {0};
8.// printf(" test%3d",i++);
9. bsp_led_on(LED4);
10. delay_ms(100);
11. bsp_led_off(LED4);
12. delay_ms(800);
13. adc_data = adc_regular_data_read(ADC1);
14.
15. m = 160700 * pow(adc_data,-1.097);
16. d = (uint8_t)m;
17.
18. printf(" %3d,adc:%5d,%2dcm",i++,adc_data,d);
19.
20. sprintf((char*)d_lcd,"%2d",d); // 打印到数组
21. OLED_ShowString(0,0,"D:",16);
22. OLED_ShowString(16,0,d_lcd,16);
23. OLED_ShowString(32,0,"cm",16);
24. adc_software_trigger_enable(ADC1,ADC_REGULAR_CHANNEL);
25.
26. }
用一根20cm杜邦线做参考,能测出距离,抬高一点点,也可以反应过来。
-
传感器
+关注
关注
2545文章
50406浏览量
750741 -
模拟信号
+关注
关注
8文章
1108浏览量
52330 -
输出信号
+关注
关注
0文章
269浏览量
11823
发布评论请先 登录
相关推荐
评论