Browse Source

Настройко аналоговых входов

TelenkovDmitry 6 months ago
parent
commit
286ea1556b

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

@@ -28,12 +28,23 @@ 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
+
+#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,
+                                           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];
 
@@ -41,15 +52,46 @@ 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, 
                           IO_9_R, IO_10_R, IO_11_R, IO_12_R};
 
+led_t ai_input_led[12] = {IO_1_G, IO_2_G, IO_3_G, IO_4_G, 
+                          IO_5_G, IO_6_G, IO_7_G, IO_8_G, 
+                          IO_9_G, IO_10_G, IO_11_G, IO_12_G};
+
+uint16_t ai_state_bit;  // состояние аналоговых входов (вкл/выкл) битовое поле
+
+
 
 
 //
 void ai_init(void)
 {
-    sh_init();          // Сдвиговые регистры
-    ai_set_meas_mode(); // Режим измерения
-    ai_ext_sens_power(settings.ext_sens_power); // Питание внешних датчиков
-    ai_adc_init();      // Внешинй ADC
+    // Зеленые LED сигнализируют (вкл/выкл) входов.
+    ai_led_update();    
+    
+    // Сдвиговые регистры
+    sh_init();          
+    
+    // Режим измерения
+    ai_set_meas_mode();
+    
+    // Питание внешних датчиков
+    ai_ext_sens_power(settings.ext_sens_power); 
+    
+    // Внешинй ADC
+    ai_adc_init();
+}
+
+//
+void ai_led_update(void)
+{
+    for (int i = 0; i < AI_NUMBER; i++) 
+    {
+        if (settings.ai[i].state) {
+            leds[ai_input_led[i]].state = LED_ON;
+        }
+        else {
+            leds[ai_input_led[i]].state = LED_OFF;
+        }
+    }
 }
 
 // Установить режим измерения каналов с 1 по 12.
