ソースを参照

ibuttton 驱动完成, 油品识别功能完成, 状态指示更新

guoqiang 10 ヶ月 前
コミット
2baec64438
共有10 個のファイルを変更した6437 個の追加6522 個の削除を含む
  1. 0 2
      Device/AngleSensor.c
  2. 67 11
      Device/IB_Reader.c
  3. 5 1
      Device/IB_Reader.h
  4. 7 0
      Device/gpio.c
  5. 14 0
      Device/gpio.h
  6. 92 47
      Project/AirControlValve.uvguix.JL200
  7. 6197 6299
      Project/JLinkLog.txt
  8. 50 160
      User/process.c
  9. 4 1
      User/process.h
  10. 1 1
      User/protocol.c

+ 0 - 2
Device/AngleSensor.c

@@ -287,8 +287,6 @@ void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
 	
 	if(SPI_GetTransmitReceiveStatus(SPI0) & SPI_STATUS_RX_FINISH_MASK) //µÈ´ý¶ÁÈ¡Íê±Ï
 	{
-		//printf("SPI0_Callback SPI_STATUS_RX_FINISH_MASK  \r\n");
-
 		ENC_CS_H;
 		Angle_Correct(Parse_EncAngle());
 		

+ 67 - 11
Device/IB_Reader.c

@@ -1,5 +1,6 @@
 #include "IB_Reader.h"
 #include "gpio.h"
+#include "string.h"
 
 #define  IB_READ_ROM    (0x33)
 #define  IB_MATCH_ROM   (0x55)
@@ -12,7 +13,9 @@
 #define  IB_READ_MEMORY       (0xF0)
 
 
-static uint8_t rom_id[16]={0};
+static uint8_t rom_id[8]={0};
+static uint8_t oil_type = OIL_TYPE_NULL;
+static uint8_t ib_readerror_count = 0;
 
 /**
    *   @brief   初始化
@@ -27,14 +30,14 @@ uint8_t OneWire_Init()
 	IBTX_WIRE_HIGH;         //先将总线拉高
 	IBTX_WIRE_LOW;         //然后将总线拉低
 	
-	udelay(500);
+	udelay(480);
 	
 	IBTX_WIRE_HIGH;         //释放总线
 	udelay(70);		//Delay 70 us
 	
 	Ackbit=IBRX_WIRE_BIT;    //读取应答位
 	
-	udelay(500);  //Delay 500 us
+	udelay(410);  //Delay 500 us
 	
 	return Ackbit;
 	
@@ -62,8 +65,9 @@ void OneWire_Senbit(uint8_t Bit)
      //      则DQ一直会被拉低,如果是1,主机也会将DQ拉高,最后等50us后将数据发送即可       
  
  
-	  udelay(45);   			//Delay 50 us
+	  udelay(50);   			//Delay 50 us
 		IBTX_WIRE_HIGH;      //拉高,便于下次发送
+		udelay(5);   			//Delay 50 us
 }
 
 /**
@@ -143,11 +147,13 @@ uint8_t IBread_ROMID(void)
 	Ackbit = OneWire_Init();		//总线初始化时序
 	
 	if(0 == Ackbit){
+		//printf("IBread_ROMID recv ack \r\n");
 		OneWire_SenByte(IB_READ_ROM);		//发送读ROMID指令
 	
 		for(i=0; i<8;i++){
 			rom_id[i]=OneWire_ReceiveByte();		//第一个字节为低位
 		}
+		
 	}
 
 
@@ -159,18 +165,58 @@ uint8_t IBread_Memory(void)
 {
 	uint8_t Ackbit = 1;
 	uint8_t i=0;
+	
+	memset(rom_id, 0, sizeof(rom_id));
 	Ackbit = OneWire_Init();		//总线初始化时序
 	
-	OneWire_SenByte(IB_SKIP_ROM);	
-	OneWire_SenByte(IB_READ_MEMORY);	
-	OneWire_SenByte(0x00);	
-	OneWire_SenByte(0x00);	
+	if(0 == Ackbit){
+		
+		OneWire_SenByte(IB_SKIP_ROM);	
+		OneWire_SenByte(IB_READ_MEMORY);	
+		OneWire_SenByte(0x00);	
+		OneWire_SenByte(0x00);	
+		
+		for(i=0; i<2;i++){
+			rom_id[i]=OneWire_ReceiveByte();		//第一个字节为低位
+		}
+		
+		//油品两个字节互为补码
+		if((0 == (rom_id[0]&rom_id[1])) && (0xFF == (rom_id[0]|rom_id[1]))){
+			oil_type = rom_id[0];
+			ib_readerror_count = 0;
+		}else{
+			
+			if(((0xFF == rom_id[0]) && (0xFF == rom_id[1])) || ((0x00 == rom_id[0]) && (0x00 == rom_id[1])))
+			{
+				//断开
+				oil_type = OIL_TYPE_NULL;
+				ib_readerror_count = 0;
+
+			}else{
+				//通信错误 或有干扰
+				ib_readerror_count++;
+				
+				if(ib_readerror_count >= 3){
+					ib_readerror_count = 3;
+					oil_type = OIL_TYPE_NULL;
+				}
+				
+			}
+			
+		}
 	
-	for(i=0; i<16;i++){
-		rom_id[i]=OneWire_ReceiveByte();		//第一个字节为低位
+	}else{
+		//通信错误 无ACK
+		ib_readerror_count++;
+		
+		
+		if(ib_readerror_count >= 2){
+			ib_readerror_count = 3;
+			oil_type = OIL_TYPE_NULL;
+		}
 	}
 
-return 0;
+	return 0;
 	
 }
 
@@ -181,4 +227,14 @@ void IB_Print(void)
 	
 	printf("memory:[%x][%x][%x][%x][%x][%x][%x][%x] \r\n", rom_id[0],rom_id[1],rom_id[2],rom_id[3],rom_id[4],rom_id[5],rom_id[6],rom_id[7]);
 
+}
+
+void IBRead_OilType(void)
+{
+	IBread_Memory();
+}
+
+uint8_t IBGet_OilType(void)
+{
+	return oil_type;
 }

+ 5 - 1
Device/IB_Reader.h

@@ -41,9 +41,13 @@ extern "C" {
 #include "ac780x_gpio.h"
 #include "ac780x.h"
 
+#define OIL_TYPE_NULL  (0)
+
+
 /*¶ÁÈ¡ÓÍÆ·ÀàÐÍ*/
 void IB_Print(void);
-uint8_t IBread_OilType(void);
+void IBRead_OilType(void);
+uint8_t IBGet_OilType(void);
 
 
 

+ 7 - 0
Device/gpio.c

@@ -136,6 +136,13 @@ void Gpio_Init(void)
 		
 		GPIO_SetFunc(IBRX_PORT, IBRX_PIN, GPIO_FUN0);
 		GPIO_SetDir(IBRX_PORT, IBRX_PIN, GPIO_IN);
+		
+		//IButton ָʾµÆ
+		GPIO_SetFunc(IB_GREEN_PORT, IB_GREEN_PIN, GPIO_FUN0);
+		GPIO_SetDir(IB_GREEN_PORT, IB_GREEN_PIN, GPIO_OUT);
+		
+		GPIO_SetFunc(IB_RED_PORT, IB_RED_PIN, GPIO_FUN0);
+		GPIO_SetDir(IB_RED_PORT, IB_RED_PIN, GPIO_OUT);
 }
 
 

