搜索

[资料分享] [RTOS] rtthread移植到雅特力AT32F403A驱动DS18b20采集温度

[复制链接]
3301|3
 楼主 | 2020-5-25 11:59 | 显示全部楼层 |阅读模式
前言:
前面第一篇讲了rtthread移植到雅特力AT32F403A驱动步进电机,帖子地址https://bbs.21ic.com/icview-2957748-1-1.html
今天来把第二篇补充上
关于移植RTTHREAD系统的部分直接看上一篇帖子,这里主要是讲DS18b20的相关内容.
第一步:淘宝买一个DS18b20传感器,最便宜的1块多包邮,四舍五入等于不要钱了
第二步:电路接线  
DS18b20的典型接线如图所示:只有一个数据脚上拉4.7K欧的电阻接到IO口上

找到AT32F403A这块开发板的原理图,发现只有一个引脚上有上拉电阻,如下:

所以如果不想自己另外焊上电阻的同学可以利用PB2的上拉电阻来实现接线了,首先把JP4跳帽打到VCC那边去(在圆形电源母口旁边),然后把边上的R25电阻换成4.7K的,把传感器的DQ脚接到PB2上,剩下两个脚就好办了.一个接3V3,一个接GND就行,这里要注意看传感器的方向,有一头是半圆弧的,有一头是平的,注意不要接错了.
当然也可以自己接上拉电阻拉到另外引脚去,会的同学自然会,不多扯了
第三步:
打开工程(关于工程的创建也参考官方视频,里面讲的很清楚了),在rtthread官方软件包市场搜索:DS18b20:

看到已经有一个官方的软件包了,把软件包下载下来,该添加的文件添加到软件工程里,如图:
670405ecb3789a395f.png
接着把ds18b20_sample.c里面的代码拷贝出来到main文件内,
然后把官方软件包里的DATA_PIN改成PB2:
  1. /* Modify this pin according to the actual wiring situation */
  2. #define DS18B20_DATA_PIN    GET_PIN(B,2)
复制代码
然后就可以编译了,这时候一般会有一些文件没找到啊之类的问题,自己想办法修复,这里不再多讲,修复完以后工程编译通过了就可以下到板子里了.
第四步:
经过刚刚的步骤大家已经把固件成功的放到板子上运行吧,不过可能看到的现象并不如你意,很大一部分原因是时序的问题,如果出现问题大家可以按照我的方法去修改一下:
1.这一步不一定会出现,有时候会出现设备注册不到,暂时不清楚什么原因,如果出现开机的时候控制台显示没找到设备大家可以按以下操作;
把软件包的自动注册取消掉:
  1. static int ds18b20_read_temp_sample(void)
  2. {
  3.     rt_thread_t ds18b20_thread;

  4.     ds18b20_thread = rt_thread_create("18b20tem",
  5.                                       read_temp_entry,
  6.                                       "temp_ds18b20",
  7.                                       1024,
  8.                                       RT_THREAD_PRIORITY_MAX / 2,
  9.                                       20);
  10.     if (ds18b20_thread != RT_NULL)
  11.     {
  12.         rt_thread_startup(ds18b20_thread);
  13.     }

  14.     return RT_EOK;
  15. }
  16. //INIT_APP_EXPORT(ds18b20_read_temp_sample);

  17. static int rt_hw_ds18b20_port(void)
  18. {
  19.     struct rt_sensor_config cfg;
  20.    
  21.         printf("rt_hw_ds18b20_port  \n");
  22.     cfg.intf.user_data = (void *)DS18B20_DATA_PIN;
  23.     return rt_hw_ds18b20_init("ds18b20", &cfg);
  24.    
  25.     return RT_EOK;
  26. }
  27. //INIT_COMPONENT_EXPORT(rt_hw_ds18b20_port);
复制代码
然后自己手动放到main里面去执行:
  1. int main(void)
  2. {


  3.         rt_err_t ret=0;
  4.         ret = rt_hw_ds18b20_port();
  5.         printf("ret = %d\n",ret);

  6.        
  7.         ds18b20_read_temp_sample();
  8. ...
  9. ...
  10. }
复制代码


2.把sensor_dallas_ds18b20里面的两个delay时间修改一下:

  1. static void ds18b20_reset(rt_base_t pin)
  2. {
  3.     rt_pin_mode(pin, PIN_MODE_OUTPUT);
  4.     rt_pin_write(pin, PIN_LOW);
  5.     rt_hw_us_delay(880);               /* 480us - 960us */    ////--------1
  6.     rt_pin_write(pin, PIN_HIGH);
  7.     rt_hw_us_delay(60);                /* 15us - 60us*/     ////-----------2
  8. }
复制代码
还有:
  1. static uint8_t ds18b20_read_bit(rt_base_t pin)
  2. {
  3.     uint8_t data;

  4.     rt_pin_mode(pin, PIN_MODE_OUTPUT);
  5.     rt_pin_write(pin, PIN_LOW);
  6.     rt_hw_us_delay(2);
  7.     rt_pin_write(pin, PIN_HIGH);
  8.     rt_pin_mode(pin, PIN_MODE_INPUT);
  9.     /* maybe 12us, maybe 5us, whatever...I have no idea */
  10.     rt_hw_us_delay(12);  //-----------3

  11.     if(rt_pin_read(pin))
  12.         data = 1;
  13.     else
  14.         data = 0;
  15.        

  16.     rt_hw_us_delay(50);

  17.     return data;
  18. }
复制代码
一共这3处,把这3处改完之后,应该就没啥问题了,再有问题的大家私聊我.

第五步,效果展示:
首先上靓照:
773105ecb41e169578.png
然后是控制台的输出,程序里面默认是1s一个输出,我这里改成了3s一个输出:
248065ecb41e6b95ed.png
输出中间我对着传感器哈气,会引起温度的上升,过一段时间又降下来了,说明数据还是有效的.
第六步:总结
到这里我们的ds18b20传感器驱动工作就完成了,上一篇承诺给大家用1602液晶屏显示温度这里由于时间问题暂时先不整了,如果后面弄出来了会在帖子后面给大家更新到.

使用特权

评论回复

评论

cooldog123pp 2020-5-29 08:59 回复TA
厉害厉害~~ 
 楼主 | 2020-5-25 12:00 | 显示全部楼层
另外,建议有条件的同学把所有的排针都焊出来,这样就有很多的VCC和GND给我们接外设了

使用特权

评论回复
| 2020-5-26 15:56 | 显示全部楼层
学习了,多谢楼主分享经验,默默的mark一下,RTOS是必须学习的一部分。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

在线客服 快速回复 返回顶部 返回列表