18B20温度控制板使用教程:从华大HC32F030单片机到兆易创新GD32F330【四】

文章目录

  • 前言
  • 一、设计过程中发现的重大问题
  • 1.对18B20时序的重视
  • 2.内部时钟切换的步骤
  • 3.换型的考虑
  • 二、GD32F330C8T6是合适的选择
  • 1.兆易创新单片机是STM单片机的平替产品
  • 2.使用GD32F330C8T6重新绘制的原理图
  • 总结

  • 前言

    18B20温度控制板基本功能如下:

    1、数码显示的温度为18B20采集的环境温度,仅显示个位和十位,小数点后的忽略;
    2、按动按钮,显示风扇温度阈值,松手即显示环境温度,为了便于两者区分,风扇温度阈值加上小数点;
    3、当环境温度达到阈值温度时,风扇启动,当温度下降到阈值温度以下5℃时,风扇停转,这样设计可避免风扇频繁启停

    18B20温度控制板

    一、设计过程中发现的重大问题

    在前面介绍完硬件电路后,即着手设计整机的程序,18B20的部分,笔者直接选用了原子的库函数,里面大量使用了延时程序,用来满足18B20芯片对时许的要求。由于笔者的电路空间有限,因此没有设计外部晶振,以求内部振荡器完成时钟的设计。原理图详见【用18B20温度控制板介绍华大HC32F030单片机 (三)——器件原理介绍】

    1.对18B20时序的重视

    在设计开始时,特别注意了时序对18B20的影响,因此设计延时子程序时,特别用示波器观察,以求精确:

    //写一个字节到DS18B20
    //dat:要写入的字节
    void DS18B20_Write_Byte(uint8_t dat)
    {
        uint8_t j;
        uint8_t testb;
        DS18B20_Out_Init();
    
        for (j = 1; j <= 8; j++)
        {
            testb = dat & 0x01;
           // dat = dat >> 1;
            if (testb)
            {
                Gpio_ClrIO(TEMP_PORT, TEMP_PIN); //DS18B20_DQ_OUT_Clr
    					__NOP();__NOP();//若写1,主机拉低总线后,须在15us内释放总线,在此执行3us延时后释放总线
    					//24MHz,执行2个nop大约3us
                Gpio_SetIO(TEMP_PORT, TEMP_PIN); //DS18B20_DQ_OUT_Set
    					 nop_delay_us(200);
               // nop_delay_us(200);//每个写周期最小必须60us的持续时间,在此补足60us
    					//实测80us
            }
            else
            {
                Gpio_ClrIO(TEMP_PORT, TEMP_PIN); //DS18B20_DQ_OUT_Clr
               nop_delay_us(200);//若写0,主机拉低总线后至少60us
    					  //实测80us
    					 Gpio_SetIO(TEMP_PORT, TEMP_PIN); //DS18B20_DQ_OUT_Set
    					  __NOP();//释放总线,留足1us恢复时间
            }
    				dat = dat >> 1;
        }
    }
    

    以写入一个字节的函数为例,一个NOP的执行时间,都有记录。但是运行一段时间后,读到的数据全为FF

    //从DS18B20读取一个位
    //返回值:1/0
    uint8_t DS18B20_Read_Bit(void) 			 // read one bit
    {
       
        uint8_t data = 0;
        DS18B20_Out_Init();
    
        Gpio_ClrIO(TEMP_PORT, TEMP_PIN); //DS18B20_DQ_OUT_Clr
       __NOP();	__NOP();//读之前,需要主机先拉低超过1us再释放总线
    	  //24MHz,执行2个nop大约3us
        Gpio_SetIO(TEMP_PORT, TEMP_PIN); //DS18B20_DQ_OUT_Set
        __NOP();	__NOP();
    	__NOP();	__NOP();
    	__NOP();	__NOP();
    	 __NOP();	__NOP();
    		
        DS18B20_In_Init();
    		if(Gpio_GetInputIO(TEMP_PORT, TEMP_PIN))//在15us内读取18B20的数据
    		data = 1;
        else data = 0;
        nop_delay_us(200);//每个读时段最小必须有60us的持续时间,在此补足时间
    		//实测80us
        return data;
    }
    

    2.内部时钟切换的步骤

    一方面,时序设计是按照18B20的手册严格执行的,另一方面,延时的实际时间也用示波器严格把关,但是没搞清为何读数不正确。下面程序段是将内部时钟从4MHz切换到24MHz的操作,按照手册要求:须先将时钟切到RCL,设置好频率后再切回到RCH,经过以上步骤,才能成功切到24MHz

    	///<============== 将时钟从RCH4MHz切换至RCH24MHz ==============================    
        ///< RCH时钟不同频率的切换,需要先将时钟切换到RCL,设置好频率后再切回RCH
        Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
        Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
        Sysctrl_SysClkSwitch(SysctrlClkRCL);
        
        ///< 加载目标频率的RCH的TRIM值
        Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);
        ///< 使能RCH(默认打开,此处可不需要再次打开)
        //Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
        ///< 时钟切换到RCH
        Sysctrl_SysClkSwitch(SysctrlClkRCH);
        ///< 关闭RCL时钟
        Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
    

    内部时钟范围就是4MHz到24MHz,切上电默认频率是4MHz

    切成功了,时钟确实是24MHz,这是HC32F030能达到的最高频率,按照这个基础,没有理想的结果。直到反复阅读原子的STM32开发板的例程,才发现了华大和ST时钟方面的区别:华大HC32F030最高内部时钟是24Mhz,STM32F103内部时钟可达72Mhz

    无法找到直接证据说明24Mhz作为系统时钟做出的延时程序会导致18B20的时序紊乱(误差、不准)的原因,但是用72Mhz的时钟做的延时程序,就能让18B20正确工作。

    3.换型的考虑

    从这个节点开始,笔者决定换成内部时钟更高的单片机继续完成方案。原因如下:

    1、易得性、价格均接近的条件下,把精力投在性能更好的器件上更划算;
    2、早已有更加合适的芯片选型方案;

    二、GD32F330C8T6是合适的选择

    1.兆易创新单片机是STM单片机的平替产品

    GD32F330C8T6与HC32F030性能比较:
    GD32F330C8T6:
    ① 主频 :84MHz
    ② 内核: Arm Cortex-M4
    ③ Flash:64K字节
    ④ RAM:8K字节
    ⑤ UART:2路
    ⑥ I2C:2路
    ⑦ SPI:2路
    ⑧ ADC:10通道
    ⑨ GPIO:39路

    HC32F030系列
    ①、主频48MHz
    ②、Contex M0内核
    ③、64KB Flash
    ④、8KB RAM
    ⑤、2路UART
    ⑥、2路I2C
    ⑦、2路或者1路SPI
    ⑧、10到24路ADC(12bit)
    ⑨、23到56路GPIO

    一个是M4内核,一个是M0内核,价格相近;GD32F330C8T6是GD32F330系列中的48脚的一个子型号,封装为LQFP48,也是比较容易布局的。

    2.使用GD32F330C8T6重新绘制的原理图

    1、在U2的18b20信号线上加上了上拉电阻;
    2、U5型号更换成了GD32F330C8T6

    PCB布局如下图:

    顶视图

    底视图

    18B20温度控制板

    总结

    目前使用GD32F330C8T6为CPU的温度控制板已经完成了基本功能;
    完整程序下次分享,笔者将会重点介绍:
    1、定时器2的初始化;
    2、两位8端数码管的驱动代码;
    3、主程序的设计思路;

    作者:电子设计笔记

    物联沃分享整理
    物联沃-IOTWORD物联网 » 18B20温度控制板使用教程:从华大HC32F030单片机到兆易创新GD32F330【四】

    发表回复