前言:
前面第一篇讲了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液晶屏显示温度这里由于时间问题暂时先不整了,如果后面弄出来了会在帖子后面给大家更新到.
|
厉害厉害~~