[STM32F0] STM32F072开发板驱动AM2301

[复制链接]
 楼主| jiekou001 发表于 2020-8-27 22:41 | 显示全部楼层 |阅读模式
本帖最后由 jiekou001 于 2020-8-27 23:50 编辑

补充上手册
AM2301A规格书.pdf (1.28 MB, 下载次数: 2)

am2301.h
  1. #include "stm32f0xx_hal.h"


  2. //读传感器 端口位定义,可修改
  3. //*
  4. #define AM2301_PIN  GPIO_PIN_10
  5. #define AM2301_PORT GPIOA
  6. #define AM2301_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOA_CLK_ENABLE()
  7. #define AM2301_GPIO_CLK_DISABLE()    __HAL_RCC_GPIOA_CLK_DISABLE()
  8. //*/
  9. /*通过LED测试输出用
  10. #define AM2301_PIN  GPIO_PIN_5
  11. #define AM2301_PORT GPIOA
  12. #define AM2301_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOA_CLK_ENABLE()
  13. #define AM2301_GPIO_CLK_DISABLE()    __HAL_RCC_GPIOA_CLK_DISABLE()
  14. */

  15. unsigned char Sensor_AnswerFlag;  //收到起始标志位
  16. unsigned char Sensor_ErrorFlag;   //读取传感器错误标志
  17. unsigned int  Sys_CNT;
  18. unsigned char AM2301_Data[5]={0x00,0x00,0x00,0x00,0x00};

  19. unsigned char Read_AM2301_PIN(void)
  20. {
  21.     AM2301_GPIO_CLK_ENABLE();
  22.     GPIO_InitTypeDef GPIO_InitStruct;
  23.     GPIO_InitStruct.Mode    = GPIO_MODE_INPUT;
  24.     GPIO_InitStruct.Pull    = GPIO_PULLUP;
  25.     GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
  26.     GPIO_InitStruct.Pin     = AM2301_PIN;
  27.     HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);
  28.     return HAL_GPIO_ReadPin(AM2301_PORT, AM2301_PIN);
  29. }

  30. void SET_AM2301_PIN(void)
  31. {
  32.     AM2301_GPIO_CLK_ENABLE();
  33.     GPIO_InitTypeDef GPIO_InitStruct;
  34.     GPIO_InitStruct.Mode    = GPIO_MODE_OUTPUT_PP;
  35.     GPIO_InitStruct.Pull    = GPIO_PULLUP;
  36.     GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
  37.     GPIO_InitStruct.Pin     = AM2301_PIN;
  38.     HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);
  39.     HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_SET);
  40. }

  41. void RESET_AM2301_PIN(void)
  42. {
  43.     AM2301_GPIO_CLK_ENABLE();
  44.     GPIO_InitTypeDef GPIO_InitStruct;
  45.     GPIO_InitStruct.Mode    = GPIO_MODE_OUTPUT_PP;
  46.     GPIO_InitStruct.Pull    = GPIO_PULLUP;
  47.     GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
  48.     GPIO_InitStruct.Pin     = AM2301_PIN;
  49.     HAL_GPIO_Init(AM2301_PORT, &GPIO_InitStruct);
  50.     HAL_GPIO_WritePin(AM2301_PORT, AM2301_PIN,GPIO_PIN_RESET);
  51. }

  52. unsigned char Read_AM2301_Data(void)
  53. {
  54.     unsigned char i,cnt,buffer,tmp;
  55.     for (i = 0; i < 8; i++)
  56.     {
  57.         cnt=0;
  58.         while(!Read_AM2301_PIN())
  59.         {
  60.            if(++cnt>=3000)
  61.                break;
  62.         }
  63.         rt_hw_us_delay(30);
  64.         tmp=0;
  65.         if(Read_AM2301_PIN())
  66.             tmp=1;
  67.         cnt=0;
  68.         while(Read_AM2301_PIN())
  69.         {
  70.             if(++cnt>=2000)
  71.                 break;
  72.         }
  73.         buffer<<=1;
  74.         buffer|=tmp;
  75.     }
  76.     return buffer;
  77. }

  78. unsigned char Read_Sensor(void)
  79. {
  80.     unsigned char i;
  81.     RESET_AM2301_PIN();
  82.     rt_thread_mdelay(2);
  83.     SET_AM2301_PIN();
  84.     rt_hw_us_delay(30);
  85.     SET_AM2301_PIN();
  86.     Read_AM2301_PIN();
  87.     Sensor_AnswerFlag=0;
  88.     if(Read_AM2301_PIN()==GPIO_PIN_RESET)
  89.     {
  90.         Sensor_AnswerFlag=1;
  91.         Sys_CNT=0;
  92.         while(Read_AM2301_PIN()==GPIO_PIN_RESET)
  93.         {
  94.             if(++Sys_CNT>3000)
  95.             {
  96.                 Sensor_ErrorFlag=1;
  97.                 return 0;
  98.             }
  99.         }
  100.         Sys_CNT=0;
  101.         while(Read_AM2301_PIN()==GPIO_PIN_SET)
  102.         {
  103.             if(++Sys_CNT>3000)
  104.             {
  105.                 Sensor_ErrorFlag=1;
  106.                 return 0;
  107.             }
  108.         }
  109.         for(i=0;i<5;i++)
  110.         {
  111.             AM2301_Data[i] = Read_AM2301_Data();
  112.         }
  113.     }
  114.     else
  115.     {
  116.         Sensor_AnswerFlag=0;
  117.     }
  118.     return 1;
  119. }