+ 14 - 0
Device/gpio.h

@@ -103,6 +103,20 @@ extern "C" {
 #define IBTX_WIRE_LOW				GPIO_SetPinLevel(IBTX_PORT, IBTX_PIN, GPIO_LEVEL_HIGH)
 #define IBRX_WIRE_BIT     GPIO_GetPinLevel(IBRX_PORT,IBRX_PIN)
 
+#define IB_GREEN_PORT			(GPIOB)
+#define IB_GREEN_PIN			(GPIO_PIN12)
+
+#define IB_RED_PORT			(GPIOB)
+#define IB_RED_PIN			(GPIO_PIN11)
+
+/*IBLED¶¯×÷¶¨Òå.*/	
+#define IB_GREEN_ON				do{GPIO_SetPinLevel(IB_GREEN_PORT, IB_GREEN_PIN, GPIO_LEVEL_HIGH);}while(0)
+#define IB_GREEN_OFF			do{GPIO_SetPinLevel(IB_GREEN_PORT, IB_GREEN_PIN, GPIO_LEVEL_LOW);}while(0)
+#define IB_RED_ON					do{GPIO_SetPinLevel(IB_RED_PORT, IB_RED_PIN, GPIO_LEVEL_HIGH);}while(0)
+#define IB_RED_OFF				do{GPIO_SetPinLevel(IB_RED_PORT, IB_RED_PIN, GPIO_LEVEL_LOW);}while(0)
+#define IB_GREEN_TOGGLE		do{if(GPIO_GetPinLevel(IB_GREEN_PORT, IB_GREEN_PIN)){IB_GREEN_OFF;}else{IB_GREEN_ON;}}while(0)
+#define IB_RED_TOGGLE			do{if(GPIO_GetPinLevel(IB_RED_PORT, IB_RED_PIN)){IB_RED_OFF;}else{IB_RED_ON;}}while(0)
+
 #define ENC_CS_L                   do{GPIO_SetPinLevel(GPIOA, GPIO_PIN8, GPIO_LEVEL_LOW);}while(0)
 #define ENC_CS_H                   do{GPIO_SetPinLevel(GPIOA, GPIO_PIN8, GPIO_LEVEL_HIGH);}while(0)
 

File diff suppressed because it is too large
+ 92 - 47
Project/AirControlValve.uvguix.JL200


File diff suppressed because it is too large
+ 6197 - 6299
Project/JLinkLog.txt


+ 50 - 160
User/process.c

@@ -17,11 +17,14 @@
 uint8_t		g_devicebusy = 0;
 uint16_t	g_blinkLedTime = 0;									/*LED闪烁频率控制时间*/
 uint16_t	g_blinkLedTgtTime = BLINK_LED_DFTT;	/*LED目标闪烁频率*/
+uint16_t  g_IBLed_count = 0;
 uint16_t	g_period1000ms = 0;
 uint8_t		g_detectTime = 0;										/*状态检测时间*/
 uint16_t   g_angleRead_Interval = 5;          //读取编码器角度间隔 
 uint16_t   g_angleRead_Count = 0;             //读取编码器角度计数
 
+uint16_t   g_ibRead_count =0;     //ibutton 油品读取计数 
+
 uint32_t	g_poweroff_count = 0;				/*外部电源停止后、每秒计数加1*/
 
 #define STATUS_DETECTINTERVAL  (10)  /*10ms */
@@ -55,7 +58,6 @@ static uint8_t tmp_pwmout;
 
 static void update_runstate()
 {
-
 		switch(g_lockstatus){
 			case STATUS_INTERMEDIATE:
 				g_runstate = STATE_INTERMEDIATE;
@@ -70,14 +72,19 @@ static void update_runstate()
 				g_runstate = STATE_SAMPLE;
 				break;
 			case STATUS_UNKOWN:
+				g_runstate = STATE_UNKOWN;
+				break;
+			case STATUS_ENCODER_ERROR:
 				g_runstate = STATE_EXCEPTION;
 				break;
 			default:
 				break;
 		};
+		
+		if(STATUS_COVEROPEN == g_coverstatus){
+				g_runstate = STATE_OPENCOVER;
+		}
 	
-
-
 }
 
 void Process_Init(void)
@@ -90,6 +97,7 @@ void Process_Init(void)
 		g_runstate = STATE_LOCK;
 		g_angleRead_Interval = 500;
 		g_angleRead_Count = 0;
+		g_ibRead_count =0;
 	
 		s_angle = AngleSensor_GetAngle();
 		g_lockstatus=get_lockstatus();
@@ -131,10 +139,11 @@ void Process_RunPrd(void)
 				GREENLED_TOGGLE;
 				g_blinkLedTgtTime = 200;
 				break;
-			case STATE_OPENCOVER:
+			case STATE_UNKOWN:
 				REDLED_OFF;
 			  GREENLED_ON;
 				break;
+			case STATE_OPENCOVER:
 			case STATE_EXCEPTION:
 			default:
 				GREENLED_OFF;
@@ -142,9 +151,29 @@ void Process_RunPrd(void)
 				break;
 		
 		};
