瀏覽代碼

采集板去轮询采集IO口数据时,现有的机制是每100ms读取对应的IO电平值,如果IO电平值在采集时机时会有抖动时,则会出现突变值。 这里应该引入IO软件去抖动机制,机制原理为IO口采集的一种连续性滤波式的认可机制,表现为某一代号的管脚的输入电平,连续重复几次都为高/低,才生效此高/低逻辑值。

xuy 3 年之前
父節點
當前提交
8dc8dc0a64
共有 5 個文件被更改,包括 92 次插入7 次删除
  1. 1 0
      Core/Inc/cang.h
  2. 3 0
      Core/Inc/config.h
  3. 50 4
      Core/Src/hdf.c
  4. 28 1
      Core/Src/kzq.c
  5. 10 2
      Core/Src/main.c

+ 1 - 0
Core/Inc/cang.h

@@ -34,6 +34,7 @@ uint16_t  Angle;										//0: 
 uint16_t  YQHS;										//0: 无油气回收阀,1:有油气回收阀
 
 uint16_t sensorBusMaxReTry; //xy, 去向传感器总线读取数据时,如遇无回应,则参照这个标定的重试最大值来获取异常
+uint16_t pinIOHitSameParam; //xy,  mcu的IO口采集的一种连续性滤波式的认可机制
 }Cang_Inf;
 
 extern Cang_Inf cang_inf;

+ 3 - 0
Core/Inc/config.h

@@ -1,6 +1,9 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
+// xy,2022-8-22,为了不干扰已分配的区,这里新开启一个区来存放新开发功能的固化参数 -> PinIoHitSame
+#define ADDR_PIN_IO_HIT_SAME     		0x0807B000                          //xy,2字节,PIN-IO采集用途的连续电平认可机制的参数
+
 #define CANG1_LEVEL_CAL                0x0807C000                          //1仓罐
 #define CANG2_LEVEL_CAL                0x0807C004                          //1仓罐
 #define CANG3_LEVEL_CAL                0x0807C008                          //1仓罐

+ 50 - 4
Core/Src/hdf.c

@@ -44,6 +44,42 @@ GPIO_PinState Get_Pin(int Pin_No)
 	return Pin_sts;
 }
 
+/**
+ ***************************************
+ * mcu的IO口采集的一种连续性滤波式的认可机制
+ * 原理为: 某一代号的管脚的输入电平,连续几次
+ * 检查都是相同值,才认可检查
+ * 输入:pinNo, 管脚代号,范围0-7
+ * 输入:pstatus,存放查询当前的管脚输入值
+ * 返回: 0-不认可,1-认可
+ ***************************************
+ */
+int DoPinIoHitSame(uint8_t pinNo, uint8_t *pstatus)
+{
+	uint8_t status = 0;
+	static struct pin_same {
+		GPIO_PinState status;
+		uint16_t same_count;
+	}pin_cache[8];
+	
+
+	if(pinNo > 7) return 0;
+	status = Get_Pin(pinNo);
+	*pstatus = status;
+	
+	if(pin_cache[pinNo].status == status) {
+		pin_cache[pinNo].same_count++;
+		if(pin_cache[pinNo].same_count >= cang_inf.pinIOHitSameParam){
+			pin_cache[pinNo].same_count = 0;
+			return 1;
+		}
+	}else {
+		pin_cache[pinNo].status = status;
+		pin_cache[pinNo].same_count = 0;
+	}
+
+	return 0;
+}
 
 void DF_State(uint8_t Cang_Num)         //查询仓底阀状态
 {
@@ -52,7 +88,8 @@ void DF_State(uint8_t Cang_Num)         //
 	RKG_Inf* prkg = rkg_inf;
 	HDF_Inf* phdf = hdf_inf;
   	uint8_t i = 0,j = 0,HDF_MAX = 3,PinNo;
-	
+	uint8_t status = 0, hit = 0;
+
 	if(pcang->HDF_Type == 0)         //底阀监测器
 	{
 		if(i < HDF_BUF_DEP)
@@ -66,7 +103,10 @@ void DF_State(uint8_t Cang_Num)         //
 				}
 				for (j = 0; j < HDF_MAX; ++j)
 				{
-					pxyf[j + 1].XYF_State1 = Get_Pin(PinNo++);
+					hit = DoPinIoHitSame(PinNo++, &status);
+					if(hit){
+						pxyf[j + 1].XYF_State1 = status;
+					}
 				}
 			}
 			if (pcang->RKG_Type == 2)
