【AT32WB415测评】数字传感器的使用
<div class='showpostmsg'><p>数字传感器相对于模拟式传感器来讲,具有无需A/D转换器采集及无需数值标配的特点。此外,在数字式传感器中除了用途方面的差异外,其最大的差异便是其工作模式变化,例如有的是采用单总线方式,有的是采用I2C方式,还有的是采用SPI的方式。</p><p >相对来讲,单总线器件的驱动要比另2种工作方式要高,原因就在于它不但要用这条总线发送数据还要靠它来接收数据,所以它对时序的要求是很高的。而I2C和SPI方式,是数据和时钟是分开的,故其时序要求要弱于单总线。其实,对于其它的单总线器件来说也是这样。</p>
<p >为了检测对单总线器件的使用,这里使用的是温湿度传感器DHT22,其使用效果如下图所示。</p>
<p > </p>
<p >这里DHT22与开发板的连接关系是使用PA8来传感器的OUT引脚。</p>
<p >由于既要使用该引脚来输出高低电平,又要用其来读取电平状态,故对该引脚的相关定义如下:</p>
<p >#define DHT22_D0_H GPIOA->scr = GPIO_PINS_8</p>
<p >#define DHT22_D0_L GPIOA->clr = GPIO_PINS_8</p>
<p >#define DHT22_D0_R 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(&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, &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(&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, &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(&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, &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<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(&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(&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(&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(&temperature,&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> </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> <p>设备(微处理器)通过个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接1个约5.1Q的上拉电阻,总线闲置时,其状态为高电平。</p>
peiqiu 发表于 2022-8-29 23:29
设备(微处理器)通过个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设 ...
<p>是的,有的是装到模块上,有的要自己外接。</p>
<p>老师的帖子那让人学习的好帖子。非常详细!</p>
lugl4313820 发表于 2022-8-30 16:02
老师的帖子那让人学习的好帖子。非常详细!
<p>感谢支持!!!</p>
页:
[1]