main.c
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2020-08-27     RT-Thread    first version
  9. */

  10. #include <rtthread.h>
  11. #include <board.h>
  12. #include <am2301.h>

  13. #define DBG_TAG "main"
  14. #define DBG_LVL DBG_LOG
  15. #include <rtdbg.h>

  16. int main(void)
  17. {
  18.     int count = 1,i=0;
  19.     unsigned int shidu,wendu;

  20.     while (count++)
  21.     {
  22. //       LOG_D("Hello RT-Thread!");
  23.         rt_kprintf("Hello RT-Thread!\n");
  24.         rt_thread_mdelay(1000);
  25.         SET_AM2301_PIN();
  26.         rt_thread_mdelay(1000);
  27.         RESET_AM2301_PIN();

  28.   //      if(Read_AM2301_PIN())
  29.         Read_Sensor();
  30.         for(i=0;i<5;i++)
  31.         rt_kprintf("AM2301_Data[%d]=%d\n",i,AM2301_Data[i]);

  32.         shidu=AM2301_Data[0];
  33.         shidu<<=8;
  34.         shidu=shidu|AM2301_Data[1];
  35.         wendu=AM2301_Data[2];
  36.         wendu<<=8;
  37.         wendu=wendu|AM2301_Data[3];
  38.         rt_kprintf("shidu=%d\n",shidu);
  39.         rt_kprintf("wendu=%d\n",wendu);
  40.         for(i=0;i<5;i++)
  41.         {
  42.             AM2301_Data[i] = 0;
  43.         }
  44.         shidu=0;
  45.         wendu=0;
  46.     }

  47.     return RT_EOK;
  48. }
849255f47c6246043d.png

评论

这个结果是包含一个小数的,实际数值需要除以10。 这里没有处理这个。  发表于 2020-8-27 23:08
 楼主| jiekou001 发表于 2020-8-27 22:44 | 显示全部楼层
am2301.rar (3.23 MB, 下载次数: 1)
这是基于RT-Thread RTOS的
利用PA10端口读取AM2301,先建立读取高低电平的函数,然后再搞定拉高拉低的,然后按照时序搞定
 楼主| jiekou001 发表于 2020-8-27 23:06 | 显示全部楼层
对读取结果进行校验,发现非常正确。
wahahaheihei 发表于 2020-8-27 23:49 | 显示全部楼层
给楼主点赞。
wahahaheihei 发表于 2020-8-27 23:49 | 显示全部楼层
楼主这个芯片的读取时序手册有吗?
 楼主| jiekou001 发表于 2020-8-27 23:50 | 显示全部楼层
wahahaheihei 发表于 2020-8-27 23:49
楼主这个芯片的读取时序手册有吗?

已补充。马上休息。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

1502

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

147

主题

1502

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部