找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6323|回复: 3
收起左侧

KQ-130F电力线载波模块的stm32驱动源码与资料下载

[复制链接]
ID:301979 发表于 2018-4-5 14:43 | 显示全部楼层 |阅读模式
*STM32源程序要感谢 ibeerbear 无私的奉献
* 说明:利用 STM32 的 USART1 与 KQ-130F 通信,已调试通过
* 线接法:STM32/PA9/TX -> KQ130F/RX,STM32/PA10/RX -> KQ130F/TX,KQ130F/MODE接地,KQ130F/NC悬空,KQ130F双 +5V 供电,AC 脚接家用插座
* 另外:1,KQ130F工作电压可以调整为 3.3v;2,发送帧之间一定要有时间间隔
*/

0.jpg
1PAC220V交流电压的火线(或零线)
2PAC220V交流电压的零线(或火线)
3P+5V+5V发送电源(260mA),如果单收数据可以悬空降低功耗
4PGND:数字电路地线
5P+5V+5V工作电源11mA
6PRXTTL电平,载波数据入,接单片机的TXD高阻输入不能悬空
7PTXTTL电平,载波数据出,接单片机的RXD
8PMODE:模式选择,悬空或接5V为高电平,接地为低电平
9PNC/RST :复位脚(低电平有效)只有在工作时频繁切换模式时使用。毋需此功能,引脚应悬空
四、KQ130F系列模块编程注意事项
本模块接口波特率9600bps,用户与模块通讯请采用9600BPS异步方式,格式为1个起始位,8个数据位1个停止位格式。
本模块通过MODE脚控制模块使用透明工作方式(高电平),还是自定义工作模式(低电平)。MODE高电平(悬空)时为透明工作模式,低电平(接地)时为自定义工作模式。
在透明工作模式时:(MODE=1即MODE悬空或接5V。建议悬空)在编程时毋需对模块初始化,通讯时和普通RS-485方式类同。但是,由于电力线上负载比较多,电器所产生的谐波也就无法避免地耦合到电力线上,本模块是高灵敏度的载波模块,在所有载波模块都处于接收状态时,电力线上就会全部被电器所产生的谐波所覆盖,这时,模块将解调出噪声数据从TX端输出。所以发送和接收数据应该引入同步码以区分真正的传送数据。
注意:在模块发送缓存器(253字节)满后不再接收新的数据。也就是一帧发送字节小于253个字节。用户的一帧数据请连续不间断的发送到模块,如果停顿时间超过模块已发送完所有的数据时间(缓存器空,最后一个字节已完全发送),接收方的模块可能会插入噪声数据。
如向RX端连续发送: 5A 5A 5A 34 56 78 12 45 67  在其他接收模块就可能输出
FE FD EF 5A 5A 5A 34 56 78 12 45 67 85 DE EF.加黑的字节是在所有模块都没发送数据时,接收模块接收到的噪波数据。
接收数据还是采用9600BPS异步方式,格式为1个起始位,8个数据位1个停止位格式,从TX送出,但是大约要每0.09秒左右发送一次。在自定义工作模式时也等同。
在自定义工作模式时:(MODE=0即MODE接地)用户按照我公司的定义传送数据,一帧传送数据定义如下:
第一个字节:要传送一帧的字节数0-250(不含第一个字节)
第二个字节到第n+1个字节:用户需传送的字节数据
注意:在模块还没发送完一帧数据时,不会接收下一帧数据。
接收数据和发送数据等同。
如向RX端发送: 02 AE 87 在其他模块TX就输出02 AE 87
    02是字节长度,这表示后面有2个字节的数据。
如向RX端发送: 09 01 02 03 04 05 06 07 08 09
在其他模块TX就输出09 01 02 03 04 05 06 07 08 09
    09是字节长度,这表示后面有9个字节的数据。
最大的字节长度可到253.
如向RX端发送: FD 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E...FD
在其他模块TX就输出FD 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E...FD
有效的数据可以到253个。

        // 先配置 STM32 RCC、GPIO 等
        // 再配置 USART1
  1.         void USART1_Config(void) {
  2.                 // 别忘记配置 USART1 的 RCC
  3.                
  4.                 GPIO_InitTypeDef GPIO_InitStructure;
  5.                 USART_InitTypeDef        USART_InitStructure;

  6.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  7.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  8.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  9.                 GPIO_Init(GPIOA, &GPIO_InitStructure);

  10.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  11.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  12.                 GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.                 USART_InitStructure.USART_BaudRate = 9600;
  14.                 USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  15.                 USART_InitStructure.USART_StopBits = USART_StopBits_1;
  16.                 USART_InitStructure.USART_Parity = USART_Parity_No ;
  17.                 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  18.                 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  19.                
  20.                 USART_Cmd(USART1, DISABLE);
  21.                 USART_Init(USART1, &USART_InitStructure);
  22.                 USART_Cmd(USART1, ENABLE);
  23.         }



  24. #ifdef _SERVER_
  25.         unsigned char        data;
  26. #elif defined _CLIENT_
  27.         unsigned char Buffer[] = { 7,0,1,2,3,4,5,6 };
  28.         unsigned int Index = 0;
  29. #endif

  30.         while (1) {
  31. #ifdef        _SERVER_
  32.                 if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
  33.                         data = USART_ReceiveData(USART1);
  34.                         if(data <= 7) {
  35.                                 // 在这里添加处理数据的代码
  36.                                 LED_Toggle(GPIO_LED_PORT, GPIO_LED_PIN);
  37.                         } else {
  38.                                 // 在这里添加错误数据处理代码
  39.                         }
  40.                 }
  41. #elif defined _CLIENT_      
  42.                 Index = Index % 8;               
  43.                 if (Index == 0) {
  44.                         // Delay 函数利用 systick 精确延迟 2 秒
  45.                         Delay(2 * 1000 * 1000);
  46.                 }               
  47.                 USART_SendData(USART1, Buffer[Index++]);
  48.                 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  49. #endif
  50.         }
复制代码

资料从官网上找的,不知道有没有用过的: 20140619104969976997.doc (418.5 KB, 下载次数: 36)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:400026 发表于 2019-6-13 15:54 | 显示全部楼层
多谢分享
回复

使用道具 举报

ID:724276 发表于 2020-4-7 21:27 | 显示全部楼层
感谢分享!很实用!
回复

使用道具 举报

ID:542624 发表于 2020-11-18 15:08 | 显示全部楼层
有没有原理图可以借鉴一下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表