@@ -77,7 +117,10 @@ void DF_State(uint8_t Cang_Num)         //
 				}
 				for (j = 0; j < HDF_MAX; ++j)
 				{
-					prkg[1 + j].RKDG_State = Get_Pin(PinNo++);
+					hit = DoPinIoHitSame(PinNo++, &status);
+					if(hit){
+						prkg[1 + j].RKDG_State = status;
+					}
 				}
 			}
 			for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
@@ -86,7 +129,10 @@ void DF_State(uint8_t Cang_Num)         //
 			}
 			for (j = 0; j < HDF_MAX; ++j)
 			{
-				phdf[1 + j].HDF_OFData[i] = Get_Pin(PinNo++);
+				hit = DoPinIoHitSame(PinNo++, &status);
+				if(hit){
+					phdf[1 + j].HDF_OFData[i] = status;
+				}
 			}
 			i++;
 		}

+ 28 - 1
Core/Src/kzq.c

@@ -3817,6 +3817,33 @@ uint16_t RW_SensorBusMaxRetry(uint8_t* pTx)
 		return 0;
 }
 
+// mcu的IO口采集的一种连续性滤波式的认可机制的参数
+uint16_t RW_PinIoHitSameParam(uint8_t* pTx)
+{
+	Cang_Inf* pcang = &cang_inf;
+	KZQ_Inf* pkzq = &kzq_inf;
+	uint16_t Flash_buf[20] = {0};
+
+	// [7]为03,表示读取,06表示设置
+	// [16,17]在设置时有效,表示设置值
+	Flash_buf[0] = pkzq->data_buf[16]<<8|pkzq->data_buf[17];
+	if(pkzq->data_buf[7] == 0x06) {
+		Flash_WriteBytes(Flash_buf,ADDR_PIN_IO_HIT_SAME,1);
+	}
+	Flash_ReadBytes(Flash_buf,ADDR_PIN_IO_HIT_SAME,1);
+	
+	pTx[16] = Flash_buf[0]>>8;
+	pTx[17] = Flash_buf[0]&0xFF;
+	
+	if(Flash_buf[0] != 0xFFFF)
+		pcang->pinIOHitSameParam = Flash_buf[0];
+	
+	if((pTx[16] == pkzq->data_buf[16])&&(pTx[17] == pkzq->data_buf[17])&&(pkzq->data_buf[7] == 0x06))
+		return 1;
+	else
+		return 0;
+}
+
 	typedef union{
    float Ldcal_zero_temp1;   
    uint8_t arr1[4];
@@ -3910,7 +3937,7 @@ uint16_t Tem_SetType(uint8_t* pTx)
 	else
 		return 0;
 }
-uint32_t Version_Soft[8] = {2, 2, 3, 13, 1, 1, 0, 20220810};
+uint32_t Version_Soft[8] = {2, 2, 3, 13, 1, 1, 0, 20220822};
 uint16_t Read_SoftVersion(uint8_t *pTx)
 {
 	int i;

+ 10 - 2
Core/Src/main.c

@@ -42,7 +42,7 @@
 #include "yqhs.h"
 #include "iap.h"
 /* USER CODE END Includes */
-#if 0
+#if 1
 #define IR_ROM1   0x08000000
 #else
 #define IR_ROM1   0x08020000
@@ -771,6 +771,12 @@ void Cang_Init(void)
 		pcang->sensorBusMaxReTry = 3;
 	else
 		pcang->sensorBusMaxReTry = Flash_buff[0];
+
+	Flash_ReadBytes(Flash_buff,ADDR_PIN_IO_HIT_SAME,1);
+	if(Flash_buff[0] == 0xffff)
+		pcang->pinIOHitSameParam = 3;
+	else
+		pcang->pinIOHitSameParam = Flash_buff[0];
 	
 	Flash_ReadBytes(Flash_buff,CANG1_LEVEL_CAL,8);
 	if(Flash_buff[0] == 0xffff)
@@ -3067,7 +3073,9 @@ void StartTask04(void *argument)                                    //
 						break;	
 				case 0x80: SetSuccess = RW_SensorBusMaxRetry(ptx);										//传感器总线重试最大值来获取异常
 						break;
-			    case 0x017e: TOUCHUAN_UART_NUM(ptx);										              //设置智能海底阀放大倍数
+				case 0x81: SetSuccess = RW_PinIoHitSameParam(ptx);										//
+						break;
+				case 0x017e: TOUCHUAN_UART_NUM(ptx);										              //设置智能海底阀放大倍数
 										 Flash_Change = 1;		 
 						break;				
 					case 0x0180: SetSuccess = GRB_SET_Table(ptx);										      //罐容表配置  邵磊明增加