本帖最后由 liuyuxiier 于 2023-12-12 17:07 编辑
在某项目中,需要进行温度测量。 发现得明的7536系列温度传感器比较符合使用要求。 此传感器封装小,精度高,功耗低,关键是硬件接口简单,同样是单总线接口,使用起来非常方便。 配合小华L196的PCNT外设,可以非常方便的读取温度值。
得明7536数字温度传感器的输出信号非常容易理解,在上电使能后,传感器会输出一系列脉冲,使用脉冲的个数表示目前的温度,每个脉冲表示0.0625度的精度,脉冲个数*0.0625就是当前的实际温度值。输出脉冲如下所示:
实际电路只需要一个IO口即可,下图的上拉电阻,可以使用芯片内部的IO上拉电阻,不需要额外其他电路。
7536这一输出信号特性,与小华PCNT的外设就是绝配,PCNT天生就是数脉冲的外设,并且在休眠之后也能计数。
PCNT外设的框图如下 根据框图和手册描述,PCNT支持单通道计数和双通道的正交/非交解码。我们这里采集温度只需要单通道计数功能就可以了。
当配置 PCNT_CTRL.Mode 为 0x00 或 0x01 时,脉冲计数器工作于单通道脉冲计数模式。 该模式下解码模块只对 S0 脉冲信号进行计数。 当 PCNT_CLK 时钟采样到 S0PF 信号的下降沿时, 计数器按PCNT_CTRL.DIR 的配置进行一次递增或递减操作。 计数器的计数范围为 0x00 至计数上阈值(PCNT_TOP)。 我们这里需要使用递增计数。
主要代码如下 首先要配置连接温度传感器的IO口,这里我们使用PB5,复用为PCNT的S0输入端口 void DM7536_GpioInit(void) { stc_gpio_cfg_t GpioInitStruct; DDL_ZERO_STRUCT(GpioInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
GpioInitStruct.enDrv = GpioDrvH; GpioInitStruct.enDir = GpioDirIn; GpioInitStruct.enPu = GpioPuDisable; //先不开启上拉,读取温度时再开启 Gpio_Init(GpioPortB,GpioPin5,&GpioInitStruct);
Gpio_SetAfMode(GpioPortB,GpioPin5,GpioAf6); //PB05作为PCNT_S0 }
然后配置PCNT外设,配置为S0单通道计数递增模式 void PcntInit(void) { stc_pcnt_initstruct_t PcntInitStruct; DDL_ZERO_STRUCT(PcntInitStruct);
Sysctrl_SetPeripheralGate(SysctrlPeripheralPcnt, TRUE);
PcntInitStruct.Pcnt_S0Sel = PcntS0PNoinvert; //S0输入极性不取反 PcntInitStruct.Pcnt_Clk =PcntCLKPclk; //采样时钟 PcntInitStruct.Pcnt_Mode =PcntSingleMode; //单通道脉冲计数模式 PcntInitStruct.Pcnt_FltEn = FALSE; //滤波不使能 PcntInitStruct.Pcnt_TocrEn = FALSE; //超时控制不使能 PcntInitStruct.Pcnt_Dir =PcntDirUp; //向上计数 Pcnt_Init(&PcntInitStruct);
Pcnt_SetB2T(0xffff); Pcnt_ClrItStatus(PcntOV); }
最后是读取温度的函数 void Get_ DM7536_Pluse(void) { Pcnt_SetB2C(0x00); //清除脉冲底数 //开启上拉,温度传感器输出脉冲 SetBit(((uint32_t)&M0P_GPIO->PAPU+ GpioPortB), GpioPin5, GpioPuEnable);
delaytest(1); //等待脉冲输出完成
//关闭上拉,关闭温度传感器 SetBit(((uint32_t)&M0P_GPIO->PAPU+ GpioPortB), GpioPin5, GpioPuDisable);
DM7536_Pluse= Pcnt_GetCnt(); }
DM7536_Pluse就是温度传感器输出的脉冲数了,经过简单的换算就可以得到实际温度值了。
以上就是使用PCNT与DM7536测量温度的方法了, 有两个细节需要注意一下: 1、 虽然PCNT有S0和S1两个输入通道,但是只有S0能做单通道使用,S1不能单独使用。 2、 本例中使用的温度传感器,有两种输出模式,一种是单次模式,一种是连续模式,我们要使用输出单次模式的,不能使用连续模式的。
|