50个树桩阴影* Microchip微控制器以硬件方式接收PWM编码信号


* NIP-Microchip微控制器中的内核独立外围设备,也称为CIP-内核独立外围设备。

第4部分


先前的文章[ 1 ],[ 2 ]和[ 3 ]专门介绍了内核独立(NEV)Microchip微控制器的外设:可配置逻辑单元,具有限流功能的输入/输出端口以及具有计算机的ADC;显示了此类外设的一些功能。 让我提醒您,隐含的独立性不是取决于微控制器的PIC内核类型(BaseLine,中档,增强型中档,PIC18、16位,32位),而是取决于内核的操作即即。 独立执行分配给CPU外围状态的任务。 这样的外围设备,尤其是配置它以进行硬件功能的协作和综合的可能性,旨在减轻软件部分的负担并降低功耗。

在这篇简短的文章中,我想展示使用独立于内核的外设实现“定制”非标准通信接口的接收示例。

当离散信号log.1和log.0由脉冲宽度编码时,信息的PWM编码非常普遍。 考虑使用与外围内核无关的PIC控制器接收和解码此类信号的选项。

AM2302传感器信号的PWM解码


在DIY项目中,经常使用DHT22温湿度传感器(AM2302)。 该传感器具有3个输出,信息通过单线传输。 响应该请求(大约1ms的低电平),传感器响应一个起始位,然后响应一个40位的序列,其中信息以脉冲持续时间log编码。 “ 0”-脉冲数30mk秒,记录。 “ 1”-70mk秒(典型值)。 传感器的响应包含5个字节:2个字节的湿度数据,2个温度的字节和1个控制字节。


图1。 DHT22传感器信号生成原理的说明。

网络上有许多在Arduino上使用此类传感器的示例。 一些库实现使用以下构造:

loopCnt = TIMEOUT; while(PIN) { if(--loopCount == 0) return ErrorTimeout; } if (loopCnt < cntOne) { // bit =1 … } else { // bit =0 … } 

在这样的实现中,我看到以下问题:

-整个测量时间(> 5ms)的程序在测量代码中“挂起”;
-发生足够长的中断会中断从传感器读取数据;
-在微控制器的低时钟频率下工作的潜在问题;

这种解决方案的程序算法大致具有以下形式(见图2)


2.一种用于以编程方式接收和解码传感器信号的算法。

以下被认为是具有最小软件开销的协议的硬件接收/解码的变体。

其思想是从位流中隔离时钟脉冲,然后将原始信号和时钟脉冲的方向隔离到SPI硬件模块。 在这种情况下,微控制器的程序只能从SPI顺序获取5个字节的数据。

CIP的一部分是计时器,它可以触发事件(输入状态或其他外设的更改)。 即 改变输入状态可以触发一个定时器,见图3中的TMR6信号。 当定时器达到设定值时,其计数停止,定时器处于TMR6 = PR6(PR-周期寄存器)状态。 计时器状态可以是可配置逻辑单元(CLC,请参见第1部分)的输入。

因此,使用定时器和逻辑单元,我们可以生成适合于SPI模块SCK时钟输入的信号。 为了提取信息,这种块的持续时间应该具有在零和一之间的平均值。 然后,SPI可以根据块的衰减来固定该位(见图3 SCK信号)。

来自传感器的信号将具有从请求脉冲和启动脉冲生成的错误脉冲。 为了避免这些脉冲干扰操作,您只需要在信息脉冲持续时间内使能SPI,或者切断不必要的脉冲即可。 我们也可以使用CIP解决此问题。

另一个计时器用作切换衰退的脉冲计数器:将2写入周期寄存器,计时器对前2个脉冲进行计数(请参见图3中的信号TMR4)并停止计数(请参见图3中的EN信号),通过逻辑单元块允许将剩余脉冲发送到输入SPI。


图3。 解释DHT22传感器信号接收的图。

SCK信号生成的逻辑功能是在一个逻辑单元(CLC)上实现的,AND-OR配置的完整电路如图4所示。

逻辑单元的输出连接到SCK输入,DHT22传感器信号连接到SPI模块的MOSI。 所有连接都在微控制器内部进行(图5)。 为了进行监视和调试,可以将信号输出到微控制器的端口。


图4。 PIC微控制器中的CLC逻辑单元配置。


5.外围结构的完整结构。

如果似乎有2个用于解码传感器协议的计时器浪费了资源,那么可以在空闲的CLC逻辑单元上“收集”最多2个计数器。

总的来说,解码任务归结为一个非常简单的算法:微控制器及其外围设备被初始化,必要时打开SPI模块并生成测量请求(记录“ 0”约1毫秒)。

当发生SPI中断时,它仍然从缓冲区读取数据。


图6。 使用树桩时用于DHT22传感器的算法。


图7。 来自微控制器端口的信号。 信号SSP1IF-SPI模块接收到字节后中断。

图7显示了信号图,其中:
DHT(dat)-传感器信号线上的信号-馈入MOSI模块SPI的输入;
TMR6!= RP6-专用时钟-发送至SPI模块的SCK;
SSP1IF-中断信号(SPI缓冲区中的数据就绪)-实际上,此信号显示了微控制器内核的负载-读取结果数据。

解码其他PWM协议


家用电器的红外遥控器中使用了类似的“单线” PWM协议。 通常在IR传输期间,当持续时间恒定且暂停时间可变时,将使用按脉冲位置进行编码。 此选项也称为“可变暂停编码”。 实际上,这是相同的PWM编码,但信号反相。 在存在逻辑单元的情况下,反转不是问题,此外,IR接收器会将接收到的信号反转。 在图。 图8显示了接收器从两个不同的控制台接收到的信号。



图8。 红外遥控器的编码选项。

两个遥控器都有不同的协议,但是这些协议很容易以上述方式进行解码,唯一的问题是必须确定发送的开始以同步SPI的包含,因为IR接收器可能会遇到干扰。



9.使用SPI解码的信号。

并非所有的红外遥控器都具有PWM编码。 一些协议,例如RC5,具有相位编码(曼彻斯特码,“ 0”发送为10,“ 1”发送为01)[4]。 在第一部分[1]中我们已经考虑过使用独立于内核的外围对曼彻斯特代码进行解码。

总结


我们将信息包的接收转移到硬件上,而不是微控制器的CPU负载的几乎100%用于在Arduino版本中解码PWM协议(是的,我知道,使用捕获模块或其他外设可以更有效地解决问题)。 输入信号的前面将启动计时器,计时器的状态确定逻辑单元块的输出,逻辑单元的输出将馈送到SPI。

使用独立于内核的外设可以优化资源的使用,将某些任务转移到硬件,简化代码并减少消耗。

文学作品


1. PIC控制器中的可配置逻辑单元。
2. 50个树桩阴影。 输入/输出端口
3. 50个树桩阴影。 ADC和具有Microchip微控制器计算机的ADC
4. sbprojects.com/knowledge/ir/rc5.php

Source: https://habr.com/ru/post/zh-CN401541/


All Articles