@@ -151,10 +193,21 @@ bool ai_adc_init(void)
 // Оцифровка всех каналов (входы + дополнительные каналы)
 void ai_processing(void)
 {
+#if 0
     for (uint8_t i = 0; i < 8; i++)
     {
         adc_get_two_channles(channel_name[i], channel_name[i + 8]);
     }
+#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");
     adc_print_data();
@@ -165,6 +218,10 @@ void ai_processing(void)
 //
 void adc_get_two_channles(ANALOG_IN_t one, ANALOG_IN_t two)
 {
+    //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);
@@ -174,8 +231,13 @@ void adc_get_two_channles(ANALOG_IN_t one, ANALOG_IN_t two)
     vTaskDelay(1);
     MS5192T_SetChannel(MS5192T_CH_AIN2P_AIN2M);
     adc_raw_data[two] = MS5192T_SingleConversion();
+#endif    
 }
 
+// Дополнительные каналы (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)
 {
@@ -206,7 +268,7 @@ void adc_task(void *params)
     {
         ai_alarm = sh_ai_mode(ai_mode);
         
-        ai_processing();
+        //ai_processing();
         
         ai_leds_processing();
         
@@ -267,30 +329,20 @@ 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_NUMBER; i++) 
     {
-        
-    }  
-      
-#if 0  
-    for (int i = 0; i < DI_NUMBER; i++)
-    {
-        if ((settings.di_mode_bits & (1 << i)) != d_inputs[i].mode) 
+        if (((settings.ai_state_bits >> i) & 1) != settings.ai[i].state)
         {
-            d_inputs[i].mode = settings.di_mode_bits & (1 << i);
-            if (d_inputs[i].mode == 0) 
-            {
-                d_inputs[i].cnt = 0;
-                d_inputs[i].p_flag = false;
-                di_cnt[i] = 0;
+            settings.ai[i].state = ((settings.ai_state_bits >> i) & 1);
+            if (settings.ai[i].state == 0) {
+                leds[ai_input_led[i]].state = LED_OFF;
             }
-            else
-            {
-                di_state_bit &= ~(1 << i);
+            else {
+                leds[ai_input_led[i]].state = LED_ON;
             }
+                
         }
     }
-#endif
 }
 
 // Утсновить режим измерения канала (ток или напряжение)

+ 9 - 1
fw/modules/io/analog_input.h

@@ -9,7 +9,7 @@ typedef struct
     uint8_t state;          // 0 - выкл, 1 - вкл
     uint8_t mode;           // режим измерения (0 - напряжение, 1 - ток)
     uint8_t gain_factor;    // коэффициент усиления
-    
+    uint8_t name;
 } ai_t;
 
 
@@ -52,6 +52,12 @@ typedef enum
 //
 void ai_init(void);
 
+//
+void ai_led_update(void);
+
+// 
+void ai_set(void);
+
 //
 void ai_set_meas_mode(void);
 
@@ -97,5 +103,7 @@ extern uint16_t adc_raw_data[];
 
 extern uint16_t ai_alarm; 
 
+extern uint16_t ai_state_bit;
+
 #endif  // __ANALOG_INPUT_H
 

+ 2 - 2
fw/modules/io/digital_input.c

@@ -185,9 +185,9 @@ void di_set(void)
 {
     for (int i = 0; i < DI_NUMBER; i++)
     {
-        if ((settings.di_mode_bits & (1 << i)) != d_inputs[i].mode) 
+        if ((settings.di_mode_bits >> i) & 1) != d_inputs[i].mode) 
         {
-            d_inputs[i].mode = settings.di_mode_bits & (1 << i);
+            d_inputs[i].mode = ((settings.di_mode_bits >> i) & 1);
             if (d_inputs[i].mode == 0) 
             {
                 d_inputs[i].cnt = 0;

+ 11 - 5
fw/modules/modbus/modbus_ai_params.c

@@ -18,14 +18,13 @@ uint16_t mb_init_ai_params(uint16_t i)
     mb_param[index].reg = 0x0300;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ai_state_bits;
-	mb_param[index].set = NULL;
+	mb_param[index].set = mb_set_ai_state;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
     index++;
-    
-#if 0    
-    mb_param[index].reg = 0x0300;
+
+    mb_param[index].reg = 0x0301;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ai_mode_bits;
 	mb_param[index].set = mb_set_ai_mode;
@@ -34,7 +33,7 @@ uint16_t mb_init_ai_params(uint16_t i)
     
     index++;
     
-    
+#if 0        
     mb_param[index].reg = 0x0301;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&ai_alarm;
@@ -207,6 +206,13 @@ uint16_t mb_init_ai_params(uint16_t i)
 //                          Установка параметров
 // -------------------------------------------------------------------------- //
 
+//
+mb_delay_action_t mb_set_ai_state(void)
+{
+    ai_set();
+    return MB_NO_ACTION;
+}
+
 //
 mb_delay_action_t mb_set_ai_mode(void)
 {

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

@@ -21,6 +21,9 @@ uint16_t mb_init_ai_params(uint16_t i);
 //                          Установка параметров
 // -------------------------------------------------------------------------- //
 
+//
+mb_delay_action_t mb_set_ai_state(void);
+
 //
 mb_delay_action_t mb_set_ai_mode(void);
 

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

@@ -1,7 +1,7 @@
 #include "at32f403a_407.h" 
 #include "settings_api.h"
 #include "settings_ai.h"
-
+#include "analog_input.h"
 
 #if defined (MAI_12)
 
@@ -18,13 +18,11 @@ void settings_ai_set_all_default(void)
 //
 void settings_ai_def(settings_t *settings)
 {
-#if 0  
     // Все входы выключены
     settings->ai_state_bits = 0;
     
     // Режим измерения напряжения
     settings->ai_mode_bits = 0;
-#endif    
     
     for (int i = 0; i < AI_NUMBER; i++)
     {  
@@ -32,6 +30,21 @@ void settings_ai_def(settings_t *settings)
         settings->ai[i].mode = 0;   // режим измерения напряжения
         settings->ai[i].gain_factor = 1;    // коэф-т усиления внешнего ADC
     }
+    
+    settings->ai[0].name = AN_INP_1;
+    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[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;
 }
 
 //

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

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

+ 6 - 4
fw/user/main.cpp

@@ -104,7 +104,7 @@ void init_task(void *argument)
     // Настройки параметров порта Modbus
     settings_set_modbus_params(settings.com_settings.mb_port);
     
-#if 1
+#if 0
 // Только для теста    
     settings_set_all_default();
     settings_save(&settings);
@@ -265,7 +265,7 @@ void init_task(void *argument)
     dac_test(CH_DAC_4, 10000);  
 */  
     
-#if 0
+#if 1
     // Настройки по умолчанию 
     settings_set_all_default();
     settings_save(&settings);
@@ -275,14 +275,16 @@ void init_task(void *argument)
 // Отдельный таск для предварительных тестов
     
     // Разное
-    xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    //xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
     // Тесты GPIO
     //xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
+    ai_processing();
+    
 // -------------------------------------------------------------------------- //
 // Удаляем стартовую задачу 
-    
+           
     vTaskDelete(NULL);
 }
 

BIN
output/fw.bin


File diff suppressed because it is too large
+ 365 - 363
project/ewarm/iap/iap.dep


File diff suppressed because it is too large
+ 689 - 687
project/ewarm/module_universal_io.dep


+ 1 - 1
shared/board/common_config.h

@@ -14,7 +14,7 @@
 /**
   * @brief  Версия прошивки
   */
-#define FW_VERSION                      "1.01"
+#define FW_VERSION                      "1.02"
 
 /**
   * @brief  Адрес сектора настроек

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


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


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


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


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


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


+ 32 - 4
tools/analog_in.py

@@ -34,7 +34,7 @@ class IO_AnalogInput(IO_Module):
 
     '''Чтение параметров'''
 
-    # Рожим работы входов
+    # Режим работы входов
 
     def get_inputs_state(self):
         data = self.modbus.read_holding_registers(AI_REGS['ain_state'], 1)
@@ -63,6 +63,18 @@ class IO_AnalogInput(IO_Module):
     def set_ext_sens_power(self, val):
         self.modbus.write_holding_register(AI_REGS['esens_pow'], val)
 
+    '''Настройки входов'''
+    def print_inputs(self):
+        print(Fore.GREEN + '____________________________________________')
+        print(Fore.GREEN + 'Analog inputs settings:')
+
+        # Значения состояний входов вкл./выкл. (битовое поле)
+        print('Inputs state [bit field] :', Fore.GREEN + self.get_inputs_state())
+
+        # Режим измерения входов напряжение или ток. (битовое поле)
+        print('Inputs mode [bit field]  :', Fore.GREEN + self.get_inputs_mode())
+
+    
     '''Вывод параметров'''
     def print_raw_inputs(self):
         data = self.get_raw_inputs()
@@ -108,13 +120,21 @@ def main():
     serial_port = Serial('COM22', 115200, timeout=0.05, parity='N', xonxoff=False)
     
     modbus_tester = Modbus(serial_port, 1)
+    # modbus_tester.MB_DEBUG = True
     # dev_tester = IO_Digital(modbus_tester)
     ai = IO_AnalogInput(modbus_tester) 
 
     '''Режим работы аналоговых входов'''
-    print(ai.get_inputs_state())
-    ai.set_inputs_state(0b10)
-    print(ai.get_inputs_state())
+    for i in range(1000):
+        ai.print_inputs()
+        sleep(1)
+
+    # print(ai.get_inputs_state())
+    # ai.set_inputs_state(0b1000_1010_1010)
+    # print(ai.get_inputs_state())
+    # sleep(1)
+    # ai.set_inputs_state(0b0)
+
     # print(ai.get_inputs_mode())
     # ai.set_inputs_mode(0b00001)
     # print(ai.get_inputs_mode())
@@ -134,6 +154,14 @@ def main():
 
     # print(ai.sys.get_system_vars())
 
+    '''Сохранение настроек'''
+    # ai.sys.save_sattings()
+
+    '''Обновление прошивки'''
+    # serial_port.timeout = 1
+    # modbus_tester.MB_DEBUG = True
+    # ai.updater.update('fw.bin', 'MAI_12')
+    
 
 if __name__ == '__main__':
     main()

+ 5 - 2
tools/analog_out.py

@@ -18,13 +18,16 @@ class IO_AnalogOutput(IO_Module):
 
 def main():
     colorama.init(autoreset=True)
-    serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM22', 115200, timeout=0.05, parity='N', xonxoff=False)
     ao_modbus = Modbus(serial_port, 1)
     ao = IO_AnalogOutput(ao_modbus)
 
     '''Тесты отдельного модуля аналоговых выходов'''
-    ao.sys.get_system_vars()
+    # ao.sys.get_system_vars()
 
+    '''Обновление прошивки'''
+    # ao_modbus.MB_DEBUG = True
+    # ao.updater.update('fw.bin', 'MAO_4')
 
 
 if __name__ == '__main__':

+ 1 - 1
tools/digital_io.py

@@ -259,7 +259,7 @@ def main():
     # dev.print_inputs()
 
     '''Обновление'''
-    dio.updater.update('fw.bin', 'MAI_12')
+    # dio.updater.update('fw.bin', 'MAI_12')
     
     
 if __name__ == '__main__':

BIN
tools/fw.bin


+ 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': 0x0300, 'ain_alarm': 0x0301, 'ain_raw': 0x0302, 
+AI_REGS = {'ain_state': 0x0300, 'ain_mode': 0x0301, 'ain_alarm': 0x0301, 'ain_raw': 0x0302, 
            'esens_pow': 0x0320}
 
 AO_REGS = {}

Some files were not shown because too many files changed in this diff