Ver Fonte

Управление MUX 301, 401.

TelenkovDmitry há 1 ano atrás
pai
commit
89f4de1a76

+ 48 - 0
fw/modules/io/analog_input.c

@@ -10,8 +10,21 @@
 uint8_t input_mux; // выход сдвигового регистра U1010 (управляет MUX 301, 401)
                    // мультиплексоры отвечат за коммутацию аналоговых входов и АЦП
 
+uint16_t input_mode; // режим измерения аналоговых каналов (ток или напряжение)
+                     // 0000 0000 0000 0000 
+                     // младшие 6 (с 1..6) бит - каналы с 1 по 6 соответственно
+                     // биты 9..14 - каналы с 7 по 12 соответственно
 
+//en_crnt_alrm_in
+
+
+// Подключить канал к АЦП
+// Одновременно могут быть подключены только 2 канала из наборов:
+// 1: AN_INP_1, AN_INP_2, AN_INP_3, AN_INP_4, AN_INP_5, AN_INP_6, V_ISO_CL, 
+//    V_ISO
 //
+// 2: AN_INP_7, AN_INP_8, AN_INP_9, AN_INP_10, AN_INP_11, AN_INP_12, 
+//    CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R
 void ai_connect_channel(uint8_t channel)
 {
     if (channel < MUX_401_CH) 
@@ -49,11 +62,37 @@ void ai_connect_channel(uint8_t channel)
         }
     }
     
+    sh_ai_connect(input_mux);
+    
     printf("Analog input connect register: ");
     print_binary_byte(input_mux);
     printf("\r\n");
 }
 
+// Утсновить режим измерения канала (ток или напряжение)
+void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel)
+{
+    if (mode == MEAS_CURRENT) 
+    {
+        if (channel < 7)
+            input_mode |= (1 << (channel - 1));
+        else
+            input_mode |= (1 << (channel + 1));
+    }
+    else
+        if (channel < 7)
+            input_mode &= ~(1 << (channel - 1));
+        else
+            input_mode &= ~(1 << (channel + 1));
+          
+    sh_ai_mode(input_mode);
+    
+    printf("Analog input mode: ");
+    print_binary_byte(input_mode >> 8);
+    printf("");
+    print_binary_byte(input_mode & 0xFF);
+    printf("\r\n");
+}
 
 //
 void ai_connect_test(void)
@@ -76,3 +115,12 @@ void ai_connect_test(void)
     ai_connect_channel(CRNT_LIM_U_BFR_R);
     ai_connect_channel(CRNT_LIM_U_ABFR_R);
 }
+
+//
+void ai_mode_test(void)
+{
+    for (uint8_t i = 1; i < 13; i++)
+    {
+        ai_set_mode(MEAS_CURRENT, i);
+    }
+}

+ 16 - 15
fw/modules/io/analog_input.h

@@ -3,16 +3,15 @@
 
 #include <stdbool.h>
 
-/*
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-#define AN_INP_1    (0)
-*/
+
+// Режим измерения (ток или напряжение)
+typedef enum
+{
+    MEAS_VOLTAGE = 0,
+    MEAS_CURRENT,  
+    
+} MEAS_CHAN_MODE_t;
+
 
 typedef enum 
 {
@@ -36,18 +35,20 @@ typedef enum
     CRNT_LIM_U_BFR_R,
     CRNT_LIM_U_ABFR_R
     
-} ANALOG_IN;
-
+} ANALOG_IN_t;
 
 
 //
-void ai_connect_channel_301(uint8_t ch);
+void ai_connect_channel(uint8_t channel);
 
 //
-void ai_connect_channel_401(uint8_t ch);
-  
+void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel);
+
 //
 void ai_connect_test(void);
 
+//
+void ai_mode_test(void);
+
 #endif  // __ANALOG_INPUT_H
 

+ 11 - 10
fw/modules/shift_reg/shift_reg.c

@@ -58,7 +58,7 @@ void sh_init(void)
     gpio_initstructure.gpio_pins           = GPIO_PINS_0 | GPIO_PINS_1;
     gpio_init(GPIOD, &gpio_initstructure); 
     