-	
 		
-
+		if(g_ibRead_count >= 1000){
+			g_ibRead_count = 0;
+			
+			//在控制电机转动时, 不对ibutton 进行读取 
+			if((MOTOR_READY == g_motorstate) || (MOTOR_STOPED == g_motorstate)){
+				IBRead_OilType();
+			}
+			
+		}
+		
+		if(g_IBLed_count >= 500){
+			g_IBLed_count = 0;
+			if(OIL_TYPE_NULL != IBGet_OilType()){
+					IB_RED_OFF;
+					IB_GREEN_TOGGLE;
+			}else{
+					IB_GREEN_OFF;
+					IB_RED_TOGGLE;
+			}
+		
+		}
+	
 		//printADCValue();
 		//printMotorCurrent();
 		//printf(" Motor Current:%f mA \r\n", getMotorCurrent());
@@ -163,14 +192,8 @@ void Process_RunPrd(void)
 		//Storage_CountReduce();
 		
 		//g_poweroff_count++;
+		printf(" opencover : %d \r\n", Gpio_IsOpenCover());
 		
-//		if(Gpio_IsDC24()){
-//			printf(" DC24 Supply \r\n");
-//		
-//		}else{
-//			printf(" Battery Supply \r\n");
-//		
-//		}
 		
 		printMotorCurrent();
 		
