ソースを参照

读取编码器角度采用超时机制,增加Ibutton 油品读取,电机PWM 频率调整

guoqiang 11 ヶ月 前
コミット
dba0690e95
共有14 個のファイルを変更した6346 個の追加5391 個の削除を含む
  1. 295 19
      Device/AngleSensor.c
  2. 179 0
      Device/IB_Reader.c
  3. 55 0
      Device/IB_Reader.h
  4. 5 3
      Device/Motor.c
  5. 2 2
      Device/Motor.h
  6. 18 9
      Device/gpio.c
  7. 13 4
      Device/gpio.h
  8. 193 67
      Project/AirControlValve.uvguix.JL200
  9. 24 0
      Project/AirControlValve.uvoptx
  10. 11 1
      Project/AirControlValve.uvprojx
  11. 5525 5273
      Project/JLinkLog.txt
  12. 1 1
      User/main.c
  13. 23 10
      User/process.c
  14. 2 2
      User/protocol.c

+ 295 - 19
Device/AngleSensor.c

@@ -2,6 +2,7 @@
 #include "string.h"
 
 #include "gpio.h"
+#include "ac780x_spi_reg.h"
 #include "AngleSensor.h"
 
 #define DATA_SIZE 6U
@@ -15,7 +16,8 @@ static float angle_raw = 0.0;
 
 /*************<prototype>**************/
 void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara);
-
+ERROR_Type SPI_TransmitReceivePoll_V2(SPI_Type *SPIx, uint8_t *rxBuffer, const uint8_t *txBuffer, uint32_t length, uint32_t timeout);
+uint8_t SPI_CRC8(uint8_t *message, uint8_t Bytelength );
 
 void AngleSensor_Init(void)
 {
@@ -34,8 +36,8 @@ void AngleSensor_Init(void)
 	/*初始化SPI参数,波特率 = 0.8Mbps = (F_BCLK / (SCK_LOW+1 + SCK_HIGH+1)).*/
 	spiConfig.csSetup = 4;/*片选建立时间  = (CS_SETUP + 1) * CLK_PERIOD.*/
 	spiConfig.csHold  = 4;/*片选保持时间  = (CS_HOLD + 1) * CLK_PERIOD.*/
-	spiConfig.sckHigh = 14;/*SCK高电平时间 = (SCK_HIGH + 1) * CLK_PERIOD.*/
-	spiConfig.sckLow  = 14;/*SCK低电平时间 = (SCK_LOW + 1) * CLK_PERIOD.*/
+	spiConfig.sckHigh = 5;/*SCK高电平时间 = (SCK_HIGH + 1) * CLK_PERIOD.*/
+	spiConfig.sckLow  = 5;/*SCK低电平时间 = (SCK_LOW + 1) * CLK_PERIOD.*/
 	spiConfig.csIdle  = 3;/*两条数据间最短时间间隔 = (CS_IDLE + 1) * CLK_PERIOD.*/
 	spiConfig.mode   		= SPI_MASTER;//设置为主机模式
 	spiConfig.cpha	 		= SPI_CPHA_2EDGE;//设置数据采样相位,第2个边沿采样数据
@@ -57,9 +59,10 @@ void AngleSensor_Init(void)
 	spiConfig.modeFaultInterruptEn = DISABLE;//模式故障中断
 	SPI_Init(SPI0, &spiConfig);
 	
-	while(AngleSensor_GetAngle() < 0){
-		mdelay(5);
-	}
+//	NVIC_SetPriority(SPI0_IRQn, 1);
+//  NVIC_ClearPendingIRQ(SPI0_IRQn);
+//  NVIC_EnableIRQ(SPI0_IRQn);
+	
 
 }
 
@@ -68,13 +71,9 @@ void AngleSensor_Setoffset(float offset)
 	angle_offset = offset;
 }
 
