瀏覽代碼

Добавил модуль тестовых сигналов.

unknown 6 月之前
父節點
當前提交
8aab2e45c3

+ 12 - 3
fw/modules/io/analog_input.c

@@ -11,6 +11,7 @@
 #include "mux.h"
 #include "filter.h"
 #include "preset_ai.h"
+#include "soft_test.h"
 #include <stdio.h>
 
 #undef DBG
@@ -232,6 +233,8 @@ void ai_processing(void)
         // ---------------------------------------------------------------------
         // Фильтрованные данные
         
+#if 0 
+        // Отключил на время теста уставок
         filter_factor = settings.ai[i].mode == 0 ? VOLTAGE_FACTOR : CURRENT_FACTOR;
           
         adc_com_data[i] = (float)adc_com_raw_data[i]*filter_factor*
@@ -241,15 +244,21 @@ void ai_processing(void)
         
         adc_com_data[i + 6] = (float)adc_com_raw_data[i + 6]*filter_factor*
                               settings.ai[i + 6].k_factor + settings.ai[i + 6].b_factor;
-          
+#endif   
+        // Подменяем реальные сигналы не тестовые
+        for (int i = 0; i < 12; i++)
+        {
+            adc_com_data[i] = test_get_signal();
+        }
+                
         // ---------------------------------------------------------------------
         // Фильтрация. Скользящее среднее. Только для отладки.
         adc_com_fil_data[i]     = average_int(&average_filter[i], adc_com_raw_data[i]);
         adc_com_fil_data[i + 6] = average_int(&average_filter[i + 6], adc_com_raw_data[i + 6]);
     }
 
-    // 4 дополнительных канала
-    for (uint8_t i = 0; i < AI_ADD_NUMBER/2; i++)
+    // 2 дополнительных канала
+    for (uint8_t i = 0; i < AI_ADD_NUMBER; i++)
     {
         sh_ai_mode_two(ai_mode, 0, 0);
         

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

@@ -28,7 +28,7 @@
 
 #define AI_COMMON_NUMBER    12  // Основные 12
 
-#define AI_ADD_NUMBER       4   // Дополнительные 4 входа
+#define AI_ADD_NUMBER       2   // Дополнительные входы
 
 // -------------------------------------------------------------------------- //
 // Аналоговые выходы. 

+ 1 - 1
fw/modules/log/log_ai.c

@@ -8,7 +8,7 @@
 #if defined (MAI_12)
 
 #undef DBG
-#define DBG if(1)
+#define DBG if(0)
 
 
 EventGroupHandle_t archive_event;

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

@@ -50,7 +50,7 @@ uint16_t mb_init_ai_params(uint16_t i)
     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].set = mb_set_ai_current_mode;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -139,7 +139,7 @@ uint16_t mb_init_ai_params(uint16_t i)
     }
     
     addr = 0x036C;
-    // V_ISO_CL, V_ISO, CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R
+    //CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R
     for (int i = 0; i < AI_ADD_NUMBER; i++)
     {
         mb_param[index].reg = addr + i;
@@ -300,6 +300,18 @@ mb_delay_action_t mb_set_ai_voltage_mode(void)
 }
 
 