@@ -180,48 +203,8 @@ void Process_RunPrd(void)
 		//AngleSensor_PrintInfo();
 		//IB_Print();
 		
-	
-	}
-	
-	
-	
-	/*
-	
-	//10ms 
-	if(g_detectTime >= 10){
-		g_detectTime = 0;
-		
-		//锁状态 
-		_status=get_lockstatus();
-		for(i=0; i<STATUS_LOCKALL; i++){
-			if(_status == i){
-				g_lockcount[i]++;
-				if(g_lockcount[i] >= 5){
-					g_lockstatus = i;
-				}
-				
-			}else{
-				g_lockcount[i]=0;
-			}
-		}
-		
-		//上盖状态 
-		_status=Gpio_IsOpenCover()>0?STATUS_COVEROPEN:STATUS_COVERCLOSE;
-		for(i=0; i<STATUS_COVERALL; i++){
-			if(_status == i){
-				g_covercount[i]++;
-				if(g_covercount[i] >= 10){
-					g_coverstatus = i;
-				}
-				
-			}else{
-				g_covercount[i]=0;
-			}
-		}
-	
 	}
-	
-	*/
+
 	
 }
 
@@ -257,6 +240,14 @@ void Process_Timer1_CB(void)
 			g_period1000ms++;
 		}
 		
