Преглед на файлове

Работа с аналоговыми входами

TelenkovDmitry преди 6 месеца
родител
ревизия
6b385d6c08

+ 75 - 71
fw/modules/io/analog_input.c

@@ -28,25 +28,20 @@ uint16_t ai_mode;   // режим измерения аналоговых кан
 
 uint16_t ai_alarm;  // слово аварий входов
 
-#if 1
-ANALOG_IN_t channel_name[NUMBER_ADC_CH] = {AN_INP_1, AN_INP_2, AN_INP_3, 
-                                           AN_INP_4, AN_INP_5, AN_INP_6,
-                                           V_ISO_CL, V_ISO, 
-                                           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};
-#endif
+uint16_t ai_gain[AI_COMMON_NUMBER]; // массив коэффициентов усиленя (modbus)
 
 #if 0
 ANALOG_IN_t channel_name[NUMBER_ADC_CH] = {AN_INP_1, AN_INP_2, AN_INP_3, 
                                            AN_INP_4, AN_INP_5, AN_INP_6,
+                                           V_ISO_CL, V_ISO, 
                                            AN_INP_7, AN_INP_8, AN_INP_9,
                                            AN_INP_10, AN_INP_11, AN_INP_12,
-                                           V_ISO_CL, V_ISO,
                                            CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R};
 #endif
 
-uint16_t adc_raw_data[NUMBER_ADC_CH];
+
+uint16_t adc_raw_data[AI_ALL_NUMBER];
+
 
 led_t ai_alarm_led[12] = {IO_1_R, IO_2_R, IO_3_R, IO_4_R, 
                           IO_5_R, IO_6_R, IO_7_R, IO_8_R, 
@@ -78,12 +73,33 @@ void ai_init(void)
     
     // Внешинй ADC
     ai_adc_init();
+    
+    // Modbus параметры
+    ai_init_modbus_params();
 }
 
 //
