STM32F4单片机HAL库使用SUI101-A模块(简易版)

SUI101-A这个模块在采样率要求不高的情况下测量还是很精准的,也可以方便的测量功率因数等参数,淘宝商家给的例程不好用,本文提供一种单片机自动调用模块的简易方法。

使用的工具:CubeMX+keil5

关于自定义简易协议

查看使用说明书,我们使用单片机操作模块可以使用自定义简易协议

使用单片机串口向模块发送55 55 01 01 00 00 AC即可获取主要测量值,再根据其字节位置解析即可。

CubeMX配置

除基础的系统配置始终配置外,使用该模块只需要打开串口

一个串口操控一个模块,注意波特率设置为9600Bits/s,与模块默认波特率匹配。

然后在NVIC设置中打开串口中断

生成代码即可。

模块连接

测量端按照说明书连接即可,串口端连接如下:

  • TXD (模块发送) 接 STM32的RX引脚(如USART1_RX是PA10)
  • RXD (模块接收) 接 STM32的TX引脚(如USART1_TX是PA9)
  • GND 接 GND
  • 5V接单片机5V输出供电

和普通串口一样很简单。

代码编写

变量定义:

uint8_t  Uart1_RxBuf[20]={0};//串口接收缓冲
uint8_t  Uart1_Data;
uint32_t Uart1_RxCnt=19;//接收计数

由于主要测量值的数据帧长度是19字节,定义一个20字节长度的RxBuf用于存放接收到的数据

Data是将数据存放到数组是的中间变量

RxCnt计数,判断是否完成一次接收

void GetVal()
{
	uint8_t CmdTxBuf[]={0x55,0x55,0x01,0x01,0x00,0x00,0xAC};//指令码
	Uart1_RxCnt=0;//接收计数置零
	HAL_UART_Transmit(&huart1, CmdTxBuf,7,0xFFFF);//发送指令码
    /*
     * 下方三个主要测量值根据字节数转换即可
     */
	U_RMS = (double)(((uint32_t)Uart1_RxBuf[6] <<24)|((uint32_t)Uart1_RxBuf[7] <<16)|((uint32_t)Uart1_RxBuf[8] <<8)|((uint32_t)Uart1_RxBuf[9] <<0))/1000.0;
	I_RMS = (double)(((uint32_t)Uart1_RxBuf[10]<<24)|((uint32_t)Uart1_RxBuf[11]<<16)|((uint32_t)Uart1_RxBuf[12]<<8)|((uint32_t)Uart1_RxBuf[13]<<0))/1000.0;
	PA = (double)(((uint32_t)Uart1_RxBuf[14]<<24)|((uint32_t)Uart1_RxBuf[15]<<16)|((uint32_t)Uart1_RxBuf[16]<<8)|((uint32_t)Uart1_RxBuf[17]<<0))/1000.0;
}

测量值的提取,以电压有效值为例,在接收到的数据帧中,电压值是第7到第10字节,对应我们数组中的6-9位,按照代码的方法转换即可。

HAL_UART_Receive_IT(&huart1,&Uart1_Data,1);

在主函数中使能串口接收中断(USER CODE BEGIN 2 的位置)

接下来先看主循环

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(Uart1_RxCnt>=19)
			GetVal();
  }
  /* USER CODE END 3 */

RxCnt一开始被定义为19,所以单片机刚启动时会执行GetVal();

这可能导致一个问题,如果模块没有连接,第一次发送指令码没有得到回应,就无法再进入GetVal(),代码有待改进,在使用时避免这个问题就好。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断服务函数
{
	if(huart==&huart1)
	{
		Uart1_RxBuf[Uart1_RxCnt++]=Uart1_Data;
		HAL_UART_Receive_IT(&huart1,&Uart1_Data,1);
	}
}

使用接收一个完整字节出发一次中断的方式将接收到的字节按顺序存入数组,并增加计数值。

完成以上模块应该就可以正常使用了,如果有问题可以先用USB转TTL模块将电脑和SUI101模块连接,发送 >>GetVal 检查模块是否是好的,正常情况下应该返回全部测量值。

本文的驱动方式大量调用串口中断,可能会导致系统延迟,而且也不太稳定,虽然使用时没有出现什么问题但希望有大佬提出更好的方法。

附:SUI101-A使用说明书

淘宝商家会发,为了方便,这里直接附上全部截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值