Explorar o código

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

TelenkovDmitry hai 6 meses
pai
achega
ad643951e5

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

@@ -16,6 +16,8 @@
 
 #if defined (MAI_12)  
 
+//uint16_t ai_state_bit;
+
 uint8_t ai_mux;     // выход сдвигового регистра U1010 (управляет MUX 301, 401)
                     // мультиплексоры отвечат за коммутацию аналоговых входов и АЦП
 
@@ -40,6 +42,7 @@ led_t ai_alarm_led[12] = {IO_1_R, IO_2_R, IO_3_R, IO_4_R,
                           IO_9_R, IO_10_R, IO_11_R, IO_12_R};
 
 
+
 //
 void ai_init(void)
 {
@@ -52,6 +55,7 @@ void ai_init(void)
 // Установить режим измерения каналов с 1 по 12.
 void ai_set_meas_mode(void)
 {
+#if 0  
     for (uint8_t i = 1; i < 13; i++)
     {
         if (settings.ai_mode_bits & (1 << (i - 1)))
@@ -59,6 +63,12 @@ void ai_set_meas_mode(void)
         else
             ai_set_mode_word((MEAS_CHAN_MODE_t)0, i);
     }
+#endif
+    for (int i = 0; i < AI_NUMBER; i++)
+    {
+        if (settings.ai[i].mode)
+            ai_set_mode_word((MEAS_CHAN_MODE_t)1, i);
+    }
 }   
 
 // Настройка внешнего ADC
@@ -254,6 +264,35 @@ void ai_connect_channel(uint8_t channel)
     //print_binary_byte(ai_mux);
 }
 
+// 
+void ai_set(void)
+{
+    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) 
+        {
+            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;
+            }
+            else
+            {
+                di_state_bit &= ~(1 << i);
+            }
+        }
+    }
+#endif
+}
+
 // Утсновить режим измерения канала (ток или напряжение)
 void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel)
 {
@@ -279,6 +318,7 @@ void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel)
 // Формируем слово режима работы каналов (ai_mode)
 void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel)
 {
+#if 0  
     if (mode == MEAS_CURRENT) 
     {
         if (channel < 7)
@@ -291,6 +331,19 @@ void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel)
             ai_mode &= ~(1 << (channel - 1));
         else
             ai_mode &= ~(1 << (channel + 1));
+#endif
+    if (mode == MEAS_CURRENT) 
+    {
+        if (channel < 7)
+            ai_mode |= (1 << channel);
+        else
+            ai_mode |= (1 << channel);
+    }
+    else
+        if (channel < 7)
+            ai_mode &= ~(1 << channel);
+        else
+            ai_mode &= ~(1 << channel);
 }
 
 // Сигнал питания внешних датчиков
@@ -306,6 +359,14 @@ void ai_ext_sens_power(uint16_t state)
 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++) {

+ 7 - 0
fw/modules/io/analog_input.h

@@ -4,6 +4,13 @@
 #include <stdbool.h>
 
 
+typedef struct
+{
+    uint8_t state;          // 0 - выкл, 1 - вкл
+    uint8_t mode;           // режим измерения (0 - напряжение, 1 - ток)
+    uint8_t gain_factor;    // коэффициент усиления
+    
+} ai_t;
 
 
 // Режим измерения (ток или напряжение)

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

@@ -15,6 +15,16 @@ uint16_t mb_init_ai_params(uint16_t i)
     uint16_t index = i;
     uint16_t addr = 0;  
   
+    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].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+#if 0    
     mb_param[index].reg = 0x0300;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ai_mode_bits;
@@ -188,7 +198,7 @@ uint16_t mb_init_ai_params(uint16_t i)
     mb_param[index].check_handler = mb_check_dummy;
     
     index++;
-    
+#endif    
     return index;
 }
 

+ 13 - 0
fw/modules/settings/settings_ai.c

@@ -18,7 +18,20 @@ 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++)
+    {  
+        settings->ai[i].state = 0;  // вход выключен
+        settings->ai[i].mode = 0;   // режим измерения напряжения
+        settings->ai[i].gain_factor = 1;    // коэф-т усиления внешнего ADC
+    }
 }
 
 //

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

@@ -9,6 +9,7 @@
 #include "mb.h"
 #include "mbport.h"
 #include "log.h"
+#include "analog_input.h"
 #include <stdbool.h>
 
 
@@ -118,7 +119,9 @@ typedef struct
 #endif
 
 #if defined (MAI_12)
-    uint16_t    ai_mode_bits;       // режим работы входов, 0 - зимерение напряжения, 1 - тока
+    ai_t        ai[AI_NUMBER];
+    //uint16_t    ai_state_bits;      // статус входа, 0 - выкл, 1 - вкл
+    //uint16_t    ai_mode_bits;       // режим работы входов, 0 - измерение напряжения, 1 - тока
     uint16_t    ext_sens_power;     // питание внешних датчиков, 0 - выкл, 1 - вкл
 #endif    
 

+ 1 - 1
fw/user/main.cpp

@@ -104,7 +104,7 @@ void init_task(void *argument)
     // Настройки параметров порта Modbus
     settings_set_modbus_params(settings.com_settings.mb_port);
     
-#if 0
+#if 1
 // Только для теста    
     settings_set_all_default();
     settings_save(&settings);

BIN=BIN
output/fw.bin


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 521 - 546
project/ewarm/iap/iap.dep


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 738 - 756
project/ewarm/module_universal_io.dep


+ 1 - 1
project/ewarm/module_universal_io.ewp

@@ -225,7 +225,7 @@
                     <state>AT_START_F403A_V1</state>
                     <state>PRINTF_STDLIB</state>
                     <state>DEBUG</state>
-                    <state>MAO_4</state>
+                    <state>MAI_12</state>
                 </option>
                 <option>
                     <name>CCPreprocFile</name>

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


+ 12 - 1
tools/analog_in.py

@@ -35,6 +35,11 @@ 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')
+
     def get_inputs_mode(self):
         data = self.modbus.read_holding_registers(AI_REGS['ain_mode'], 1)
         return format(data[0], '012b')
@@ -49,6 +54,9 @@ class IO_AnalogInput(IO_Module):
 
     '''Установка параметров'''
 
+    def set_inputs_state(self, val):
+        self.modbus.write_holding_register(AI_REGS['ain_state'], val)
+
     def set_inputs_mode(self, val):
         self.modbus.write_holding_register(AI_REGS['ain_mode'], val)
 
@@ -104,6 +112,9 @@ def main():
     ai = IO_AnalogInput(modbus_tester) 
 
     '''Режим работы аналоговых входов'''
+    print(ai.get_inputs_state())
+    ai.set_inputs_state(0b10)
+    print(ai.get_inputs_state())
     # print(ai.get_inputs_mode())
     # ai.set_inputs_mode(0b00001)
     # print(ai.get_inputs_mode())
@@ -121,7 +132,7 @@ def main():
 
     # ai.show_graph('AIN_2')
 
-    print(ai.sys.get_system_vars())
+    # print(ai.sys.get_system_vars())
 
 
 if __name__ == '__main__':

+ 2 - 1
tools/mb_registers.py

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

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio