Jelajahi Sumber

Изменения в системе коммутации аналоговых каналов.

unknown 6 bulan lalu
induk
melakukan
453ff34b1f

TEMPAT SAMPAH
doc/sch/0482602_SCH_20250217_1548.pdf


+ 18 - 19
fw/modules/io/analog_input.c

@@ -91,6 +91,9 @@ void ai_init(void)
     // Режим измерения
     ai_set_meas_mode();
     
+    // Диапазон измерения
+    
+    
     // Питание внешних датчиков
     ai_ext_sens_power(settings.ext_sens_power); 
     
@@ -218,6 +221,11 @@ void ai_processing(void)
     // 12 основных каналов 
     for (uint8_t i = 0; i < AI_COMMON_NUMBER/2; i++)
     {
+        // Если один из пары каналов включен, то нужно скоммутировать каналы
+        if (settings.ai[i].state || settings.ai[i + 6].state) {
+            sh_ai_mode_two(ai_mode, settings.ai[i].voltage_mode, settings.ai[i + 6].voltage_mode);
+        }
+      
         adc_meas_two_channels(&settings.ai[i], &settings.ai[i + 6], 
                               &adc_com_raw_data[i], &adc_com_raw_data[i + 6]);
         
@@ -243,6 +251,8 @@ void ai_processing(void)
     // 4 дополнительных канала
     for (uint8_t i = 0; i < AI_ADD_NUMBER/2; i++)
     {
+        sh_ai_mode_two(ai_mode, 0, 0);
+        
         adc_meas_two_channels(&settings.ai_add[i], &settings.ai_add[i + 2], 
                               &adc_add_raw_data[i], &adc_add_raw_data[i + 2]);
     }
@@ -271,29 +281,18 @@ void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *ou
 {
     uint8_t gain;
     
-    // 1 - ый канал
-    if (one->state == 0) {
-        //DBG printf("[one] channel name: %u off\r\n", one->name);
-        
-    }
-    else {
-        //DBG printf("[one] channel name: %u on\r\n", one->name);
-        
+    if (one->state != 0)
+    {
         gain = adc_get_gain(one->gain_factor);
         MS5192T_SetGain(gain);
         ai_connect_channel(one->name);
         vTaskDelay(1);
         MS5192T_SetChannel(MS5192T_CH_AIN1P_AIN1M);
         *out_one = MS5192T_SingleConversion();
-    }            
-
-    // 2 - ой канал
-    if (two->state == 0) {
-        //DBG printf("[two] channel name: %u off\r\n", two->name);
     }
-    else {
-        //DBG printf("[two] channel name: %u on\r\n", two->name);
-        
+    
+    if (two->state != 0)
+    {
         gain = adc_get_gain(two->gain_factor);
         MS5192T_SetGain(gain);
         ai_connect_channel(two->name);
@@ -377,7 +376,7 @@ void adc_task(void *params)
 {
     for (;;)
     {
-        ai_alarm = sh_ai_mode(ai_mode);
+        //ai_alarm = sh_ai_mode(ai_mode);
         
         ai_processing();
         
@@ -439,7 +438,7 @@ void ai_current_alarm_detect(void)
             if (adc_com_data[i] < 4.0)
             {
                 // Вход в режиме измерения 4-20 mA
-                if (settings.ai[i].current_mode == 1) 
+                if (settings.ai[i].current_mode == 0) 
                 {
                     if (adc_com_data[i] > 1.0)
                     {
@@ -643,7 +642,7 @@ void ai_set(void)
     }
 }
 
-// Утсновить режим измерения канала (ток или напряжение)
+// Установить режим измерения канала (ток или напряжение)
 void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel)
 {
     if (mode == MEAS_CURRENT) 

+ 153 - 152
fw/modules/io/analog_input.h

@@ -1,152 +1,153 @@
-#ifndef __ANALOG_INPUT_H
-#define __ANALOG_INPUT_H
-
-#include <stdbool.h>
-
-
-typedef struct
-{
-    uint8_t state;          // 0 - выкл, 1 - вкл
-    uint8_t mode;           // режим измерения (0 - напряжение, 1 - ток)
-    uint8_t current_mode;   // режим измерения тока (0 - 0-20 mA, 1 - 4-20 mA)
-    uint8_t name;           // 
-    uint8_t gain_factor;    // коэффициент усиления
-    float k_factor;         // 
-    float b_factor;         //
-} ai_t;
-
-
-typedef struct
-{
-    bool alarm_flag;
-    bool tim_flag;
-    uint32_t cnt;
-    
-} ai_alarm_t;
-
-// Режим измерения (ток или напряжение)
-typedef enum
-{
-    MEAS_VOLTAGE = 0,
-    MEAS_CURRENT,  
-    
-} MEAS_CHAN_MODE_t;
-
-
-typedef enum 
-{
-    MUX_301_CH = 0,
-    AN_INP_1,
-    AN_INP_2,
-    AN_INP_3,
-    AN_INP_4,
-    AN_INP_5,
-    AN_INP_6,
-    V_ISO_CL,   // +24 V
-    V_ISO,      // +5 V
-    
-    MUX_401_CH,
-    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,
-
-    NUMBER_ADC_CH,
-    
-} ANALOG_IN_t;
-
-
-//
-void ai_init_modbus_params(void);
-
-//
-void ai_init(void);
-
-//
-void ai_led_update(void);
-
-// 
-void ai_set(void);
-
-//
-void ai_set_meas_mode(void);
-
-//
-bool ai_adc_init(void);
-
-//
-void ai_processing(void);
-
-//
-void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *out_two);
-
-//
-uint8_t adc_get_gain(uint8_t tmp);
-
-//
-void adc_print_data(void);
-
-//
-void adc_print_data_extend(void);
-
-// 
-void adc_task(void *params);
-
-//
-void adc_alarm_task(void *params);
-
-//
-void ai_voltage_alarm_detect(void);
-
-//
-void ai_current_alarm_detect(void);
-
-//
-void ai_alarm_tim_handler(void);
-
-//
-void ai_connect_channel(uint8_t channel);
-
-//
-void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel);
-
-//
-void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel);
-
-//
-void ai_ext_sens_power(uint16_t state);
-
-//
-void ai_leds_processing(void);
-
-//
-void ai_connect_test(void);
-
-//
-void ai_mode_test(void);
-
-
-extern uint16_t ai_gain[];
-
-extern uint16_t adc_com_raw_data[];
-
-extern float adc_com_data[];
-
-extern uint16_t adc_com_fil_data[];
-
-extern uint16_t adc_add_raw_data[];
-
-extern uint16_t ai_alarm; 
-
-extern uint16_t ai_state_bit;
-
-extern ai_alarm_t ai_alarm_f[];
-
-extern ai_alarm_t ai_cur_lim;
-
-#endif  // __ANALOG_INPUT_H
-
+#ifndef __ANALOG_INPUT_H
+#define __ANALOG_INPUT_H
+
+#include <stdbool.h>
+
+
+typedef struct
+{
+    uint8_t state;          // 0 - выкл, 1 - вкл
+    uint8_t mode;           // режим измерения (0 - напряжение, 1 - ток)
+    uint8_t current_mode;   // диапазон измерения тока (0 - 4-20мА, 1 - 0-20mA)
+    uint8_t voltage_mode;   // диапазон измерения напряжения (0 - 0-10В, 1 - 0-1В)
+    uint8_t name;           // 
+    uint8_t gain_factor;    // коэффициент усиления
+    float k_factor;         // 
+    float b_factor;         //
+} ai_t;
+
+
+typedef struct
+{
+    bool alarm_flag;
+    bool tim_flag;
+    uint32_t cnt;
+    
+} ai_alarm_t;
+
+// Режим измерения (ток или напряжение)
+typedef enum
+{
+    MEAS_VOLTAGE = 0,
+    MEAS_CURRENT,  
+    
+} MEAS_CHAN_MODE_t;
+
+
+typedef enum 
+{
+    MUX_301_CH = 0,
+    AN_INP_1,
+    AN_INP_2,
+    AN_INP_3,
+    AN_INP_4,
+    AN_INP_5,
+    AN_INP_6,
+    V_ISO_CL,   // +24 V
+    V_ISO,      // +5 V
+    
+    MUX_401_CH,
+    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,
+
+    NUMBER_ADC_CH,
+    
+} ANALOG_IN_t;
+
+
+//
+void ai_init_modbus_params(void);
+
+//
+void ai_init(void);
+
+//
+void ai_led_update(void);
+
+// 
+void ai_set(void);
+
+//
+void ai_set_meas_mode(void);
+
+//
+bool ai_adc_init(void);
+
+//
+void ai_processing(void);
+
+//
+void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *out_two);
+
+//
+uint8_t adc_get_gain(uint8_t tmp);
+
+//
+void adc_print_data(void);
+
+//
+void adc_print_data_extend(void);
+
+// 
+void adc_task(void *params);
+
+//
+void adc_alarm_task(void *params);
+
+//
+void ai_voltage_alarm_detect(void);
+
+//
+void ai_current_alarm_detect(void);
+
+//
+void ai_alarm_tim_handler(void);
+
+//
+void ai_connect_channel(uint8_t channel);
+
+//
+void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel);
+
+//
+void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel);
+
+//
+void ai_ext_sens_power(uint16_t state);
+
+//
+void ai_leds_processing(void);
+
+//
+void ai_connect_test(void);
+
+//
+void ai_mode_test(void);
+
+
+extern uint16_t ai_gain[];
+
+extern uint16_t adc_com_raw_data[];
+
+extern float adc_com_data[];
+
+extern uint16_t adc_com_fil_data[];
+
+extern uint16_t adc_add_raw_data[];
+
+extern uint16_t ai_alarm; 
+
+extern uint16_t ai_state_bit;
+
+extern ai_alarm_t ai_alarm_f[];
+
+extern ai_alarm_t ai_cur_lim;
+
+#endif  // __ANALOG_INPUT_H
+

+ 1 - 1
fw/modules/modbus/modbus.c

@@ -69,7 +69,7 @@ void mb_init(void)
 	eMBEnable();
     
     
-    xTaskCreate(modbus_task, "modbus_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    xTaskCreate(modbus_task, "modbus_task", 2*configMINIMAL_STACK_SIZE, NULL, 4/*tskIDLE_PRIORITY*/, NULL);
     
     xTaskCreate(modbus_params, "modbus_params", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     

+ 34 - 2
fw/modules/modbus/modbus_ai_params.c

@@ -36,8 +36,28 @@ uint16_t mb_init_ai_params(uint16_t i)
     
     index++;
 
-    // Флаги аварий аналоговых входов. Определяется аппаратно.
+    // Диапазон измерения напряжения
     mb_param[index].reg = 0x0302;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ai_voltage_mode_bits;
+	mb_param[index].set = mb_set_ai_voltage_mode;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Диапазон измерения тока
+    mb_param[index].reg = 0x0303;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ai_current_mode_bits;
+	mb_param[index].set = NULL;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+        
+    // Флаги аварий аналоговых входов. Определяется аппаратно.
+    mb_param[index].reg = 0x0304;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&ai_alarm;
 	mb_param[index].set = NULL;
@@ -47,7 +67,7 @@ uint16_t mb_init_ai_params(uint16_t i)
     index++;
     
     // 
-    mb_param[index].reg = 0x0303;
+    mb_param[index].reg = 0x0305;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ext_sens_power;
 	mb_param[index].set = mb_set_ext_sens_power;
@@ -268,6 +288,18 @@ mb_delay_action_t mb_set_ai_mode(void)
 }
 
 
+// Диапазон измерения напряжения.
+mb_delay_action_t mb_set_ai_voltage_mode(void)
+{
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        settings.ai[i].voltage_mode = (uint8_t)((settings.ai_voltage_mode_bits >> i) & 1);
+    }
+    
+    return MB_SAVE_SETTINGS;
+}
+
+
 //
 mb_delay_action_t mb_set_ai_gain(void)
 {

+ 3 - 0
fw/modules/modbus/modbus_ai_params.h

@@ -27,6 +27,9 @@ mb_delay_action_t mb_set_ai_state(void);
 //
 mb_delay_action_t mb_set_ai_mode(void);
 
+//
+mb_delay_action_t mb_set_ai_voltage_mode(void);
+
 //
 mb_delay_action_t mb_set_ai_gain(void);
 

+ 1 - 1
fw/modules/modbus/modbus_params.h

@@ -16,7 +16,7 @@ extern "C" {
 #endif
 
 #if defined (MAI_12)  
-#define MB_PARAM_MAX			170
+#define MB_PARAM_MAX			172
 #endif
 
 #if defined (MAO_4)

+ 7 - 3
fw/modules/settings/settings_ai.c

@@ -24,15 +24,19 @@ void settings_ai_def(settings_t *settings)
     // Режим измерения напряжения
     settings->ai_mode_bits = 0;
     
-    // режим измерения тока (0 - 0-20 mA)
+    // режим измерения напряжения (0 - 0-10В)
+    settings->ai_voltage_mode_bits = 0;
+    
+    // режим измерения тока (0 - 4-20 mA)
     settings->ai_current_mode_bits = 0;
     
     // Основные 12 каналов
     for (int i = 0; i < AI_COMMON_NUMBER; i++) 
     {  
         settings->ai[i].state = 0;  // вход выключен
-        settings->ai[i].mode = 0;   // режим измерения напряжения
-        settings->ai[i].current_mode = 0;   // режим измерения тока (0 - 0-20 mA)
+        settings->ai[i].mode = 0;   // режим измерения напряжения (ток или напряжение)
+        settings->ai[i].voltage_mode = 0;   // диапазон измерения напряжения (0 - 0-10В)
+        settings->ai[i].current_mode = 0;   // диапазон измерения тока (0 - 4-20 mA)
         settings->ai[i].gain_factor = 1;    // коэф-т усиления внешнего ADC
         settings->ai[i].k_factor = 1.0;
         settings->ai[i].b_factor = 0.0;

+ 4 - 1
fw/modules/settings/settings_api.h

@@ -137,7 +137,10 @@ typedef struct
      
     uint16_t    ai_state_bits;      // статус входа (для 12 основных), 0 - выкл, 1 - вкл
     uint16_t    ai_mode_bits;       // режим работы входов (для 12 основных), 0 - измерение напряжения, 1 - тока
-    uint16_t    ai_current_mode_bits;    // режим измерения тока (0 - 0-20 мА, 1 - 4-20 mA)
+    
+    uint16_t    ai_voltage_mode_bits;   // режим измерения напряжения (0 - 0-10В, 1 - 0-1В)
+    uint16_t    ai_current_mode_bits;   // режим измерения тока (0 - 4-20 мА, 1 - 0-20 mA)
+    
     uint16_t    ext_sens_power;     // питание внешних датчиков, 0 - выкл, 1 - вкл
     
     uint16_t    period_archive[ARCH_AI_CH_NUMBER];  // период архивирования

+ 59 - 1
fw/modules/shift_reg/shift_reg.c

@@ -96,7 +96,7 @@ 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
 uint16_t sh_ai_mode(uint16_t val)
 {
@@ -151,6 +151,64 @@ uint16_t sh_ai_mode(uint16_t val)
     return ret;    
 }
 
+
+//
+// Установка сигналов EN_CRNT_SNS_1..EN_CRNT_SNS_12 (режим измерения тока или напряжения)
+// Получение сигналов ALRM_IN_1..ALRM_IN_12
+uint16_t sh_ai_mode_two(uint16_t val, uint8_t ch_1, uint8_t ch_2)
+{
+    uint16_t ret = 0;
+
+    // Данные отправлеяются во второй регистр U402
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    SH_SPI->dt = ((0x003F) & (val >> 8)) | (ch_2 << 6);
+
+    // Данные из второго регистра U400
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
+    ret = (SH_SPI->dt & 0x3F) << 6;
+
+    // Данные отправлеяются во второй регистр U302
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    SH_SPI->dt = ((0x003F) & val) | (ch_1 << 6);
+
+    // Данные из первого регистра U300
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
+    ret |= SH_SPI->dt & 0x3F;
+
+    gpio_bits_set(GPIOD, GPIO_PINS_0);
+    nop(5);
+    gpio_bits_reset(GPIOD, GPIO_PINS_0);
+    nop(5);
+    
+    vTaskDelay(1);
+    
+    // Данные отправлеяются во второй регистр U402
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    SH_SPI->dt = ((0x003F) & (val >> 8)) | (ch_2 << 6);
+  
+    // Данные из второго регистра U400
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
+    ret = (SH_SPI->dt & 0x3F) << 6;
+    
+    // Данные отправлеяются во второй регистр U302
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    SH_SPI->dt = ((0x003F) & val) | (ch_1 << 6);
+  
+    // Данные из первого регистра U300
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
+    ret |= SH_SPI->dt & 0x3F;
+
+    gpio_bits_set(GPIOD, GPIO_PINS_0);
+    nop(5);
+    gpio_bits_reset(GPIOD, GPIO_PINS_0);
+    nop(5);
+   
+    //printf("SH return: %X\r\n", ret);
+    
+    return ret;    
+}
+
+
 //
 uint16_t sh_ao_mode(uint16_t val)
 {

+ 3 - 0
fw/modules/shift_reg/shift_reg.h

@@ -13,6 +13,9 @@ void en_crnt_alrm_in(uint16_t val);
 //
 uint16_t sh_ai_mode(uint16_t val);
 
+//
+uint16_t sh_ai_mode_two(uint16_t val, uint8_t ch_1, uint8_t ch_2);
+
 //
 uint16_t sh_ao_mode(uint16_t val);
 

+ 0 - 4
fw/user/main.cpp

@@ -143,11 +143,7 @@ void init_task(void *argument)
     
 #if defined (MAI_12)    
     
-// Тесты коэффициентов
-    
-    //factors_sector_clear();
     factors_load(&ai_factors);
-    
     ai_init();    
     xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     xTaskCreate(adc_alarm_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);

TEMPAT SAMPAH
output/fw.bin


File diff ditekan karena terlalu besar
+ 414 - 412
project/ewarm/iap/iap.dep


File diff ditekan karena terlalu besar
+ 653 - 652
project/ewarm/module_universal_io.dep


+ 4 - 2
tools/log_reader.py

@@ -122,8 +122,10 @@ class DigitalLogReader(LogReader):
         return struct.unpack('<QBBBfB', data[5:21])
 
     def print_log_entry(self, index):
+        time_start = time.time()
         data = self.modbus.read_file_record(LOG_ENTRY, 0, index, 1)
-        LogParser.print_entry(struct.unpack('<QBBBfB', data[5:21]), index)
+        print(f"Entry time: ", time.time() - time_start)
+        # LogParser.print_entry(struct.unpack('<QBBBfB', data[5:21]), index)
 
     def print_archive_entry(self, channel, index):
         data = self.modbus.read_file_record(ARCHIVE_ENTRY, channel, index, 1)
@@ -156,7 +158,7 @@ class DigitalLogReader(LogReader):
         self.get_log_info()
         for i in range(1, self.log_entries_number + 1):
             self.print_log_entry(i)
-            sleep(0.01)
+            # sleep(0.01)
 
 
 class AnalogInputLogReader(LogReader):

+ 5 - 2
tools/mb_registers.py

@@ -38,9 +38,12 @@ class AiReg(Enum):
 
     IN_STATE        = 0x0300 # Состояние входов (вкл./выкл.)
     IN_MODE         = 0x0301 # Режим работы входов (битовое поле)
-    IN_FAILURE      = 0x0302 # Аварии аналоговых входов (битовое поле)
+    IN_VOL_RANGE    = 0X0302 # Диапазон измерения напряжения
+    IN_CUR_RANGE    = 0x0303 # Диапазон измерения тока
 
-    EXT_SENS_POWER  = 0x0303 # Питание внешних датчиков
+    IN_FAILURE      = 0x0304 # Аварии аналоговых входов (битовое поле)
+
+    EXT_SENS_POWER  = 0x0305 # Питание внешних датчиков
 
     IN_GAINE_FACTOR = 0x0310 # Коэффициент усиления канала
     IN_K_FACTOR     = 0x0320 # Коэффициент пересчета K

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini