打印
[资料分享]

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

[复制链接]
4381|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cszzlsw|  楼主 | 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:

看到已经有一个官方的软件包了,把软件包下载下来,该添加的文件添加到软件工程里,如图:

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

    ds18b20_thread = rt_thread_create("18b20tem",
                                      read_temp_entry,
                                      "temp_ds18b20",
                                      1024,
                                      RT_THREAD_PRIORITY_MAX / 2,
                                      20);
    if (ds18b20_thread != RT_NULL)
    {
        rt_thread_startup(ds18b20_thread);
    }

    return RT_EOK;
}
//INIT_APP_EXPORT(ds18b20_read_temp_sample);

static int rt_hw_ds18b20_port(void)
{
    struct rt_sensor_config cfg;
   
        printf("rt_hw_ds18b20_port  \n");
    cfg.intf.user_data = (void *)DS18B20_DATA_PIN;
    return rt_hw_ds18b20_init("ds18b20", &cfg);
   
    return RT_EOK;
}
//INIT_COMPONENT_EXPORT(rt_hw_ds18b20_port);
然后自己手动放到main里面去执行:
int main(void)
{


        rt_err_t ret=0;
        ret = rt_hw_ds18b20_port();
        printf("ret = %d\n",ret);

       
        ds18b20_read_temp_sample();
...
...
}


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

static void ds18b20_reset(rt_base_t pin)
{
    rt_pin_mode(pin, PIN_MODE_OUTPUT);
    rt_pin_write(pin, PIN_LOW);
    rt_hw_us_delay(880);               /* 480us - 960us */    ////--------1
    rt_pin_write(pin, PIN_HIGH);
    rt_hw_us_delay(60);                /* 15us - 60us*/     ////-----------2
}
还有:
static uint8_t ds18b20_read_bit(rt_base_t pin)
{
    uint8_t data;

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

    if(rt_pin_read(pin))
        data = 1;
    else
        data = 0;
       

    rt_hw_us_delay(50);

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

第五步,效果展示:
首先上靓照:

然后是控制台的输出,程序里面默认是1s一个输出,我这里改成了3s一个输出:

输出中间我对着传感器哈气,会引起温度的上升,过一段时间又降下来了,说明数据还是有效的.
第六步:总结
到这里我们的ds18b20传感器驱动工作就完成了,上一篇承诺给大家用1602液晶屏显示温度这里由于时间问题暂时先不整了,如果后面弄出来了会在帖子后面给大家更新到.

使用特权

评论回复
评论
cooldog123pp 2020-5-29 08:59 回复TA
厉害厉害~~ 

相关帖子

沙发
cszzlsw|  楼主 | 2020-5-25 12:00 | 只看该作者
另外,建议有条件的同学把所有的排针都焊出来,这样就有很多的VCC和GND给我们接外设了

使用特权

评论回复
板凳
cooldog123pp| | 2020-5-26 15:56 | 只看该作者
学习了,多谢楼主分享经验,默默的mark一下,RTOS是必须学习的一部分。

使用特权

评论回复
地板
HXM1593| | 2021-3-31 16:36 | 只看该作者
开发环境是KEIL 吗?

使用特权

评论回复
5
cszzlsw|  楼主 | 2021-4-7 10:43 | 只看该作者
HXM1593 发表于 2021-3-31 16:36
开发环境是KEIL 吗?

对的,官方有keil的扩展包

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

66

帖子

1

粉丝