【用18B20温度控制板介绍华大HC32F030单片机 (四)——由华大HC32F030换成兆易创新GD32F330】


前言

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、主程序的设计思路;

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值