18B20温度控制板使用教程:从华大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);
切成功了,时钟确实是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、主程序的设计思路;
作者:电子设计笔记