+		if(g_ibRead_count < 0xFFFF){
+			g_ibRead_count++;
+		}
+		
+		if(g_IBLed_count < 0xFFFF){
+			g_IBLed_count++;
+		}
+		
 		g_angleRead_Count++;
 		if(g_angleRead_Count >= g_angleRead_Interval){
 			
@@ -270,110 +261,6 @@ void Process_Timer0_CB(void)
 {
 	AngleSensor_Read();
 	
-
-//s_angle = AngleSensor_GetAngle();
-	
-//	if(s_angle < 0){ //处理异常
-//		if((MOTOR_READY != g_motorstate) && (MOTOR_STOPED != g_motorstate)){
-//				Motor_Brake();
-//				g_motorstate = MOTOR_STOPED;
-//				g_runReady =1;
-//				g_runTime=0;
-//		}
-//	}
-//	
-//	g_lockstatus=get_lockstatus();
-//	g_coverstatus=Gpio_IsOpenCover()>0?STATUS_COVEROPEN:STATUS_COVERCLOSE;
-//	
-
-//	//处理开关锁  
-//	switch(g_motorstate){
-//		case MOTOR_READY:
-//			break;
-//		case MOTOR_LOCKING:
-//			if(/*(STATUS_LOCK == g_lockstatus)|| */(STATUS_UNKOWN == g_lockstatus) ||(g_runTime >= 2000)){
-//				Motor_Brake();
-//				g_motorstate = MOTOR_STOPED;
-//				g_runReady =1;
-//				g_runTime=0;
-//			}else{
-//				PID_Calc(&g_pid, config->lock_threshold+3, s_angle);
-//				
-//				if(g_pid.error > 0){
-//						tmp_speed =(uint8_t)(g_pid.output);
-//						tmp_speed = tmp_speed<30?30:tmp_speed;
-//						Motor_Positive(tmp_speed);
-//				
-//				}else{
-//					Motor_Brake();
-//					g_motorstate = MOTOR_STOPED;
-//					g_runReady =1;
-//					g_runTime=0;
-//				}
-//				
-//			}
-//			
-//			break;
-//		case MOTOR_UNLOCKING:
-//			if(/*(STATUS_UNLOCK == g_lockstatus)|| */(STATUS_UNKOWN == g_lockstatus) ||(g_runTime >= 2000)){
-//				Motor_Brake();
-//				g_motorstate = MOTOR_STOPED;
-//				g_runReady =1;
-//				g_runTime=0;
-//			}else{
-//				PID_Calc(&g_pid, config->unlock_threshold-3, s_angle);
-//				
-//				if(g_pid.error < 0){
-//						tmp_speed =(uint8_t)(-g_pid.output);
-//						tmp_speed = tmp_speed<30?30:tmp_speed;
-//						Motor_Negative(tmp_speed);
-//				
-//				}else{
-//					Motor_Brake();
-//					g_motorstate = MOTOR_STOPED;
-//					g_runReady =1;
-//					g_runTime=0;
-//				}
-//				
-//			}
-//			break;
-//			
-//		case MOTOR_SAMPLEING:
-//			if(/*(STATUS_SAMPLE == g_lockstatus)|| */(STATUS_UNKOWN == g_lockstatus) ||(g_runTime >= 2000)){
-//				Motor_Brake();
-//				g_motorstate = MOTOR_STOPED;
-//				g_runReady =1;
-//				g_runTime=0;
-//			}else{
-//				PID_Calc(&g_pid, g_sample_position, s_angle);
-//				
-//				if(g_pid.error < 0){
-//						tmp_speed =(uint8_t)(-g_pid.output);
-//						tmp_speed = tmp_speed<30?30:tmp_speed;
-//						Motor_Negative(tmp_speed);
-//				
-//				}else{
-//					Motor_Brake();
-//					g_motorstate = MOTOR_STOPED;
-//					g_runReady =1;
-//					g_runTime=0;
-//				}
-//				
-//			}
-//			break;
-//		case MOTOR_STOPED:
-//			if(g_runTime >= 5000){ //5S
-//				g_motorstate = MOTOR_READY;
-//			}
-//			
-//			break;
-//		default:
-//			break;
-
-//	};
-//	
-
-
 }
 
 void Process_MotorControl(float angle)
@@ -502,7 +389,7 @@ uint8_t get_lockstatus(void)
 		static float _tmpf_max = 0;
 		uint8_t status = STATUS_UNKOWN;
 		if(s_angle<0){
-			return status;
+			return STATUS_ENCODER_ERROR;
 		}
 		
 	
@@ -542,7 +429,10 @@ uint8_t get_lockstatus(void)
 }
 
 
-
+uint8_t Process_GetOilType(void)
+{
+	return IBGet_OilType();
+}
 
 uint8_t Process_GetLockStatus(void)
 {

+ 4 - 1
User/process.h

@@ -62,6 +62,7 @@ extern uint16_t 	g_runTime;
 #define STATE_SAMPLE   					(0x03)	/*开锁状态*/
 #define STATE_OPENCOVER         (0x04)	/*开盖状态*/
 #define STATE_EXCEPTION         (0x05)	/*异常状态*/
+#define STATE_UNKOWN            (0x06)	/*未标定参数状态*/
 
 //锁舌状态
 enum _lockstatus {
@@ -69,7 +70,8 @@ enum _lockstatus {
 	STATUS_LOCK,									/*锁止状态*/
 	STATUS_UNLOCK,								/*开锁状态*/
 	STATUS_SAMPLE,								/*取样状态*/
-	STATUS_UNKOWN,								/*未知状态,设备异常了*/
+	STATUS_UNKOWN,								/*未知状态、未标定阀值*/
+	STATUS_ENCODER_ERROR,					/*编码器异常*/
 	STATUS_LOCKALL
 };
 
@@ -102,6 +104,7 @@ void Process_RunPrd(void);
 void Process_Poweroff(void); 
 void Process_Storage(void); 
 
+uint8_t Process_GetOilType(void); 
 uint8_t Process_GetLockStatus(void); 
 uint8_t Process_GetCoverStatus(void); 
 uint8_t Process_OpLock(uint8_t speed); 

+ 1 - 1
User/protocol.c

@@ -118,7 +118,7 @@ uint16_t Read_LockStatus(uint8_t *pBuf, uint16_t buf_len)
 	
 	tmp = Process_GetCoverStatus();  //上盖状态
 	pBuf[0] = (tmp<<4)|Process_GetLockStatus();   //锁状态 
-	pBuf[1] = 0x00;  //油品标识
+	pBuf[1] = Process_GetOilType();  //油品标识
 	
 	return 2;
 }