微型433MHz无线接收模块

 

01 线接收模块


一、前言

  这款大功率433MHz 无线发射模块前天测试过。 由于手边的接收模块都是 315MHz, 所以还无法对其传输距离进行测试。  现在购买的微型433MHz 接收模块到货了。  它的结构极其简单, ·核心是一个SOP8封装的芯片。 晶振的频率为 6.7458MHz,  芯片的信号为 SYN480R。 ·下面对于这款接收模块进行测试。

GM1700456160_1280_720.MPG|_-7

二、接收波形

  在模块上增加一个软件作为接收天线。  其它三个管脚分别是电源、信号输出、地线。 通过面包板给接收模块增加3.3V电压。  示波器显示接收到了脉冲信号。  信号的最窄脉冲宽度为 500微秒, 对应2k 波特率。  发送信号编码芯片为 SC2262。  后面可以通过SC2272, 或者单片机对接收到的编码进行解码。  这样便可以获得发送开关信号了。

GM1700458146_1280_720.MPG|_-7

▲ 图1.2.1  接收到的信号波形

▲ 图1.2.1 接收到的信号波形

三、接收解码

  根据接收到的波形, 编码是由一群宽窄不同的脉冲组成。  每组脉冲之间有一段时间延迟。  可以根据这个延迟将不同编码脉冲群分开。  分割时间比编码脉冲低电平时间长,  大约15毫秒左右。  编码信号的窄信号,  时间为0.5毫秒。  宽信号为15毫秒。 它们分别对应0,1 编码。

GM1700458892_1280_720.MPG|_-8
  每组编码脉冲包括有25个脉冲,  对应 25bit。  具体编码方式, 现在可以不用追究。 针对发送 十六中组合进行分别测试。 便可以找到每种状态对应的编码了。

GM1700459086_1280_720.MPG|_-3

四、设计电路板

AD\Test\2023\TestSYN840R.PcbDoc

▲ 图1.4.1 单片机解码电路

▲ 图1.4.1 单片机解码电路

▲ 图1.4.2 单面制版电路PCB

▲ 图1.4.2 单面制版电路PCB

  使用STM32F030 单片机对接收信号进行解码。  昨天还是用这款单片机对于红外遥控信号进行解码。 采用 40kHz 信号对波形进行采样并且进行判断。  使用串口对其进行程序更新。  使用一颗1117 三端稳压芯片提供 3.3V 的工作电源。  接收模块通过 PRF输入。 信号进入 PA0 端口。  使用四个LED显示接收到的 16中编码状态。  设计单面电路图。  一分钟后得到测试电路板。  上面有一个跳线, 使用 0 欧姆电阻进行短路。  下面进行焊接测试。  最终测试这款接收模块可以在多远的距离接收到发送信号。

GM1700461837_1280_720.MPG|_-11
  电路比较简单, 焊接非常容易。  焊接完毕之后, 利用洗板水进行清洗。  下面便可以进行测试了。  现在看, 其中还有一个飞线还没有焊接,  使用 0 欧姆的电阻进行飞线, 最终电路便焊接完毕了。

GM1700463044_1280_720.MPG|_-5

五、软件设计

  通过 STM32Cobe MX 软件配置单片机资源。  使用串口辅助程序下载和调试。   PA8驱动工作状态LED。  这四个管脚对应的LED控制。  PA0 输入外部接收信号。  下面再配置其他资源。  设置 定时器1 , 使其处于 40kHz 中断状态。  配置 UART1 的参数。  选择内部时钟源, 频率为 48MHz。  最后生成可以使用的工程文件。

GM1700467260_1280_720.MPG|_-10
  在 Time1 的中断中, 反转 LED 管脚, 这里测试出 20kHz 的方波, 验证了Time1 的中断频率为 40kHz。  将接收模块安装在电路板的接口上。 此时, 发送模块还没有工作。  在模块的输出端是一些随机的高低电平变化。  将发送模块打开。  此时便可以接收到发送的编码了。

GM1700469113_1280_720.MPG|_-5

序号设置状态编码
100010x03aaaa
200100x0caaaa
301000x30aaaa
410000xc0aaaa
500110x0faaaa
601010x33aaaa

  通过对接收到的编码进行观察,  可以看到发送模块四个不同的管脚为1,  只是影响最高接收字节。 后面两个字节都是 aa。  由此, 可以推断出,  后面这些字节为地址和校验信息。  前面这八位, 分成四组, 分别对应四个设置管脚的高低电平。 可以根据这个特征来确定接收到的编码是否为合法的编码信息。

GM1700473272_1280_720.MPG|_-6

  现在测试发射端控制端口不同的电瓶配置。 可以看到接收端根据前面分析, 软件实现对应的 LED 等点亮。 验证了前面分析的结果。  到此, 验证了这款微型无线模块接收的特性。 并利用单片机对接收到的 SC2262 编码进行了识别。  这位后面验证功率模块发送能力奠定了基础。

GM1700474908_1280_720.MPG|_-3

D:\zhuoqing\window\ARM\IAR\STM32\Application\Test\2023\SC2262DecodeF030\Core\Src\main.c

 

  结 ※


  文对于这款基于 SYN480R 微型无线接受模块进行了初步测试。  利用单片机对接收到的信号进行解码。  后面将进行远距离接收测试, 看一下这个模块接受的灵敏度。

