查看: 193|回复: 3

[GD32F190方案分享] USB转RS485通讯模块+高精度温湿度采集(上)

[复制链接]

16

主题

1

好友

495

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-4-16 19:18
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-6-14 22:02:50 |显示全部楼层
    经过两个星期对GD32F190的摸索和自学,现在讲所学的经验分享给大家。

    第一部分    采集高精度温湿度+USART2
    1.原理
    通过读取SHT10模块的数据,经过数据处理之后,将采集的数据实时通过串口传输到PC机上。本次例程涉及到的知识:对串口和GD32F190端口,以及GD32F190时钟的操作。

    2.初始化SHT10的端口
    对于SHT10的操作之前用STM32的单片机进行示范过,操作基本是一样的。主要是对IO输入输出的配置。
    初始化函数:
    void SHT1x_Init(void)
    {
    GPIO_InitPara GPIO_InitStructure;
    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOC, ENABLE); //使能Pc端口时钟

    GPIO_InitStructure.GPIO_Pin= SDA | SCL; // SDA-->PC6 SCL-->PC7
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT; //推挽输出GPIO_MODE_OUT=0X01
    GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP; //端口配置为输出
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; //IO口速度为50MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL; //无上拉
    GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化
    GPIO_SetBits(GPIOC,SDA | SCL); //置位管脚为1
    //通电传感器需要11ms进入休眠状态,在此之前不允许对传感器发送任何命令
    SHT1x_Reset();
    }

    在函数中,与STM32的区别是,GD32F190对推挽输出配置必须用两个结构体函数来进行配置,还是就是对端口是否上拉或下拉进行配置。个人觉得有点麻烦呢?可能我还没有体会到好处在哪里。
    其他的操作并没有什么不同。

    3.初始化系统时钟
    在配置系统时钟时,也是遇到不小的麻烦。先看程序:
    void SysTick_Configuration(void)
    {
    if (SysTick_Config(SystemCoreClock / 720000))
    {
    while (1);
    }
    }
    初始化函数配置为10us。具体计算自己可以去验证。

    吐槽:在例程中给出的1ms的配置函数是这样的:
    void SysTick_Configuration(void)
    {
    if (SysTick_Config(SystemCoreClock / 1000))
    {
    while (1);
    }
    }
    经过实际测试,该配置出来的时间为3s左右,完全是个BUG。

    4.初始化串口
    配置串口比较简单,对照固件库的函数说明以及硬件的端口进行操作:
    void EvbUart2Config(void)
    {
    GPIO_InitPara GPIO_InitStructure;
    USART_InitPara USART_InitStructure;

    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA, ENABLE);
    RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_USART2, ENABLE);

    GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE2, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE3, GPIO_AF_1);
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
    GPIO_Init(GPIOA , &GPIO_InitStructure);

    USART_DeInit( USART2 );
    USART_InitStructure.USART_BRR = 9600;
    USART_InitStructure.USART_WL = USART_WL_8B;
    USART_InitStructure.USART_STBits = USART_STBITS_1;
    USART_InitStructure.USART_Parity = USART_PARITY_RESET;
    USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
    USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX;
    USART_Init(USART2, &USART_InitStructure);
    /* USART enable */
    USART_Enable(USART2, ENABLE);
    }

    4.在主函数中进行数据操作:
    每采集一次温湿度和传输数据,LED灯就闪烁一次:

    /* Includes ------------------------------------------------------------------*/
    #include "gd32f1x0.h"
    #include "systick.h"
    #include "gd32f1x0_eval.h"
    #include "uart.h"
    #include "SHT10.h"
    #include "string.h"


    SHT1x sht1x; //定义传感器结构体
    u8 ST[256]={"***** SHT10 实验 *****\r\n"};
    u8 T_data[256]={"温度 T=- . ℃\r\n湿度 H= . %\r\n露点 D= . \r\n"};

    int main(void)
    {
    u8 error=0,checksum;
    volatile u8 T_Display=0,H_Display=0;
    u16 T_Value=0,H_Value=0;

    SysTick_Configuration(); //初始化时钟
    EvbUart2Config(); //初始化UART
    GD_EVAL_LEDInit(LED1); //初始化LED
    SHT1x_Init(); //初始化SHT10

    EVB_PRINTF("欢迎使用GD32分布监控室内空气质量测试系统\r\n");
    EVB_PRINTF("***** SHT10 实验 *****\r\n");

    while(1)
    {
    GD_EVAL_LEDOn(LED1); //点亮LED灯,开始读取温湿度
    delay_s(1);
    //------------------------读取SHT1X传感器数据--------------------------------------
    error+=SHT1x_Measure( &T_Value,&checksum,0); //measure temperature
    error+=SHT1x_Measure( &H_Value,&checksum,1); //measure humidity
    if(error!=0)SHT1x_Reset(); //通讯故障,复位传感器
    else
    {
    sht1x.T_Result = T_Value;
    sht1x.H_Result = H_Value;
    SHT1X_Caculation1((float*)&sht1x.T_Result, (float*)&sht1x.H_Result );
    sht1x.Temperature=sht1x.T_Result;
    sht1x.Humidity=(u16)sht1x.H_Result;
    sht1x.DEW=SHT1X_dewpoint1(sht1x.T_Result, sht1x.H_Result);
    delay_ms(20);
    }
    //------------------------------------------------------------------------------

    if(sht1x.Temperature<0)
    {
    T_data[7]=0x2d; //在温度前加符号“-”
    sht1x.Temperature=-sht1x.Temperature;
    }
    else T_data[7]=0x20; //若温度大于0,显示为空
    T_data[8]=(sht1x.Temperature/1000) + 0x30;
    T_data[9]=(sht1x.Temperature%1000/100) + 0x30;
    T_data[11]=(sht1x.Temperature%1000%100/10) + 0x30;
    T_data[12]=(sht1x.Temperature%1000%100%10) + 0x30;
    T_data[25]=(sht1x.Humidity/1000) + 0x30;
    T_data[26]=(sht1x.Humidity%1000/100) + 0x30;
    T_data[28]=(sht1x.Humidity%1000%100/10) + 0x30;
    T_data[29]=(sht1x.Humidity%1000%100%10) + 0x30;
    T_data[41]=(sht1x.DEW/1000) + 0x30;
    T_data[42]=(sht1x.DEW%1000/100) + 0x30;
    T_data[44]=(sht1x.DEW%1000%100/10) + 0x30;
    T_data[45]=(sht1x.DEW%1000%100%10) + 0x30;

    EVB_PRINTF((const char*)ST);
    EVB_PRINTF((const char*)T_data); //发送数据到串口
    GD_EVAL_LEDOff(LED1); //关闭LED灯
    delay_s(1);
    }
    }
    /******************* (C) COPYRIGHT 2016 LP *****END OF FILE****/

    5.硬件连接与测试
    将SHT10与程序中配置的端口一一连接起来,然后通过USB线与电脑连接:
    IMG_20160614_214732_HDR.jpg


    打开电脑串口助手:
    QQ截图20160614215348.jpg



    回复

    使用道具 举报

    43

    主题

    5

    好友

    5536

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    昨天 12:00
  • 签到天数: 1472 天

    [LV.10]以坛为家III

    发表于 2016-6-15 09:14:01 |显示全部楼层
    并没有看到485的部分哦
    用技术,爱生活!
    回复

    使用道具 举报

    195

    主题

    3

    好友

    9644

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-6-16 14:24:26 |显示全部楼层
    期待你的下集哟
    回复

    使用道具 举报

    16

    主题

    1

    好友

    495

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-4-16 19:18
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-6-16 15:15:31 来自手机 |显示全部楼层
    糖悦之果飞 发表于 2016-6-16 14:24
    期待你的下集哟

    下集已经发了呀
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-8 06:05 , Processed in 0.108815 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部