-
-
-float AngleSensor_GetAngle(void)
+float AngleSensor_GetAngleInt(void)
 {
 	uint16_t angle_value;
-	//uint8_t  safeword =0;
-	//uint8_t crc;
 	float angle = 0.0;
 			
 	g_spiTxBuff1[0] = 0x21;
@@ -84,19 +83,27 @@ float AngleSensor_GetAngle(void)
 	g_spiTxBuff1[4] = 0xFF;
 	g_spiTxBuff1[5] = 0xFF;
 	
-	SPI_TransmitReceivePoll(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
+	SPI_TransmitReceiveInt(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
+	while(!(SPI_GetTransmitReceiveStatus(SPI0) & SPI_STATUS_RX_FINISH_MASK))//等待读取完毕
+	{
 	
+	};
+	SPI_MasterReleaseCS(SPI0);
+
+	printf("g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", g_spiRxBuff1[0], g_spiRxBuff1[1]);
+	printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
+	printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
+//	
 	angle_value = g_spiRxBuff1[3]&0x7F;
-	//printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
-	//printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
 	angle_value = (angle_value<<8)|g_spiRxBuff1[2];
 	angle = (360.0*angle_value)/32768;
 
-	if((g_spiRxBuff1[5]&0xF0) != 0x70){
-	
+	if((g_spiRxBuff1[5]&0x30) != 0x30){
 		angle = -180.0;
+		printf("angle_raw 111 : %f \r\n", angle);
 	}else{
 		angle_raw = angle;
+		printf("angle_raw 222 : %f \r\n", angle);
 		
 		angle += angle_offset;
 		if(angle > 360.0){
@@ -110,6 +117,79 @@ float AngleSensor_GetAngle(void)
 	}
 	
 	return angle;
+	
+}
+
+float AngleSensor_GetAnglePolling(void)
+{
+	uint16_t angle_value;
+	ERROR_Type ret = SUCCESS;
+	//uint8_t  safeword =0;
+	uint8_t crc;
+	float angle = 0.0;
+			
+	g_spiTxBuff1[0] = 0x21;
+	g_spiTxBuff1[1] = 0x80;
+	g_spiTxBuff1[2] = 0xFF;
+	g_spiTxBuff1[3] = 0xFF;
+	g_spiTxBuff1[4] = 0xFF;
+	g_spiTxBuff1[5] = 0xFF;
+	
+	memset(g_spiRxBuff1, 0x00, 6);
+	
+	ret = SPI_TransmitReceivePoll_V2(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6, 2000);
+	//ret = SPI_TransmitReceivePoll(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
+	
+	if(SUCCESS == ret){
+		
+			//复用txbuff
+			g_spiTxBuff1[0] = 0x80;
+			g_spiTxBuff1[1] = 0x21;
+			g_spiTxBuff1[2] = g_spiRxBuff1[3];
+			g_spiTxBuff1[3] = g_spiRxBuff1[2];
+		
+			crc = SPI_CRC8(g_spiTxBuff1, 4);
+			if(g_spiRxBuff1[4] == crc){
+				
+//				printf("crc22 %x: g_spiRxBuff1[0]:0x%x, g_spiRxBuff1[1]:0x%x \r\n", crc, g_spiRxBuff1[0], g_spiRxBuff1[1]);
+//				printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
+//				printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
+//				
+				if((g_spiRxBuff1[5]&0x30) != 0x30){
+//					printf("angle_raw 111 : %f \r\n", angle);
+					angle = -180.0;
+				}else{
+					
+					angle_value = g_spiRxBuff1[3]&0x7F;
+					angle_value = (angle_value<<8)|g_spiRxBuff1[2];
+					angle = (360.0*angle_value)/32768;
+					
+					angle_raw = angle;
+//					printf("angle_raw 222 : %f \r\n", angle);
+					
+					angle += angle_offset;
+					if(angle > 360.0){
+						angle -= 360.0;
+					}
+					
+					if(angle < 0.0){
+						angle += 360.0;
+					}
+				}
+			
+			}	
+		
+	}else{
+		angle = -180.0;
+	}
+	
+	return angle;
+}
+
+float AngleSensor_GetAngle(void)
+{
+	//return AngleSensor_GetAngleInt();
+	return AngleSensor_GetAnglePolling();
 }
 
 float AngleSensor_GetAngleRaw(void)
@@ -119,7 +199,7 @@ float AngleSensor_GetAngleRaw(void)
 
 void AngleSensor_PrintInfo(void)
 {
-	printf("AngleSensor angle:%f \r\n", AngleSensor_GetAngle());
+	printf("AngleSensor angle:%f \r\n", AngleSensor_GetAnglePolling());
 
 }
 
@@ -129,12 +209,12 @@ void AngleSensor_DeInit(void)
 }
 
 /**
-* @prototype SPI1_Callback(void *device, uint32_t wpara, uint32_t lpara)
+* @prototype SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
 *
 * @param[in] ...
 * @return	 void
 *
-* @brief  	 SPI1中断回调函数.
+* @brief  	 SPI0中断回调函数.
 */
 void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
 {
@@ -149,4 +229,200 @@ void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
 	
 }
 
+/*!
+* @brief Clear SPI Tx under flow and Rx over flow status
+*
+* @param[in] SPIx: SPI type pointer,x can be 0 to 1
+* @return Function status
+*            0: ERROR, occour Tx under flow or Rx over flow flag
+*            1: SUCCESS, no Tx under flow and Rx over flow flag
+*/
+static ERROR_Type MY_SPI_ClearTxUFRxOF(SPI_Type *SPIx)
+{
+    ERROR_Type ret = SUCCESS;
+
+    /* Clear Tx under flow flag */
+    if (SPI_IsTxUF(SPIx))
+    {
+        SPI_ClearTxUF(SPIx);
+        ret = ERROR;
+    }
+    else
+    {
+        /* Do nothing */
+    }
+
+    /* Clear Rx over flow flag */
+    if (SPI_IsRxOF(SPIx))
+    {
+        SPI_ClearRxOF(SPIx);
+        ret = ERROR;
+    }
+    else
+    {
+        /* Do nothing */
+    }
+
+    return ret;
+}
+
+
+/*!
+* @brief SPI transmission,reception by polling
+*
+* @param[in] SPIx: SPI type pointer,x can be 0 to 1
+* @param[in] rxBuffer: point to the receive data
+* @param[in] txBuffer: point to the send data
+* @param[in] length: transfer data length
+* @param[in] timeout: timeout us 
+* @return Function status
+*            0: ERROR, length is 0 or rdbuff is NULL or txBuffer is NULL
+*            1: SUCCESS
+*/
+ERROR_Type SPI_TransmitReceivePoll_V2(SPI_Type *SPIx, uint8_t *rxBuffer, const uint8_t *txBuffer, uint32_t length, uint32_t timeout)
+{
+    uint32_t  i = 0;
+		uint32_t  _time_us = 0;
+    ERROR_Type ret = SUCCESS;
+
+    DEVICE_ASSERT(IS_SPI_PERIPH(SPIx));
+
+    if ((length == 0) || (rxBuffer == NULL) || (txBuffer == NULL))
+    {
+        ret = ERROR;
+    }
+    else
+    {
+        /* Disable Tx/Rx only mode */
+        SPI_SetTxOnly(SPIx, DISABLE);
+        SPI_SetRxOnly(SPIx, DISABLE);
+
+        if ((SPI_FrameSizeType)SPI_GetFRMSize(SPIx) > SPI_FRAME_SIZE_8BITS)  /* FrameSize is 9 bits ~ 16 bits */
+        {
+            if (((uint32_t)txBuffer & 0x01) || ((uint32_t)rxBuffer & 0x01)) /* txBuffer or rxBufer is not half-word alignment */
+            {
+                ret = ERROR;
+                return ret;
+            }
+
+            length = length >> 0x01u;
+            /* transmit and receive data */
+            for (i = 0; i < length; i++)
+            {
+                while (!SPI_IsTxEF(SPIx) &&(_time_us < timeout))
+								{
+										udelay(1);
+										_time_us++;
+								}
+                SPI_WriteDataReg(SPIx, ((uint16_t *)txBuffer)[i]);
+                while (!SPI_IsRxFF(SPIx) &&(_time_us < timeout))
+								{
+										udelay(1);
+										_time_us++;
+								}
+                ((uint16_t *)rxBuffer)[i] = SPI_ReadDataReg(SPIx);
+            }
+        }
+        else  /* FrameSize is 4 bits ~ 8 bits */
+        {
+            /* transmit and receive data */
+            for (i = 0; i < length; i++)
+            {
+                while (!SPI_IsTxEF(SPIx) &&(_time_us < timeout))
+								{
+										udelay(1);
+										_time_us++;
+								}
+                SPI_WriteDataReg(SPIx, txBuffer[i]);
+                while (!SPI_IsRxFF(SPIx) &&(_time_us < timeout))
+								{
+										udelay(1);
+										_time_us++;
+								}
+                rxBuffer[i] = (uint8_t)SPI_ReadDataReg(SPIx);
+            }
+        }
+        while ((SPI_IsBusy(SPIx)));
+        SPI_CSRelease(SPIx);
+    }
+
+    /* Check and Clear Tx under flow/ Rx over flow flag */
+    if (MY_SPI_ClearTxUFRxOF(SPIx) == ERROR)
+    {
+        ret = ERROR;
+    }
+    else
+    {
+			if((_time_us >= timeout)){
+				ret = ERROR;
+			}
+        /* Do nothing */
+    }
+
+    return ret;
+}
+
+//CRC对照表
+const uint8_t SPI_TableCRC[256] = 
+{
+	//The ?°crc?± of the position [1] (result from operation [crc ^*(message+Byteidx)])
+	//is 0x00 -> 0x00 XOR 0x11D = 0x00 (1 byte).
+	0x00,
+	//The ?°crc?± of the position [2] is 0x1D -> 0x01 XOR 0x11D = 0x1D (1 byte).
+	0x1D,
+	//The ?°crc?± of the position [3] is 0x3A -> 0x02 XOR 0x11D = 0x3A (1 byte).
+	0x3A,
+	//For all the rest of the cases.
+	0x27, 0x74, 0x69, 0x4E, 0x53, 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, 0xCD,
+	0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E, 0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B,
+	0x76, 0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4, 0x6F, 0x72, 0x55, 0x48, 0x1B,
+	0x06, 0x21, 0x3C, 0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19, 0xA2, 0xBF, 0x98,
+	0x85, 0xD6, 0xCB, 0xEC, 0xF1, 0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40, 0xFB,
+	0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8, 0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90,
+	0x8D, 0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65, 0x94, 0x89, 0xAE, 0xB3, 0xE0,
+	0xFD, 0xDA, 0xC7, 0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F, 0x59, 0x44, 0x63,
+	0x7E, 0x2D, 0x30, 0x17, 0x0A, 0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2, 0x26,
+	0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75, 0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80,
+	0x9D, 0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8, 0x03, 0x1E, 0x39, 0x24, 0x77,
+	0x6A, 0x4D, 0x50, 0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2, 0x49, 0x54, 0x73,
+	0x6E, 0x3D, 0x20, 0x07, 0x1A, 0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F, 0x84,
+	0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7, 0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B,
+	0x66, 0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E, 0xF8, 0xE5, 0xC2, 0xDF, 0x8C,
+	0x91, 0xB6, 0xAB, 0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, 0xB2, 0xAF, 0x88,
+	0x95, 0xC6, 0xDB, 0xFC, 0xE1, 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09, 0x7F,
+	0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, 0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFe,
+	//The ?°crc?± of the position [255] is 0xD9 -> 0xFE XOR 0x11D = 0xD9 (1 byte).
+	0xD9,
+	//The ?°crc?± of the position [256] is 0xC4 -> 0xFF XOR 0x11D = 0xC4 (1 byte).
+	0xC4
+};
+
+//配置
+uint8_t SPI_CRC8(uint8_t *message, uint8_t Bytelength )
+{
+	//?°crc?± defined as the 8-bits that will be generated through the message till the
+	//final crc is generated. In the example above this are the blue lines out of the
+	//XOR operation.
+	uint8_t crc;
+	//?°Byteidx?± is a counter to compare the bytes used for the CRC calculation and
+	//?°Bytelength?±.
+	uint8_t Byteidx;
+	//Initially the CRC remainder has to be set with the original seed (0xFF for the TLE5012B).
+	crc = 0xFF;
+	//For all the bytes of the message.
+	for(Byteidx=0; Byteidx<Bytelength; Byteidx++)
+	{
+		//?°crc?± is the value in the look-up table TableCRC[x] at the position ?°x?±.
+		//The position ?°x?± is determined as the XOR operation between the previous ?°crc?± and
+		//the next byte of the ?°message?±.
+		//?°^?± is the XOR operator.
+		crc = SPI_TableCRC[crc ^ *(message+Byteidx)];
+	}
+	//Return the inverted ?°crc?± remainder(?°~?± is the invertion operator). An alternative
+	//to the ?°~?± operator would be a XOR operation between ?°crc?± and a 0xFF polynomial.
+	return(~crc);
+}
+
+
+
 

+ 179 - 0
Device/IB_Reader.c

@@ -0,0 +1,179 @@
+#include "IB_Reader.h"
+#include "gpio.h"
+
+#define  IB_READ_ROM    (0x33)
+#define  IB_MATCH_ROM   (0x55)
+#define  IB_SEARCH_ROM  (0xF0)
+#define  IB_SKIP_ROM    (0x33)
+
+#define  IB_WRITE_SCRATCHPAD  (0x0F)
+#define  IB_READ_SCRATCHPAD   (0xAA)
+#define  IB_COPY_SCRATCHPAD   (0x55)
+#define  IB_READ_MEMORY       (0xF0)
+
+
+static uint8_t rom_id[8]={0};
+
+/**
+   *   @brief   初始化
+   *   @param   无
+   *   @retval  ACK应答位
+**/
+ 
+uint8_t OneWire_Init()
+{
+	uint8_t Ackbit = 0;
+	
+	IBTX_WIRE_HIGH;         //先将总线拉高
+	IBTX_WIRE_LOW;         //然后将总线拉低
+	
+	udelay(500);
+	
+	IBTX_WIRE_HIGH;         //释放总线
+	udelay(70);		//Delay 70 us
+	
+	Ackbit=IBRX_WIRE_BIT;    //读取应答位
+	
+	udelay(500);  //Delay 500 us
+	
+	return Ackbit;
+	
+}
+
+/**
+   *   @brief   发送一位
+   *   @param  Bit
+   *   @retval   无
+**/
+ 
+void OneWire_Senbit(uint8_t Bit)
+{
+		IBTX_WIRE_LOW;      //拉低
+	  udelay(5);   //Delay 10 us(考虑到调用函数需要时间,实际i可以适当取的更大)
+	
+		//发送一位
+		if(0 == Bit){
+			IBTX_WIRE_LOW;
+		}else{
+			IBTX_WIRE_HIGH;
+		}
+ 
+     //讲解:从发送0和发送1俩个不同的时序可以看出,如果我们在10us的时候将Bit放在DQ上,如果是0
+     //      则DQ一直会被拉低,如果是1,主机也会将DQ拉高,最后等50us后将数据发送即可       
+ 
+ 
+	  udelay(45);   			//Delay 50 us
+		IBTX_WIRE_HIGH;      //拉高,便于下次发送
+}
+
+/**
+   *   @brief   接受一位
+   *   @param    无
+   *   @retval   Bit
+**/
+ 
+uint8_t OneWire_ReceiveBit()
+{
+	uint8_t Bit;
+	IBTX_WIRE_LOW;
+	udelay(3);   //Delay 5 us
+	IBTX_WIRE_HIGH;
+	udelay(5);   //Delay 5 us
+ 
+    //解释:读取数据需要在15us内进行(贴近15us的时候),如果是0,DQ会在5us后被从机拉低, 
+    //      如果是1, DQ会在5us后被从机拉高
+ 
+	Bit=IBRX_WIRE_BIT;      //进行数据接受
+	udelay(50);   //Delay 50 us
+ 
+	return Bit;
+	
+}
+ 
+
+
+
+/**
+   *   @brief   发送一个字节
+   *   @param    Byte
+   *   @retval   无
+**/
+ 
+void OneWire_SenByte(uint8_t Byte)
+{
+	uint8_t i;
+	for(i=0;i<8;i++)
+	{
+		OneWire_Senbit(Byte&(0x01<<i));//低位在前
+	}
+	
+}
+
+/**
+   *   @brief   接受一个字节
+   *   @param    无
+   *   @retval   Byte
+**/
+ 
+uint8_t OneWire_ReceiveByte()
+{
+	 uint8_t i;
+	 uint8_t Byte=0x00;
+	for(i=0;i<8;i++)
+	{
+		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);} //低位在前
+	}
+		
+	return Byte;
+ 
+}
+
+
+uint8_t IBread_OilType(void)
+{
+
+return 0;
+	
+}
+
+uint8_t IBread_ROMID(void)
+{
+	uint8_t Ackbit = 0;
+	uint8_t i=0;
+	Ackbit = OneWire_Init();		//总线初始化时序
+	OneWire_SenByte(IB_READ_ROM);		//发送读ROMID指令
+	
+	for(i=0; i<8;i++){
+		rom_id[i]=OneWire_ReceiveByte();		//第一个字节为低位
+	}
+
+return 0;
+	
+}
+
+uint8_t IBread_Memory(void)
+{
+	uint8_t Ackbit = 0;
+	uint8_t i=0;
+	Ackbit = OneWire_Init();		//总线初始化时序
+	OneWire_SenByte(IB_SKIP_ROM);	
+	OneWire_SenByte(IB_READ_MEMORY);	
+	OneWire_SenByte(0x00);	
+	OneWire_SenByte(0x00);	
+	
+	for(i=0; i<8;i++){
+		rom_id[i]=OneWire_ReceiveByte();		//第一个字节为低位
+	}
+
+return 0;
+	
+}
+
+
+void IB_Print(void)
+{
+	IBread_Memory();
+	
+	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]);
+
+}