GM1700475061_1280_720.MPG|_-3


■ 相关文献链接:

● 相关图表链接:

解码相关程序

/*
**==============================================================================
** CONTROL.C:             -- by Dr. ZhuoQing, 2015-11-29
**
**==============================================================================
*/

//==============================================================================
//
//------------------------------------------------------------------------------
extern TIM_HandleTypeDef htim1;
void ControlInit(void) {

    HAL_TIM_Base_Start_IT(&htim1);
    
    OUT(LED1);
    OUT(LED2);
    OUT(LED3);
    OUT(LED4);
    
    //--------------------------------------------------------------------------
    
    g_ucLastStatus = VAL(INPUT);
    g_nOffCount = 0;
    g_nOnCount = 0;
    g_ucDecodeStatus = DECODE_STATUS_NULL;
    
    g_nReceiveCode = 0;
    g_nReceiveMask = 0x1;
    g_nReceiveCodeKeep = 0;
    g_nWaitCount = 0xffff;
    g_ucUpdateFlag = 0;
}

//------------------------------------------------------------------------------
void Time1ISR(void) {
    //--------------------------------------------------------------------------
        
    g_nWaitCount ++;
    if(g_nWaitCount > 5000) {
        g_ucDecodeStatus = DECODE_STATUS_NULL;        
    }
    
    //--------------------------------------------------------------------------
    
    if(VAL(INPUT)) {
//        ON(LED);
        
        if(g_ucLastStatus == 0) {
            if(g_ucDecodeStatus == DECODE_STATUS_WAIT) {
                g_ucDecodeStatus = DECODE_STATUS_BIT;
            }
        }
        
        g_nOnCount ++;        
        g_nOffCount = 0;
        g_ucLastStatus = 1;
        
    } else {
//        OFF(LED);
        
        if(g_ucLastStatus != 0) {
            if(g_ucDecodeStatus == DECODE_STATUS_BIT) {
                if(g_nOnCount > 40) g_nReceiveCode |= g_nReceiveMask;
                g_nReceiveMask <<= 1;
            }                                        
        }            
        
        //----------------------------------------------------------------------
        if(g_nOffCount > 500) {
            if(g_ucDecodeStatus == DECODE_STATUS_BIT)
                g_nReceiveCodeKeep = g_nReceiveCode;
                g_ucUpdateFlag = 1;
            
            g_nReceiveMask = 0x1;
            g_nReceiveCode = 0x0;
            g_ucDecodeStatus = DECODE_STATUS_WAIT;
            g_nWaitCount = 0;
        }               
        
        g_nOffCount ++;
        g_nOnCount = 0;
        g_ucLastStatus = 0;
        
    }        
}

unsigned char DecodeCode(unsigned int nCode) {
    if((nCode & 0xffff) != 0xaaaa) return 0x0;
    
    unsigned char ucCode = 0x0;
    
    nCode >>= 16;
    
    unsigned char ucBit2 = nCode & 0x3;
    if(ucBit2 == 0x3) ucCode |= 1;
    else if(ucBit2 != 0x0)  return 0;    
    nCode >>= 2;
    
    ucBit2 = nCode & 0x3;
    if(ucBit2 == 0x3) ucCode |= 2;
    else if(ucBit2 != 0x0)  return 0;    
    nCode >>= 2;
    
    ucBit2 = nCode & 0x3;
    if(ucBit2 == 0x3) ucCode |= 4;
    else if(ucBit2 != 0x0)  return 0;    
    nCode >>= 2;
    
    ucBit2 = nCode & 0x3;
    if(ucBit2 == 0x3) ucCode |= 8;
    else if(ucBit2 != 0x0)  return 0;    
    
    return ucCode;
}
    
void SetLEDsCode(unsigned char ucCode) {
    if(ucCode & 0x1)    ON(LED1);
    else OFF(LED1);
    
    if(ucCode & 0x2)    ON(LED2);
    else OFF(LED2);
    
    if(ucCode & 0x4)    ON(LED3);
    else OFF(LED3);
    
    if(ucCode & 0x8)    ON(LED4);
    else OFF(LED4);
    
}

//==============================================================================
//                END OF THE FILE : CONTROL.C
//------------------------------------------------------------------------------
/*
**==============================================================================
** CONTROL.H:             -- by Dr. ZhuoQing, 2015-11-29
**
**  Description:
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//==============================================================================
//
//------------------------------------------------------------------------------
void ControlInit(void);

void Time1ISR(void);

//------------------------------------------------------------------------------

CONTROL_EXT unsigned char g_ucLastStatus, g_ucDecodeStatus, g_ucUpdateFlag;
CONTROL_EXT unsigned int  g_nOffCount, g_nOnCount;
CONTROL_EXT unsigned int  g_nReceiveCode, g_nReceiveMask, g_nReceiveCodeKeep;
CONTROL_EXT unsigned int  g_nWaitCount;

unsigned char DecodeCode(unsigned int nCode);

void SetLEDsCode(unsigned char ucCode);

//==============================================================================
//             END OF THE FILE : CONTROL.H
//------------------------------------------------------------------------------
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