+// Диапазон зимерения тока.
+mb_delay_action_t mb_set_ai_current_mode(void)
+{
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        settings.ai[i].current_mode = (uint8_t)((settings.ai_current_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

@@ -30,6 +30,9 @@ 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_current_mode(void);
+
 //
 mb_delay_action_t mb_set_ai_gain(void);
 

+ 1 - 1
fw/modules/settings/settings_ai.c

@@ -55,7 +55,7 @@ void settings_ai_def(settings_t *settings)
     settings->ai[10].name = AN_INP_11;
     settings->ai[11].name = AN_INP_12;
 
-    // Дополнительные 4 канала. Измерения происходят всегда.
+    // Дополнительные 2 канала. Измерения происходят всегда.
     for (int i = 0; i < AI_ADD_NUMBER; i++) 
     {  
         settings->ai_add[i].state = 1;  // вход включен

+ 57 - 0
fw/modules/testing/sin_data.h

@@ -0,0 +1,57 @@
+#ifndef __SIN_DATA_H
+#define __SIN_DATA_H
+
+/*
+float sin[] = 
+{
+0,
+0.017452,
+0.034899,
+0.052336,
+0.069756,
+0.087156,
+0.104528,
+0.121869,
+0.139173,
+0.156434,
+0.173648,
+0.190809,
+0.207912,
+0.224951,
+0.241922,
+0.258819,
+0.275637,
+0.292372,
+0.309017,
+0.325568,
+0.34202,
+0.358368,
+0.374607,
+0.390731,
+0.406737,
+0.422618,
+0.438371,
+0.45399,
+0.469472,
+0.48481,
+0.5,
+0.515038,
+0.529919,
+0.544639,
+0.559193,
+0.573576,
+0.587785,
+0.601815
+0.615661,
+0.62932,
+0.642788,
+0.656059,
+0.669131,
+0.681998,
+0.694658,
+0.707107
+};
+*/
+
+#endif  // __SIN_DATA_H
+

+ 69 - 4
fw/modules/testing/soft_test.c

@@ -5,13 +5,81 @@
 #include "digital_input.h"
 #include "mux.h"
 #include <stdio.h>
+#include <math.h>
 
+float sin_signal;
+int sin_input = 0;
 
+
+
+//
+void test_tim_init(void)
+{
+    crm_clocks_freq_type crm_clocks_freq_struct = {0};
+    
+    crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
+
+    crm_clocks_freq_get(&crm_clocks_freq_struct);
+    tmr_base_init(TMR3, 999, (crm_clocks_freq_struct.ahb_freq / 10000) - 1);
+    tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);
+        
+    tmr_flag_clear(TMR3, TMR_OVF_FLAG);
+
+    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
+    nvic_irq_enable(TMR3_GLOBAL_IRQn, 5, 0);
+       
+    tmr_counter_enable(TMR3, TRUE);
+    
+    tmr_interrupt_enable(TMR3, TMR_OVF_INT, TRUE);
+}
+
+
+//
+void test_sin_input(void)
+{
+    sin_input++;
+    
+    if (sin_input == 361)
+        sin_input = 0;
+}
+
+
+void TMR3_GLOBAL_IRQHandler(void)
+{
+    if (tmr_flag_get(TMR3, TMR_OVF_FLAG) != RESET)
+    {
+        tmr_flag_clear(TMR3, TMR_OVF_FLAG);
+        
+        test_sin_input();
+        sin_signal = 10*(sin(0.0174533*sin_input) + 1);
+        //printf("%i, %f\r\n", sin_input, sin_signal);
+    }
+}
+
+
+//
+float test_get_signal(void)
+{
+    return sin_signal;
+}
+
+
+// Генерация тестовых сигналов
+void test_signal_task(void *argument)
+{
+    for (;;)
+    {
+        vTaskDelay(1000);
+        printf("Test signal task\r\n");
+    }
+}
+
+
+//
 void test_hw_task(void *argument)
 {
     for (;;)
     {
-      
 #if 0      
         vTaskDelay(1000);
               
@@ -21,14 +89,11 @@ void test_hw_task(void *argument)
             printf("Channel: %u, state = %u\r\n", i + 1, di_get(i));
         }
 #endif
-
         
 #if 1      
         vTaskDelay(100);
-        
         mux_led_blink();
 #endif
-
         //adc_test();
     }
 }

+ 9 - 0
fw/modules/testing/soft_test.h

@@ -2,6 +2,15 @@
 #define __SOFT_TEST_H
 
 
+//
+void test_tim_init(void);
+
+//
+float test_get_signal(void);
+
+//
+void test_signal_task(void *argument);
+
 //
 void test_hw_task(void *argument);
   

+ 5 - 1
fw/user/main.cpp

@@ -144,6 +144,7 @@ void init_task(void *argument)
 #if defined (MAI_12)    
     
     factors_load(&ai_factors);
+    preset_init();
     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);
@@ -244,7 +245,10 @@ void init_task(void *argument)
     
 // -------------------------------------------------------------------------- //        
 // Тесты
-
+    
+    test_tim_init();
+    //xTaskCreate(test_signal_task, "signal_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+        
     //usb_eth_init();
     //sys_clear();
     //mux_led_test_init();

二進制
output/fw.bin


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


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


+ 86 - 31
tools/analog_in.py

@@ -52,6 +52,18 @@ class IO_AnalogInput(IO_Module):
         return format(data[0], '012b')
 
     
+    def get_voltage_range(self):
+        'Диапазон измерения напряжения'
+        data = self.modbus.read_holding_registers(AiReg.IN_VOL_RANGE.value, 1)
+        return format(data[0], '012b')
+    
+
+    def get_current_range(self):
+        'Диапазон измерения напряжения'
+        data = self.modbus.read_holding_registers(AiReg.IN_CUR_RANGE.value, 1)
+        return format(data[0], '012b')    
+
+
     def get_inputs_alarm(self):
         'Аварии аналоговых входов (битовое поле)'
         data = self.modbus.read_holding_registers(AiReg.IN_FAILURE.value, 1)
@@ -117,9 +129,7 @@ class IO_AnalogInput(IO_Module):
 
     def get_presets_min(self):
         'Минимальное значение уставок по всем каналам'
-        data = []
-        for i in range(12):
-            data.append(self.modbus.read_float_holding(AiReg.PR_MIN.value + i*2))
+        data = struct.unpack('>ffffffffffff', self.modbus.read_holding_registers_raw(AiReg.PR_MIN.value, 24))
         return data
 
 
@@ -130,11 +140,9 @@ class IO_AnalogInput(IO_Module):
 
     def get_presets_max(self):
         'Максимальное значение уставок по все каналам'
-        data = []
-        for i in range(12):
-            data.append(self.modbus.read_float_holding(AiReg.PR_MAX.value + i*2))
+        data = struct.unpack('>ffffffffffff', self.modbus.read_holding_registers_raw(AiReg.PR_MAX.value, 24))
         return data
-    
+     
 
     def get_preset_hist(self, channel):
         'Значение гистерезиса уставки'
@@ -163,6 +171,16 @@ class IO_AnalogInput(IO_Module):
         self.modbus.write_holding_register(AiReg.IN_STATE.value, val)
 
 
+    def set_voltage_range(self, val):
+        'Диапазон измерения напряжения (0 - диапазон 0 - 10 В, 1 - диапазон 0 - 1 В (битовое поле))'
+        self.modbus.write_holding_register(AiReg.IN_VOL_RANGE.value, val)
+
+
+    def set_current_range(self, val):
+        'Диапазон измерения тока (0 - диапазон 2- 20 мА, 1 - диапазон 0 - 20 мА (битовое поле))'
+        self.modbus.write_holding_register(AiReg.IN_CUR_RANGE.value, val)
+
+
     def set_ext_sens_power(self, val):
         'Состояние питания внешних датчиков (вкл./выкл.)'
         self.modbus.write_holding_register(AiReg.EXT_SENS_POWER.value , val)
@@ -188,9 +206,17 @@ class IO_AnalogInput(IO_Module):
         self.modbus.write_float(AiReg.IN_B_FACTOR.value + 2*(channel - 1), value)
 
 
-    def set_presets_state(self, val):
+    def set_presets_state(self, value):
         'Значения состояний входов вкл./выкл. (битовое поле)'
-        self.modbus.write_holding_register(AiReg.PR_STATE.value , val)
+        self.modbus.write_holding_register(AiReg.PR_STATE.value , value)
+
+    def set_preset_min(self, channel, value):
+        'Минимальное значение уставки на отдельный канал'
+        self.modbus.write_float(AiReg.PR_MIN.value + 2*(channel - 1), value)
+
+    def set_preset_max(self, channel, value):
+        'Максимальное значение уставки на отдельный канал'
+        self.modbus.write_float(AiReg.PR_MAX.value + 2*(channel - 1), value)
 
 
     '''Настройки входов'''
@@ -199,15 +225,41 @@ class IO_AnalogInput(IO_Module):
         print(Fore.GREEN + 'Analog inputs settings:')
 
         # Значения состояний входов вкл./выкл. (битовое поле)
-        print('Inputs state [bit field] :', Fore.GREEN + self.get_inputs_state())
+        print('Inputs state [bit field]         :', Fore.GREEN + self.get_inputs_state())
 
         # Режим измерения входов напряжение или ток. (битовое поле)
-        print('Inputs mode [bit field]  :', Fore.GREEN + self.get_inputs_mode())
+        print('Inputs mode [bit field]          :', Fore.GREEN + self.get_inputs_mode())
+
+        # Диапазон измерения напряжения (битовое поле)
+        print('Inputs voltage range [bit field] :', Fore.GREEN + self.get_voltage_range())
+
+        # Диапазон измерения тока (битовое поле)
+        print('Inputs current range [bit field] :', Fore.GREEN + self.get_current_range())
+
+        # Уставки
+        print('Inputs presets [bit field]       :', Fore.GREEN + self.get_presets_state())
+
+        # Нижнее значение уставки
+        data = self.get_presets_min()
+        print('Inputs preset min: ', Fore.GREEN + f'1: {data[0]}, 2: {data[0]}, 3: {data[0]}, 4: {data[0]}, 5: {data[0]}, 6: {data[0]}')
+        print('Inputs preset min: ', Fore.GREEN + f'7: {data[0]}, 8: {data[0]}, 9: {data[0]}, 10: {data[0]}, 11: {data[0]}, 12: {data[0]}')
+
+        # Верхнее значение уставок
+        data = self.get_presets_max()
+        print('Inputs preset max: ', Fore.GREEN + f'1: {data[0]}, 2: {data[0]}, 3: {data[0]}, 4: {data[0]}, 5: {data[0]}, 6: {data[0]}')
+        print('Inputs preset max: ', Fore.GREEN + f'7: {data[0]}, 8: {data[0]}, 9: {data[0]}, 10: {data[0]}, 11: {data[0]}, 12: {data[0]}')
+
+
+
+        # Гистерезис
+
+
 
         # Коэффициенты усиления
-        for i in range(1, 13):
-            print(f'Gain factor channel {i}    : ', end='')
-            print(Fore.GREEN + str(self.get_input_gain(i)))
+        # for i in range(1, 13):
+        #     print(f'Gain factor channel {i}    : ', end='')
+        #     print(Fore.GREEN + str(self.get_input_gain(i)))
+
 
     '''Вывод параметров. Сырые данные 16 входов'''
     def print_raw_inputs(self):
@@ -266,6 +318,24 @@ def main():
 
     '''Режим работы аналоговых входов'''
     # ai.print_inputs()
+    # ai.set_presets_state(0b00_0000_0000)
+
+    # ai.show_graph(ai.get_fil_inputs, 'AIN_FIL_1')
+
+    '''Уставки'''
+    
+
+    '''Данные входов'''
+    # while True:
+    #     print(ai.get_fil_inputs())
+    #     sleep(1)
+
+    # ai.set_voltage_range(0b00_0000_0000)
+    # ai.set_current_range(0b00_0000_0000)
+
+    # ai.print_inputs()
+
+    # ai.sys.save_settings()
 
     '''Установка коэффициентов усиления. Канал, коэффициент'''
     '''
@@ -281,23 +351,6 @@ def main():
     #     ai.set_k_factor(i, 1.0)
     #     ai.set_b_factor(i, 0.0)
 
-    '''Последовательное включение входов по одному.'''
-    '''
-    while True:
-        for i in range(12):
-            ai.set_inputs_state(1 << i)        
-            print(ai.get_inputs_state())
-            sleep(1)
-    '''            
-    '''Настройка режима измерения'''
-    '''
-    while True:
-        for i in range(12):
-            ai.set_inputs_mode(1 << i)
-            print(ai.get_inputs_mode())
-            sleep(1)
-    '''
-
     # ai.sys.set_system_vars(1234)
     # ai.sys.get_system_vars()
     # print(ai.sys.get_bat_votage())
@@ -332,12 +385,14 @@ def main():
     #     sleep(1)
 
     '''Данные каналов'''
+    """
     while True:
         # ai.get_raw_inputs()
         ai.get_fil_inputs()
         # ai.print_raw_inputs()
         # ai.print_filtered_inputs()
         sleep(0.1)
+    """
 
     # ai.get_raw_inputs()
     # ai.print_raw_inputs()

+ 1 - 1
tools/sys_params.py

@@ -104,7 +104,7 @@ class IO_SysParams:
         print("Save system settings...")
         self.modbus.write_holding_register(SysReg.SAVE_SYS.value, self.SAVE_SYS_SETTINGS)
 
-    def save_sattings(self):
+    def save_settings(self):
         self.modbus.write_holding_register(SysReg.COMMAND.value, self.SAVE_SETTIGNS)
 
     def get_uptime(self):

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