+ 55 - 0
Device/IB_Reader.h

@@ -0,0 +1,55 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("AutoChips Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
+ * the prior written permission of AutoChips inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of AutoChips Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * AutoChips Inc. (C) 2016. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
+ * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
+ * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
+ * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
+ */
+#ifndef IB_READER_H_
+#define IB_READER_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include "system_ac780x.h"
+#include "ac780x_gpio.h"
+#include "ac780x.h"
+
+/*¶ÁÈ¡ÓÍÆ·ÀàÐÍ*/
+void IB_Print(void);
+uint8_t IBread_OilType(void);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  //IB_READER_H_

+ 5 - 3
Device/Motor.c

@@ -154,10 +154,11 @@ void Motor_Positive(uint8_t speed)
 {
 	uint16_t chValue=0;
 	if(speed > 100) speed = 100;
+	//speed = 100 -speed;
 		 
-	chValue = (uint16_t)speed*MOD_PWM/100;
+	chValue = (uint16_t)speed*(MOD_PWM-1)/100;
 	
-	//printf("Motor_Positive, speed:%d \r\n", speed);
+	printf("Motor_Positive, speed:%d \r\n", speed);
 	PWM_SetChannelCountValue(PWM1, PWM_CH_3, 0);
 	PWM_SetChannelCountValue(PWM1, PWM_CH_2, chValue);
 	
@@ -168,9 +169,10 @@ void Motor_Negative(uint8_t speed)
 {
 	uint16_t chValue=0;
 	if(speed > 100) speed = 100;
+	//speed = 100 -speed;
 		 
 	chValue = (uint16_t)speed*MOD_PWM/100;
-	//printf("Motor_Negative, speed:%d \r\n", speed);
+	printf("Motor_Negative, speed:%d \r\n", speed);
 	
 	PWM_SetChannelCountValue(PWM1, PWM_CH_2, 0);
 	PWM_SetChannelCountValue(PWM1, PWM_CH_3, chValue);

+ 2 - 2
Device/Motor.h

@@ -47,8 +47,8 @@ extern "C" {
 
 //#define PRESCALER   				        (PWDT_CLK_PRESCALER_8)
 #define APB_CLK                             (APB_BUS_FREQ)
-#define FREQ                                (100) ///freq = 20KHz
-#define PWM_PRES                            (199)
+#define FREQ                                (2000) ///freq = 20KHz
+#define PWM_PRES                            (0)
 #define MOD_PWM                             (APB_CLK / FREQ / (PWM_PRES + 1))
 
 

+ 18 - 9
Device/gpio.c

@@ -92,13 +92,16 @@ void Gpio_Init(void)
 		
 		//配置GPIO为PWM
     //config PWM1 pinmux
-    GPIO_SetFunc(GPIOB, GPIO_PIN7, GPIO_FUN1);//PWM1_CH0 
-    GPIO_SetFunc(GPIOB, GPIO_PIN8, GPIO_FUN1);//PWM1_CH1
+//    GPIO_SetFunc(GPIOB, GPIO_PIN7, GPIO_FUN1);//PWM1_CH0 
+//    GPIO_SetFunc(GPIOB, GPIO_PIN8, GPIO_FUN1);//PWM1_CH1
+
+    GPIO_SetFunc(GPIOC, GPIO_PIN1, GPIO_FUN1);//PWM1_CH2 
+    GPIO_SetFunc(GPIOC, GPIO_PIN0, GPIO_FUN1);//PWM1_CH3
 		
 		//DC24V power supply 
-		GPIO_SetFunc(POWER_DETECT_PORT, POWER_DETECT_PIN, GPIO_FUN0);
-		GPIO_SetDir(POWER_DETECT_PORT, POWER_DETECT_PIN, GPIO_IN);
-		GPIO_SetPulldown(POWER_DETECT_PORT, POWER_DETECT_PIN, ENABLE);
+//		GPIO_SetFunc(POWER_DETECT_PORT, POWER_DETECT_PIN, GPIO_FUN0);
+//		GPIO_SetDir(POWER_DETECT_PORT, POWER_DETECT_PIN, GPIO_IN);
+//		GPIO_SetPulldown(POWER_DETECT_PORT, POWER_DETECT_PIN, ENABLE);
 		
 		//cover detect pin init 
 		GPIO_SetFunc(COVER_DETECT_PORT, COVER_DETECT_PIN, GPIO_FUN0);
@@ -106,10 +109,10 @@ void Gpio_Init(void)
 		GPIO_SetPullup(COVER_DETECT_PORT, COVER_DETECT_PIN, ENABLE);
 		
 		/*初始化SPI1引脚,功能复用选择. W25Q64 使用*/
-		GPIO_SetFunc(GPIOB, GPIO_PIN15, GPIO_FUN3);//SCK
-		GPIO_SetFunc(GPIOB, GPIO_PIN14, GPIO_FUN3);//MOSI
-		GPIO_SetFunc(GPIOC, GPIO_PIN0, GPIO_FUN3);//MISO
-		GPIO_SetFunc(GPIOC, GPIO_PIN1, GPIO_FUN3);//CS
+//		GPIO_SetFunc(GPIOB, GPIO_PIN15, GPIO_FUN3);//SCK
+//		GPIO_SetFunc(GPIOB, GPIO_PIN14, GPIO_FUN3);//MOSI
+//		GPIO_SetFunc(GPIOC, GPIO_PIN0, GPIO_FUN3);//MISO
+//		GPIO_SetFunc(GPIOC, GPIO_PIN1, GPIO_FUN3);//CS
 		
 		/* 初始化SPI0引脚,功能复用选择. AngleSensor 使用 */
 		GPIO_SetFunc(GPIOB, GPIO_PIN5, GPIO_FUN3);//SCK
@@ -123,6 +126,12 @@ void Gpio_Init(void)
 		
 		//GPIO_SetFunc(GPIOB, GPIO_PIN6, GPIO_FUN0);
 		//GPIO_SetDir(GPIOB, GPIO_PIN6, GPIO_OUT);
+		
+		//Ibutton one wire 
+		GPIO_SetFunc(IBTX_PORT, IBTX_PIN, GPIO_FUN0);
+		GPIO_SetDir(IBTX_PORT, IBTX_PIN, GPIO_OUT);
+		GPIO_SetFunc(IBRX_PORT, IBRX_PIN, GPIO_FUN0);
+		GPIO_SetDir(IBRX_PORT, IBRX_PIN, GPIO_IN);
 }
 
 

+ 13 - 4
Device/gpio.h

@@ -61,11 +61,11 @@ extern "C" {
 #define LDOEn_EN				do{GPIO_SetPinLevel(LDOEn_PORT, LDOEn_PIN, GPIO_LEVEL_HIGH);}while(0)
 #define LDOEn_DISABLE				do{GPIO_SetPinLevel(LDOEn_PORT, LDOEn_PIN, GPIO_LEVEL_LOW);}while(0)
 
-#define GREENLED_PORT			(GPIOA)
-#define GREENLED_PIN			(GPIO_PIN1)
+#define GREENLED_PORT			(GPIOB)
+#define GREENLED_PIN			(GPIO_PIN7)
 
-#define REDLED_PORT			(GPIOA)
-#define REDLED_PIN			(GPIO_PIN0)
+#define REDLED_PORT			(GPIOB)
+#define REDLED_PIN			(GPIO_PIN8)
 
 /*RUNLED¶¯×÷¶¨Òå.*/	
 #define GREENLED_ON				do{GPIO_SetPinLevel(GREENLED_PORT, GREENLED_PIN, GPIO_LEVEL_HIGH);}while(0)
@@ -93,6 +93,15 @@ extern "C" {
 #define DS1302_ENABLE                    do{GPIO_SetPinLevel(GPIOB, GPIO_PIN6, GPIO_LEVEL_HIGH);}while(0)
 #define DS1302_DISABLE                   do{GPIO_SetPinLevel(GPIOB, GPIO_PIN6, GPIO_LEVEL_LOW);}while(0)
 
+//IButton one wire 
+#define IBTX_PORT			(GPIOB)
+#define IBTX_PIN			(GPIO_PIN13)
+#define IBRX_PORT			(GPIOA)
+#define IBRX_PIN			(GPIO_PIN1)
+
+#define IBTX_WIRE_HIGH				GPIO_SetPinLevel(IBTX_PORT, IBTX_PIN, GPIO_LEVEL_LOW)
+#define IBTX_WIRE_LOW				GPIO_SetPinLevel(IBTX_PORT, IBTX_PIN, GPIO_LEVEL_HIGH)
+#define IBRX_WIRE_BIT     GPIO_GetPinLevel(IBRX_PORT,IBRX_PIN)
 
 /*************<enum>*******************/
 

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


+ 24 - 0
Project/AirControlValve.uvoptx

@@ -708,6 +708,30 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>42</FileNumber>
+      <FileType>5</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Device\IB_Reader.h</PathWithFileName>
+      <FilenameWithoutPath>IB_Reader.h</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>43</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Device\IB_Reader.c</PathWithFileName>
+      <FilenameWithoutPath>IB_Reader.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>

+ 11 - 1
Project/AirControlValve.uvprojx

@@ -50,7 +50,7 @@
             <InvalidFlash>1</InvalidFlash>
           </TargetStatus>
           <OutputDirectory>.\Objects\</OutputDirectory>
-          <OutputName>ElectricalValve_20240803</OutputName>
+          <OutputName>ElectricalValve_20240929</OutputName>
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
           <CreateHexFile>1</CreateHexFile>
@@ -600,6 +600,16 @@
               <FileType>5</FileType>
               <FilePath>..\Device\Rtcx.h</FilePath>
             </File>
+            <File>
+              <FileName>IB_Reader.h</FileName>
+              <FileType>5</FileType>
+              <FilePath>..\Device\IB_Reader.h</FilePath>
+            </File>
+            <File>
+              <FileName>IB_Reader.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Device\IB_Reader.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

File diff suppressed because it is too large
+ 5525 - 5273
Project/JLinkLog.txt


+ 1 - 1
User/main.c

@@ -53,7 +53,7 @@ int main(void)
 		Timer0_Init(); 
 		Timer1_Init();
     Task_Init();
-		//printf("111111 \r\n ");
+		printf("111111 \r\n ");
 		
     while (1)
     {

+ 23 - 10
User/process.c

@@ -10,6 +10,7 @@
 #include "cfg.h"
 #include "Rtcx.h"
 #include "storage.h"
+#include "IB_Reader.h"
 #include "math.h"
 
 uint8_t		g_devicebusy = 0;
@@ -168,6 +169,7 @@ void Process_RunPrd(void)
 		
 		//RTCx_PrintDateTime();
 		//AngleSensor_PrintInfo();
+		//IB_Print();
 		
 	
 	}
@@ -217,6 +219,16 @@ void Process_RunPrd(void)
 void Process_Timer10msCB(void)
 {
 	s_angle = AngleSensor_GetAngle();
+	
+	if(s_angle < 0){ //´¦ÀíÒì³£
+		if((MOTOR_READY != g_motorstate) && (MOTOR_STOPED != g_motorstate)){
+				Motor_Stop();
+				g_motorstate = MOTOR_STOPED;
+				g_runReady =1;
+				g_runTime=0;
+		}
+	}
+	
 	g_lockstatus=get_lockstatus();
 	g_coverstatus=Gpio_IsOpenCover()>0?STATUS_COVEROPEN:STATUS_COVERCLOSE;
 	
@@ -232,11 +244,11 @@ void Process_Timer10msCB(void)
 				g_runReady =1;
 				g_runTime=0;
 			}else{
-				PID_Calc(&g_pid, config->lock_threshold, s_angle);
+				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<50?50:tmp_speed;
+						tmp_speed = tmp_speed<80?80:tmp_speed;
 						Motor_Positive(tmp_speed);
 				
 				}else{
@@ -256,11 +268,12 @@ void Process_Timer10msCB(void)
 				g_runReady =1;
 				g_runTime=0;
 			}else{
-				PID_Calc(&g_pid, config->unlock_threshold, s_angle);
+				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<50?50:tmp_speed;
+						tmp_speed = tmp_speed<80?80:tmp_speed;
+						tmp_speed = 100;
 						Motor_Negative(tmp_speed);
 				
 				}else{
@@ -284,7 +297,7 @@ void Process_Timer10msCB(void)
 				
 				if(g_pid.error < 0){
 						tmp_speed =(uint8_t)(-g_pid.output);
-						tmp_speed = tmp_speed<50?50:tmp_speed;
+						tmp_speed = tmp_speed<80?80:tmp_speed;
 						Motor_Negative(tmp_speed);
 				
 				}else{
@@ -380,13 +393,13 @@ uint8_t Process_GetCoverStatus(void)
 uint8_t Process_OpLock(uint8_t speed)
 {
 	
-	if((MOTOR_READY == g_motorstate) & (STATUS_LOCK != g_lockstatus)){
+	if((MOTOR_READY == g_motorstate) && (STATUS_LOCK != g_lockstatus)){
 		//Motor_Positive(speed);
 		g_motorstate = MOTOR_LOCKING;
 		g_runReady =1;
 		g_runTime=0;
 		
-		PID_Init(&g_pid, 5, 1, 0, 30, 100);
+		PID_Init(&g_pid, 12, 1, 0, 30, 100);
 	}
 	
 	return 0;
@@ -395,13 +408,13 @@ uint8_t Process_OpLock(uint8_t speed)
 uint8_t Process_OpUnlock(uint8_t speed)
 {
 	
-	if((MOTOR_READY == g_motorstate) & (STATUS_UNLOCK != g_lockstatus)){
+	if((MOTOR_READY == g_motorstate) && (STATUS_UNLOCK != g_lockstatus)){
 		//Motor_Negative(speed);
 		g_motorstate = MOTOR_UNLOCKING;
 		g_runReady =1;
 		g_runTime=0;
 	
-		PID_Init(&g_pid,5, 1, 0, 30, 100);
+		PID_Init(&g_pid,12, 1, 0, 50, 100);
 	}
 
 	return 0;
@@ -422,7 +435,7 @@ uint8_t Process_OpSample(uint8_t speed)
 		
 	  g_sample_position = (config->sample_threshold1 + config->sample_threshold2)/2;
 		
-		PID_Init(&g_pid,5, 1, 0, 30, 100);
+		PID_Init(&g_pid,10, 1, 0, 30, 100);
 		
 	}
 

+ 2 - 2
User/protocol.c

@@ -12,9 +12,9 @@ static DataItem tmp_record;
 static uint8_t tmp_i=0;
 	
 #ifdef IS_BOOTLOADER
-uint32_t Firmware_Version[4] = {1, 0, 0, 20240925};
+uint32_t Firmware_Version[4] = {1, 0, 2, 20240927};
 #else
-uint32_t Firmware_Version[4] = {1, 1, 1, 20240925};
+uint32_t Firmware_Version[4] = {1, 1, 8, 20240929};
 #endif