-    // CS для сдвигового регистра U1010
+    // CS для сдвигового регистра U1010 -> MUX301, MUX401
     gpio_initstructure.gpio_pins           = GPIO_PINS_3;
     gpio_init(GPIOD, &gpio_initstructure); 
         
@@ -81,15 +81,15 @@ void sh_init(void)
     spi_enable(SH_SPI, TRUE);
 }
 
-// Управление сигналами EN_CRNT_SNS_1..EN_CRNT_SNS_12
+// Установка сигналов EN_CRNT_SNS_1..EN_CRNT_SNS_12 (режим измерения)
 // Получение сигналов ALRM_IN_1..ALRM_IN_12
-void en_crnt_alrm_in(uint16_t val)
+uint16_t sh_ai_mode(uint16_t val)
 {
     uint16_t ret = 0;
     
     // Данные отправлеяются во второй регистр U402
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
-    SH_SPI->dt = 0x02;
+    SH_SPI->dt = (0x003F) & (val >> 8);
   
     // Данные из второго регистра U400
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
@@ -97,7 +97,7 @@ void en_crnt_alrm_in(uint16_t val)
 
     // Данные отправлеяются во второй регистр U302
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
-    SH_SPI->dt = 0x01;
+    SH_SPI->dt = (0x003F) & val;
   
     // Данные из первого регистра U300
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
@@ -106,20 +106,21 @@ void en_crnt_alrm_in(uint16_t val)
     gpio_bits_set(GPIOD, GPIO_PINS_0 | GPIO_PINS_1);
     gpio_bits_reset(GPIOD, GPIO_PINS_0 | GPIO_PINS_1);
 
-    printf("SH return: %X\r\n", ret);
+    return ret;
+    //printf("SH return: %X\r\n", ret);
 }
 
 // Подключает выбранный канал к АЦП
-void an_inp(uint16_t val)
+void sh_ai_connect(uint16_t val)
 {
-    uint16_t ret;
+    //uint16_t ret;
     
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
     SH_SPI->dt = val;
-  
+/*  
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
     ret = SH_SPI->dt;
-    
+*/    
     gpio_bits_set(GPIOD, GPIO_PINS_3);
     gpio_bits_reset(GPIOD, GPIO_PINS_3);
 }

+ 2 - 2
fw/modules/shift_reg/shift_reg.h

@@ -11,10 +11,10 @@ void sh_init(void);
 void en_crnt_alrm_in(uint16_t val);
 
 //
-void an_inp(uint16_t val);
+uint16_t sh_ai_mode(uint16_t val);
 
 //
-void an_inp(uint16_t val);
+void sh_ai_connect(uint16_t val);
 
 //
 void sh_delay(void);

+ 2 - 3
fw/user/main.c

@@ -148,7 +148,8 @@ void init_task(void *argument)
     sh_init();
     
 // Тесты аналоговых входов    
-    ai_connect_test();
+    //ai_connect_test();
+    //ai_mode_test();
       
 // -------------------------------------------------------------------------- //    
 // RNDIS
@@ -222,8 +223,6 @@ void test_gpio(void *params)
         
         //en_crnt_alrm_in(0x02);
         
-        an_inp(0x02);
-        
         //io_test();
         //out_test();
         //load_test();

BIN
output/fw.bin


+ 1 - 0
project/ewarm/iap/iap.dep

@@ -310,6 +310,7 @@
             <file>$PROJ_DIR$\..\..\..\libs\thirdparty\freertos\FreeRTOS-openocd.c</file>
             <file>$PROJ_DIR$\..\..\..\shared\board\common.h</file>
             <file>$PROJ_DIR$\..\..\..\shared\freemodbus\include\mb.h</file>
+            <file>$PROJ_DIR$\..\..\..\shared\freemodbus\include\mbutils.h</file>
         </outputs>
         <file>
             <name>[ROOT_NODE]</name>

Diff do ficheiro suprimidas por serem muito extensas
+ 113 - 112
project/ewarm/module_universal_io.dep


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff