打印
[综合信息]

当PCNT外设遇到脉冲式温度传感器

[复制链接]
749|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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、 本例中使用的温度传感器,有两种输出模式,一种是单次模式,一种是连续模式,我们要使用输出单次模式的,不能使用连续模式的。

4178165782125047d0.png (13.97 KB )

4178165782125047d0.png

使用特权

评论回复
沙发
闻则123| | 2023-12-12 17:37 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

89

帖子

2

粉丝