jinglixixi 发表于 2022-8-29 09:21

【AT32WB415测评】数字传感器的使用

<div class='showpostmsg'><p>数字传感器相对于模拟式传感器来讲,具有无需A/D转换器采集及无需数值标配的特点。此外,在数字式传感器中除了用途方面的差异外,其最大的差异便是其工作模式变化,例如有的是采用单总线方式,有的是采用I2C方式,还有的是采用SPI的方式。</p>

<p >相对来讲,单总线器件的驱动要比另2种工作方式要高,原因就在于它不但要用这条总线发送数据还要靠它来接收数据,所以它对时序的要求是很高的。而I2C和SPI方式,是数据和时钟是分开的,故其时序要求要弱于单总线。其实,对于其它的单总线器件来说也是这样。</p>

<p >为了检测对单总线器件的使用,这里使用的是温湿度传感器DHT22,其使用效果如下图所示。</p>

<p > &nbsp;</p>

<p >这里DHT22与开发板的连接关系是使用PA8来传感器的OUT引脚。</p>

<p >由于既要使用该引脚来输出高低电平,又要用其来读取电平状态,故对该引脚的相关定义如下:</p>

<p >#define DHT22_D0_H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOA-&gt;scr = GPIO_PINS_8</p>

<p >#define DHT22_D0_L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOA-&gt;clr = GPIO_PINS_8</p>

<p >#define DHT22_D0_R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpio_input_data_bit_read(GPIOA,GPIO_PINS_8)</p>

<p >此外,在工作过程中由于要变化引脚的工作模式,且没有简单的语句来切换其工作模式,故配置了2个工作的函数以供切换,其内容如下:</p>

<pre>
<code class="language-cpp">void DHT22_IO_IN(void)
{
     gpio_init_type gpio_init_struct;
     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
     gpio_default_para_init(&amp;gpio_init_struct);
     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
     gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
     gpio_init_struct.gpio_pins = GPIO_PINS_8;
     gpio_init_struct.gpio_pull = GPIO_PULL_UP;
     gpio_init(GPIOA, &amp;gpio_init_struct);
}


void DHT22_IO_OUT(void)
{
     gpio_init_type gpio_init_struct;
     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
     gpio_default_para_init(&amp;gpio_init_struct);
     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
     gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
     gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
     gpio_init_struct.gpio_pins = GPIO_PINS_8;
     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
     gpio_init(GPIOA, &amp;gpio_init_struct);
}</code></pre>

<p >对DHT22进行初始化的函数则为:</p>

<pre>
<code class="language-cpp">uint8_t DHT22_Init(void)
{
     gpio_init_type gpio_init_struct;
     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
     gpio_default_para_init(&amp;gpio_init_struct);
     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
     gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
     gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
     gpio_init_struct.gpio_pins = GPIO_PINS_8;
     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
     gpio_init(GPIOA, &amp;gpio_init_struct);
     DHT22_Rst();
     return DHT22_Check();
}</code></pre>

<p >由于DHT22的检测精度要高于DHT11,且包含有小数位,为了使用的方便,这里只取其整数部分来显示,故对其数值读取函数做了稍加修改,其它的辅助函数基本上无需进行修改。</p>

<p >修改后的数值读取函数为:</p>

<pre>
<code class="language-cpp">uint8_t DHT22_Read_Data(uint8_t *temp,uint8_t *humi)
{
    uint8_t buf;
    uint8_t i;
    DHT22_Rst();
    if(DHT22_Check()==0)
    {
        for(i=0;i&lt;5;i++)
        {
            buf=DHT22_Read_Byte();
        }
        if((buf+buf+buf+buf)==buf)
        {
           *humi=(buf*256+buf)/10;
           *temp=(buf*256+buf)/10;
        }
    }else return 1;
    return 0;
}</code></pre>

<p >实现带RTC计时与DHT22检测功能的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
  exint_init_type exint_init_struct;
  ertc_time_type time;
  uint32_t temp = 0;
  uint8_t  senflag;
  system_clock_config();
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  at32_board_init();
  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
  pwc_battery_powered_domain_access(TRUE);
  if (ertc_bpr_data_read(ERTC_DT1) != 0x1234)
  {
    ertc_config();
  }
  else
  {
    ertc_wait_update();
    ertc_flag_clear(ERTC_ALAF_FLAG);
    exint_flag_clear(EXINT_LINE_17);
  }
  ertc_time_show();
  ertc_alarm_show();
  exint_default_para_init(&amp;exint_init_struct);
  exint_init_struct.line_enable   = TRUE;
  exint_init_struct.line_mode     = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select   = EXINT_LINE_17;
  exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  exint_init(&amp;exint_init_struct);
  nvic_irq_enable(ERTCAlarm_IRQn, 0, 1);
  app_tft_init();
  tft_Init();
  LCD_Clear(RED);
  LCD_Fill(0,0,239,50,WHITE);
  show_tb(60,0,0);
  delay_ms(1000);
  BACK_COLOR=RED;
  POINT_COLOR=YELLOW;
  senflag=DHT22_Init();
  if(!senflag)  LCD_ShowString(80,80,"DHT22 NO");
  else   LCD_ShowString(80,80,"DHT22 OK");
  LCD_Fill(0,287,239,319,WHITE);
  BACK_COLOR=WHITE;
  POINT_COLOR=RED;
  LCD_ShowString(60,294,"BY: jinglixixi");
  LCD_ShowString(80,16,"  :  :  ");
  LCD_ShowString(152,16,"  -  -  ");
  while(1)
  {

    ertc_calendar_get(&amp;time);
    if(temp != time.sec)
    {
           temp = time.sec;
           delay_us(40);
           LCD_Show2Num(152,16,time.year,2);
           LCD_Show2Num(176,16,time.month,2);
           LCD_Show2Num(200,16,time.day,2);
           LCD_Show2Num(80,16,time.hour,2);
           LCD_Show2Num(104,16,time.min,2);
           LCD_Show2Num(128,16,time.sec,2);
           BACK_COLOR=RED;
           POINT_COLOR=YELLOW;
           DHT22_Read_Data(&amp;temperature,&amp;humidity);
           LCD_ShowString(80,100,"Temp:");
           LCD_Show2Num(120,100,temperature,2);
           LCD_ShowString(80,120,"Humi:");
           LCD_Show2Num(120,120,humidity,2);
           BACK_COLOR=WHITE;
           POINT_COLOR=RED;
    }
  }
}</code></pre>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

peiqiu 发表于 2022-8-29 23:29

<p>设备(微处理器)通过个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接1个约5.1Q的上拉电阻,总线闲置时,其状态为高电平。</p>

jinglixixi 发表于 2022-8-30 09:07

peiqiu 发表于 2022-8-29 23:29
设备(微处理器)通过个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设 ...

<p>是的,有的是装到模块上,有的要自己外接。</p>

lugl4313820 发表于 2022-8-30 16:02

<p>老师的帖子那让人学习的好帖子。非常详细!</p>

jinglixixi 发表于 2022-8-31 09:33

lugl4313820 发表于 2022-8-30 16:02
老师的帖子那让人学习的好帖子。非常详细!

<p>感谢支持!!!</p>
页: [1]
查看完整版本: 【AT32WB415测评】数字传感器的使用