+void ai_init_modbus_params(void)
+{
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER/2; i++)
+    {
+        ai_gain[i] = settings.ai[i].gain_factor;
+        ai_gain[i + 6] = settings.ai[i + 8].gain_factor;
+    }
+
+#if 0
+    // для теста
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        ai_gain[i] = i + 10;
+    }
+#endif    
+}   
+
+// Управление LED для 12-и основных входов
 void ai_led_update(void)
 {
-    for (int i = 0; i < AI_NUMBER; i++) 
+    for (int i = 0; i < AI_COMMON_NUMBER; i++) 
     {
         if (settings.ai[i].state) {
             leds[ai_input_led[i]].state = LED_ON;
@@ -106,7 +122,7 @@ void ai_set_meas_mode(void)
             ai_set_mode_word((MEAS_CHAN_MODE_t)0, i);
     }
 #endif
-    for (int i = 0; i < AI_NUMBER; i++)
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
     {
         if (settings.ai[i].mode)
             ai_set_mode_word((MEAS_CHAN_MODE_t)1, i);
@@ -190,23 +206,14 @@ bool ai_adc_init(void)
     return true;
 }  
 
-// Оцифровка всех каналов (входы + дополнительные каналы)
+// Оцифровка всех 16-и каналов (входы + дополнительные каналы)
 void ai_processing(void)
 {
-#if 0
+    // все 16 каналов
     for (uint8_t i = 0; i < 8; i++)
     {
-        adc_get_two_channles(channel_name[i], channel_name[i + 8]);
+        adc_meas_two_channels(settings.ai[i], settings.ai[i + 8], i);
     }
-#endif
-    
-    for (uint8_t i = 0; i < 6; i++)
-    {
-        adc_get_two_channles(channel_name[i], channel_name[i + 8]);
-    }
-    
-    
-    
     
 #if 0    
     printf("end\r\n");
@@ -216,49 +223,56 @@ void ai_processing(void)
 }
 
 //
-void adc_get_two_channles(ANALOG_IN_t one, ANALOG_IN_t two)
+void adc_meas_two_channels(ai_t one, ai_t two, uint8_t data_index)
 {
-    //if (settings.ai[one]) )
-    printf("One: %u, two: %u\r\n", one, two);
-   
-#if 0  
-    ai_connect_channel(one);
-    vTaskDelay(1);
-    MS5192T_SetChannel(MS5192T_CH_AIN1P_AIN1M);
-    adc_raw_data[one] = MS5192T_SingleConversion();
-
-    ai_connect_channel(two);
-    vTaskDelay(1);
-    MS5192T_SetChannel(MS5192T_CH_AIN2P_AIN2M);
-    adc_raw_data[two] = MS5192T_SingleConversion();
-#endif    
+    // 1 - ый канал
+    if (one.state == 0) {
+        DBG printf("[one] channel name: %u off, data_index: %u\r\n", one.name, data_index);
+    }
+    else {
+        DBG printf("[one] channel name: %u on, data_index: %u\r\n", one.name, data_index);
+        
+        ai_connect_channel(one.name);
+        vTaskDelay(1);
+        MS5192T_SetChannel(MS5192T_CH_AIN1P_AIN1M);
+        adc_raw_data[data_index] = MS5192T_SingleConversion();
+    }            
+        
+    // 2 - ой канал
+    if (two.state == 0) {
+        DBG printf("[two] channel name: %u off, data_index: %u\r\n", two.name, data_index + 8);
+    }
+    else {
+        DBG printf("[two] channel name: %u on, data_index: %u\r\n", two.name, data_index + 8);
+        
+        ai_connect_channel(two.name);
+        vTaskDelay(1);
+        MS5192T_SetChannel(MS5192T_CH_AIN2P_AIN2M);
+        adc_raw_data[data_index + 8] = MS5192T_SingleConversion();
+    }
 }
 
-// Дополнительные каналы (V_ISO_CL, V_ISO, CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R)
-void adc_get_add_channels(void)
-{}
-
 //
 void adc_print_data(void)
 {
     printf("\033[2J"); // Очистить
     printf("\033[H");  // Переместить курсор в левый верхний угол
-    printf("AN_INP_1: 0x%X, %f\r\n", adc_raw_data[AN_INP_1], (double) adc_raw_data[AN_INP_1]*0.00001785305/0.0961538);
-    printf("AN_INP_2: 0x%X, %f\r\n", adc_raw_data[AN_INP_2], (double) adc_raw_data[AN_INP_2]*0.00001785305/0.0961538);
-    printf("AN_INP_3: 0x%X, %f\r\n", adc_raw_data[AN_INP_3], (double) adc_raw_data[AN_INP_3]*0.00001785305/0.0961538);
-    printf("AN_INP_4: 0x%X, %f\r\n", adc_raw_data[AN_INP_4], (double) adc_raw_data[AN_INP_4]*0.00001785305/0.0961538);
-    printf("AN_INP_5: 0x%X, %f\r\n", adc_raw_data[AN_INP_5], (double) adc_raw_data[AN_INP_5]*0.00001785305/0.0961538);
-    printf("AN_INP_6: 0x%X, %f\r\n", adc_raw_data[AN_INP_6], (double) adc_raw_data[AN_INP_6]*0.00001785305/0.0961538);
-    printf("AN_INP_7: 0x%X, %f\r\n", adc_raw_data[AN_INP_7], (double) adc_raw_data[AN_INP_7]*0.00001785305/0.0961538);
-    printf("AN_INP_8: 0x%X, %f\r\n", adc_raw_data[AN_INP_8], (double) adc_raw_data[AN_INP_8]*0.00001785305/0.0961538);
-    printf("AN_INP_9: 0x%X, %f\r\n", adc_raw_data[AN_INP_9], (double) adc_raw_data[AN_INP_9]*0.00001785305/0.0961538);
-    printf("AN_INP_10: 0x%X, %f\r\n", adc_raw_data[AN_INP_10], (double) adc_raw_data[AN_INP_10]*0.00001785305/0.0961538);
-    printf("AN_INP_11: 0x%X, %f\r\n", adc_raw_data[AN_INP_11], (double) adc_raw_data[AN_INP_11]*0.00001785305/0.0961538);
-    printf("AN_INP_12: 0x%X, %f\r\n", adc_raw_data[AN_INP_12], (double) adc_raw_data[AN_INP_12]*0.00001785305/0.0961538);
-    printf("V_ISO_CL: 0x%X, %f\r\n", adc_raw_data[V_ISO_CL], (double) adc_raw_data[V_ISO_CL]*0.00001785305/0.0961538);
-    printf("V_ISO: 0x%X, %f\r\n", adc_raw_data[V_ISO], (double) adc_raw_data[V_ISO]*0.00001785305/0.0961538);
-    printf("CRNT_LIM_U_BFR_R: 0x%X, %f\r\n", adc_raw_data[CRNT_LIM_U_BFR_R], (double) adc_raw_data[CRNT_LIM_U_BFR_R]*0.00001785305/0.0961538);
-    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n", adc_raw_data[CRNT_LIM_U_ABFR_R], (double) adc_raw_data[CRNT_LIM_U_ABFR_R]*0.00001785305/0.0961538);
+    printf("AN_INP_1: 0x%X, %f\r\n", adc_raw_data[0],  (double) adc_raw_data[0]*0.00001785305/0.0961538);
+    printf("AN_INP_2: 0x%X, %f\r\n", adc_raw_data[1],  (double) adc_raw_data[1]*0.00001785305/0.0961538);
+    printf("AN_INP_3: 0x%X, %f\r\n", adc_raw_data[2],  (double) adc_raw_data[2]*0.00001785305/0.0961538);
+    printf("AN_INP_4: 0x%X, %f\r\n", adc_raw_data[3],  (double) adc_raw_data[3]*0.00001785305/0.0961538);
+    printf("AN_INP_5: 0x%X, %f\r\n", adc_raw_data[4],  (double) adc_raw_data[4]*0.00001785305/0.0961538);
+    printf("AN_INP_6: 0x%X, %f\r\n", adc_raw_data[5],  (double) adc_raw_data[5]*0.00001785305/0.0961538);
+    printf("AN_INP_7: 0x%X, %f\r\n", adc_raw_data[6],  (double) adc_raw_data[6]*0.00001785305/0.0961538);
+    printf("AN_INP_8: 0x%X, %f\r\n", adc_raw_data[7],  (double) adc_raw_data[7]*0.00001785305/0.0961538);
+    printf("AN_INP_9: 0x%X, %f\r\n", adc_raw_data[8],  (double) adc_raw_data[8]*0.00001785305/0.0961538);
+    printf("AN_INP_10: 0x%X, %f\r\n", adc_raw_data[9], (double) adc_raw_data[9]*0.00001785305/0.0961538);
+    printf("AN_INP_11: 0x%X, %f\r\n", adc_raw_data[10],(double) adc_raw_data[10]*0.00001785305/0.0961538);
+    printf("AN_INP_12: 0x%X, %f\r\n", adc_raw_data[11],(double) adc_raw_data[11]*0.00001785305/0.0961538);
+    printf("V_ISO_CL: 0x%X, %f\r\n", adc_raw_data[12], (double) adc_raw_data[12]*0.00001785305/0.0961538);
+    printf("V_ISO: 0x%X, %f\r\n", adc_raw_data[13],    (double) adc_raw_data[13]*0.00001785305/0.0961538);
+    printf("CRNT_LIM_U_BFR_R: 0x%X, %f\r\n", adc_raw_data[14], (double) adc_raw_data[14]*0.00001785305/0.0961538);
+    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n", adc_raw_data[15], (double) adc_raw_data[15]*0.00001785305/0.0961538);
 }
 
 // 
@@ -329,7 +343,7 @@ void ai_connect_channel(uint8_t channel)
 // 
 void ai_set(void)
 {
-    for (int i = 0; i < AI_NUMBER; i++) 
+    for (int i = 0; i < AI_COMMON_NUMBER; i++) 
     {
         if (((settings.ai_state_bits >> i) & 1) != settings.ai[i].state)
         {
@@ -410,18 +424,8 @@ void ai_ext_sens_power(uint16_t state)
 // Управления LED
 void ai_leds_processing(void)
 {
-    //uint16_t foo = 0x800;
-#if 0    
-    // Управление индикацией вкл/выкл входов
-    for (uint8_t i = 0; i < AI_NUMBER; i++) {
-        if (settings.ai_state_bits & (1 << i)) {
-            
-        }
-    }
-#endif  
-    
     // Управление индикацией аварий (12 красных LED) (слово ai_alarm)
-    for (uint8_t i = 0; i < AI_NUMBER; i++) {
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) {
         if (ai_alarm & (1 << i)) {
             leds[ai_alarm_led[i]].state = LED_ON;
         }

+ 6 - 2
fw/modules/io/analog_input.h

@@ -43,12 +43,15 @@ typedef enum
     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);
 
@@ -68,7 +71,7 @@ bool ai_adc_init(void);
 void ai_processing(void);
 
 //
-void adc_get_two_channles(ANALOG_IN_t one, ANALOG_IN_t two);
+void adc_meas_two_channels(ai_t one, ai_t two, uint8_t data_index);
 
 //
 void adc_print_data(void);
@@ -98,6 +101,7 @@ void ai_connect_test(void);
 void ai_mode_test(void);
 
 
+extern uint16_t ai_gain[];
 
 extern uint16_t adc_raw_data[];
 

+ 5 - 3
fw/modules/io/io.h

@@ -15,16 +15,18 @@
 
 
 // -------------------------------------------------------------------------- //
-// Выходы
+// Дискретные выходы
+
 #define DO_NUMBER       8    // Количество выходов
 
 #define DEBOUNCE_CNT    50
 
 // -------------------------------------------------------------------------- //
-// Аналоговые входы
-#define AI_NUMBER       12  //
+// Аналоговые входы. 
 
+#define AI_ALL_NUMBER       16  // Общее количество
 
+#define AI_COMMON_NUMBER    12 // Основные 12
 
 // -------------------------------------------------------------------------- //
 

+ 27 - 0
fw/modules/modbus/modbus_ai_params.c

@@ -32,6 +32,22 @@ uint16_t mb_init_ai_params(uint16_t i)
     mb_param[index].check_handler = mb_check_dummy;
     
     index++;
+
+
+    // Коэффициенты усиления. Регистры 0x0302 - 0x030В
+    addr = 0x0302;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&ai_gain[i];
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 1;
+        index++;
+    }
     
 #if 0        
     mb_param[index].reg = 0x0301;
@@ -220,6 +236,17 @@ mb_delay_action_t mb_set_ai_mode(void)
     return MB_SAVE_SETTINGS;
 }
 
+//
+mb_delay_action_t mb_set_ai_gain(void)
+{
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER/2; i++)
+    {
+        settings.ai[i].gain_factor = ai_gain[i];
+        settings.ai[i + 8].gain_factor = ai_gain[i + 6];
+    }  
+    return MB_NO_ACTION;
+}
+
 //
 mb_delay_action_t mb_set_ext_sens_power(void)
 {

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

@@ -25,7 +25,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     
     index++;
     
-        // Счетчики импульсов. Регистры 0x0102 - 0x0111
+    // Счетчики импульсов. Регистры 0x0102 - 0x0111
     addr = 0x0102;
     for (int i = 0; i < DI_NUMBER; i++)
     {

+ 17 - 8
fw/modules/settings/settings_ai.c

@@ -24,7 +24,7 @@ void settings_ai_def(settings_t *settings)
     // Режим измерения напряжения
     settings->ai_mode_bits = 0;
     
-    for (int i = 0; i < AI_NUMBER; i++)
+    for (int i = 0; i < AI_ALL_NUMBER; i++) 
     {  
         settings->ai[i].state = 0;  // вход выключен
         settings->ai[i].mode = 0;   // режим измерения напряжения
@@ -35,16 +35,25 @@ void settings_ai_def(settings_t *settings)
     settings->ai[1].name = AN_INP_2;
     settings->ai[2].name = AN_INP_3;
     settings->ai[3].name = AN_INP_4;
-    
     settings->ai[4].name = AN_INP_5;
     settings->ai[5].name = AN_INP_6;
-    settings->ai[6].name = AN_INP_7;
-    settings->ai[7].name = AN_INP_8;
+    settings->ai[6].name = V_ISO_CL;
+    settings->ai[7].name = V_ISO;
+    
+    settings->ai[8].name = AN_INP_7;
+    settings->ai[9].name = AN_INP_8;
+    settings->ai[10].name = AN_INP_9;
+    settings->ai[11].name = AN_INP_10;
+    settings->ai[12].name = AN_INP_11;
+    settings->ai[13].name = AN_INP_12;
+    settings->ai[14].name = CRNT_LIM_U_BFR_R;
+    settings->ai[15].name = CRNT_LIM_U_ABFR_R;
     
-    settings->ai[8].name = AN_INP_9;
-    settings->ai[9].name = AN_INP_10;
-    settings->ai[10].name = AN_INP_11;
-    settings->ai[11].name = AN_INP_12;
+    // Дополнительные каналы работают всегда (режим измерения напряжения).
+    settings->ai[6].state = 1;
+    settings->ai[7].state = 1;
+    settings->ai[14].state = 1;
+    settings->ai[15].state = 1;
 }
 
 //

+ 3 - 3
fw/modules/settings/settings_api.h

@@ -119,9 +119,9 @@ typedef struct
 #endif
 
 #if defined (MAI_12)
-    ai_t        ai[AI_NUMBER];
-    uint16_t    ai_state_bits;      // статус входа, 0 - выкл, 1 - вкл
-    uint16_t    ai_mode_bits;       // режим работы входов, 0 - измерение напряжения, 1 - тока
+    ai_t        ai[AI_ALL_NUMBER];  // 
+    uint16_t    ai_state_bits;      // статус входа (для 12 основных), 0 - выкл, 1 - вкл
+    uint16_t    ai_mode_bits;       // режим работы входов (для 12 основных), 0 - измерение напряжения, 1 - тока
     uint16_t    ext_sens_power;     // питание внешних датчиков, 0 - выкл, 1 - вкл
 #endif    
 

BIN
output/fw.bin


Файловите разлики са ограничени, защото са твърде много
+ 396 - 398
project/ewarm/iap/iap.dep


Файловите разлики са ограничени, защото са твърде много
+ 696 - 695
project/ewarm/module_universal_io.dep


BIN
tools/__pycache__/mb_registers.cpython-312.pyc


+ 26 - 9
tools/analog_in.py

@@ -34,16 +34,20 @@ class IO_AnalogInput(IO_Module):
 
     '''Чтение параметров'''
 
-    # Режим работы входов
-
+    # Значения состояний входов вкл./выкл. (битовое поле)
     def get_inputs_state(self):
         data = self.modbus.read_holding_registers(AI_REGS['ain_state'], 1)
         return format(data[0], '012b')
 
+    # Режим измерения входов (0 - напряжение или 1 - ток. (битовое поле))
     def get_inputs_mode(self):
         data = self.modbus.read_holding_registers(AI_REGS['ain_mode'], 1)
         return format(data[0], '012b')
 
+    def get_input_gain(self, input):
+        data = self.modbus.read_holding_registers(AI_REGS['ain_gain'] + input - 1, 1)
+        return data[0]
+
     def get_inputs_alarm(self):
         data = self.modbus.read_holding_registers(AI_REGS['ain_alarm'], 1)
         return format(data[0], '012b')
@@ -60,6 +64,11 @@ class IO_AnalogInput(IO_Module):
     def set_inputs_mode(self, val):
         self.modbus.write_holding_register(AI_REGS['ain_mode'], val)
 
+    def set_input_gain(self, input, value):
+        # if value not in (1, 2, 4, 8, 16, 32, 64, 128):
+        #     return None
+        self.modbus.write_holding_register(AI_REGS['ain_gain'] + input - 1, value)
+
     def set_ext_sens_power(self, val):
         self.modbus.write_holding_register(AI_REGS['esens_pow'], val)
 
@@ -74,7 +83,11 @@ class IO_AnalogInput(IO_Module):
         # Режим измерения входов напряжение или ток. (битовое поле)
         print('Inputs mode [bit field]  :', Fore.GREEN + self.get_inputs_mode())
 
-    
+        # Коэффициенты усиления
+        for i in range(1, 13):
+            print(f'Gain factor channel {i}    : ', end='')
+            print(Fore.GREEN + str(self.get_input_gain(i)))
+
     '''Вывод параметров'''
     def print_raw_inputs(self):
         data = self.get_raw_inputs()
@@ -111,9 +124,6 @@ class IO_AnalogInput(IO_Module):
 
         
         
-
-
-
 def main():
     colorama.init(autoreset=True)
     
@@ -125,9 +135,16 @@ def main():
     ai = IO_AnalogInput(modbus_tester) 
 
     '''Режим работы аналоговых входов'''
-    for i in range(1000):
-        ai.print_inputs()
-        sleep(1)
+    # ai.print_inputs()
+
+    '''Установка коэффициентов усиления. Тесты'''
+    for i in range(1, 13):
+        ai.set_input_gain(i, i+21)
+
+
+    # for i in range(1000):
+    #     ai.print_inputs()
+    #     sleep(1)
 
     # print(ai.get_inputs_state())
     # ai.set_inputs_state(0b1000_1010_1010)

+ 1 - 1
tools/mb_registers.py

@@ -10,7 +10,7 @@ reg_table = {'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pw
 DIO_REGS = {'in_bits': 0x0100, 'in_cnt': 0x0102,'in_mode': 0x0120, 'in_norm': 0x0122,
             'in_deb_start': 0x124, 'load_bits': 0x0130, 'cred_bits': 0x0131, 'out_cur': 0x0200}
 
-AI_REGS = {'ain_state': 0x0300, 'ain_mode': 0x0301, 'ain_alarm': 0x0301, 'ain_raw': 0x0302, 
+AI_REGS = {'ain_state': 0x0300, 'ain_mode': 0x0301, 'ain_gain': 0x0302, 'ain_alarm': 0x0301, 'ain_raw': 0x0302, 
            'esens_pow': 0x0320}
 
 AO_REGS = {}

Някои файлове не бяха показани, защото твърде много файлове са промени