xinmeng_wit 发表于 2022-4-4 20:17

【GD32L233C-START评测】7、温度传感器驱动

本帖最后由 xinmeng_wit 于 2022-4-4 20:19 编辑

<p>&nbsp;</p>

<p>一、温度传感器DS18B20介绍</p>

<p>&nbsp;</p>

<p>DS18B20 单线数字温度传感器,即&ldquo;一线器件&rdquo;,其具有独特的优点:</p>

<p>&nbsp;&nbsp;&nbsp; 采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。<br />
&nbsp;&nbsp;&nbsp; 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85&deg;C范围内,精度为 &plusmn; 0.5&deg;C 。<br />
&nbsp;&nbsp;&nbsp; 在使用中不需要任何外围元件。<br />
&nbsp;&nbsp;&nbsp; 持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。<br />
&nbsp;&nbsp;&nbsp; 供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。<br />
&nbsp;&nbsp;&nbsp; 测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。<br />
&nbsp;&nbsp;&nbsp; 负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。<br />
&nbsp;&nbsp;&nbsp; 掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。</p>

<p>&nbsp;</p>

<p>结构框图:</p>

<p></p>

<p>寄存器MAP:</p>

<p></p>

<p>温度寄存器存储格式:</p>

<p>&nbsp;</p>

<p></p>

<p>二、操作时序</p>

<p>&nbsp;</p>

<p>1、初始化时序</p>

<p></p>

<p>主机首先发出一个最少480微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。</p>

<p>做为从器件的DS18B20在一上电后就一直在检测总线上是否有至少480微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。</p>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">//DS18B20复位
void ds18b20_reset(void)
{
       
        gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1       
        DS18B20_DQ_OUT_L;
        delay_xus(480);//480
        DS18B20_DQ_OUT_H;
        delay_xus(15);        //15us

}</code></pre>

<p>2、写操作时序</p>

<p>&nbsp;</p>

<p>写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。</p>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">//向DS18B20写数据
void ds18b20_write(uint8_t data)
{
        uint8_t i;
        gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1       
//        for(i = 0; i &lt; 8; i++)
//        {

//                        DS18B20_DQ_OUT_L;
//                        delay_xus(2);
//                        DS18B20_DQ_OUT_H;
//                        delay_xus(2);
//                        if(data &amp; 0x01)
//                        {
//                                DS18B20_DQ_OUT_H;
//                        }
//                        else
//                        {
//                                DS18B20_DQ_OUT_L;
//                        }
//                        delay_xus(50);
//                        DS18B20_DQ_OUT_H;               

//                        data &gt;&gt;= 1;
//        }       
       
       
       
        for(i = 0; i &lt; 8; i++)
        {
                if(data &amp; 0x01)
                {
                        DS18B20_DQ_OUT_L;
                        delay_xus(2);
                        DS18B20_DQ_OUT_H;
                        delay_xus(60);
                }
                else
                {
                        DS18B20_DQ_OUT_L;
                        delay_xus(60);
                        DS18B20_DQ_OUT_H;
                        delay_xus(2);                       
                }
                data &gt;&gt;= 1;
        }
}</code></pre>

<p>3、读操作时序</p>

<p>&nbsp;</p>

<p>&nbsp;对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。<br />
&nbsp;</p>

<pre>
<code class="language-cpp">//从DS18B20读取一个bit数据
uint8_t ds18b20_read_bit(void)
{
        uint8_t data = 0;
        gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1
        DS18B20_DQ_OUT_L;
        delay_xus(2);
        DS18B20_DQ_OUT_H;
        gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1                       
        data = DS18B20_DQ_IN;
        delay_xus(50);       
        return data;
}</code></pre>

<p>三、测试效果</p>

<p></p>

<p>工程源代码:</p>

<p></p>

<p>DS18B20 dataset:</p>

<p></p>

<p>参考文档:</p>

<p><a href="https://blog.csdn.net/qq_41422043/article/details/89214676" target="_blank">DS18B20温度传感器</a></p>

<p><a href="https://blog.csdn.net/qq_41151593/article/details/108418652" target="_blank">STM32F103驱动DS18B20温度传感器(程序注释超详细)</a></p>

<p><a href="https://www.cnblogs.com/dengxiaojun/p/4279449.html" target="_blank">STM32驱动DS18B20</a></p>
页: [1]
查看完整版本: 【GD32L233C-START评测】7、温度传感器驱动