Browse Source

Аналоговые выходы. Режимы работают.

TelenkovDmitry 6 months ago
parent
commit
976d864036

+ 1 - 3
fw/modules/adc/adc_transport.c

@@ -218,10 +218,8 @@ bool adc_init(void)
         if (ret == 1)
             break;
         vTaskDelay(10);
-        
     }
-    
-    
+    return true;
 }
 
 #if 0

+ 4 - 1
fw/modules/dac/dac_transport.c

@@ -118,7 +118,9 @@ void dac_cs(DAC_CHANNEL ch, bool state)
     }
 }
 
+
 //
+#if 0
 void dac_task(void *params)
 {
     for (;;)
@@ -139,4 +141,5 @@ void dac_task(void *params)
         dac_test(CH_DAC_3, 0xFFFF);  
         dac_test(CH_DAC_4, 0xFFFF); 
     }
-}
+}
+#endif

+ 0 - 2
fw/modules/dac/dac_transport.h

@@ -21,8 +21,6 @@ void dac_test(DAC_CHANNEL ch, uint16_t val);
 //
 void dac_cs(DAC_CHANNEL ch, bool state);
 
-//
-void dac_task(void *params);
 
 
 #endif  // __DAC_TRANSPORT_H

+ 71 - 1
fw/modules/io/analog_output.c

@@ -5,7 +5,7 @@
 #include "FreeRTOS.h"
 #include "task.h"
 #include "settings_api.h"
-#include "ms5192t.h"
+#include "dac_transport.h"
 #include "monitoring.h"
 #include "mux.h"
 #include <stdio.h>
@@ -16,6 +16,76 @@
 #if defined (MAO_4)
 
 
+uint16_t ao_mode;   // режим работы аналоговый
+
+uint16_t ao_power;  // слово состояния питания выходных каналов
+
+
+led_t ao_output_led[4] = {OUT_1_G, OUT_2_G, OUT_3_G, OUT_4_G};
+
+
+
+//
+void ao_init(void)
+{
+    // Зеленые LED сигнализируют (вкл/выкл) входов.
+    ao_led_update();    
+    
+    // Сдвиговые регистры
+    sh_init();
+    
+    // Внешний DAC
+    dac_init();
+}
+
+// Управление LED для выходов
+void ao_led_update(void)
+{
+    for (int i = 0; i < AO_NUMBER; i++) 
+    {
+        if (settings.ao[i].state)
+            leds[ao_output_led[i]].state = LED_ON;
+        else
+            leds[ao_output_led[i]].state = LED_OFF;
+    }
+}
+
+// 
+void ao_set(void)
+{
+    for (int i = 0; i < AO_NUMBER; i++) 
+    {
+        if (((settings.ao_state_bits >> i) & 1) != settings.ao[i].state)
+        {
+            settings.ao[i].state = ((settings.ao_state_bits >> i) & 1);
+            if (settings.ao[i].state == 0) {
+                leds[ao_output_led[i]].state = LED_OFF;
+            }
+            else {
+                leds[ao_output_led[i]].state = LED_ON;
+            }
+        }
+    }
+}
+
+// 
+void dac_task(void *params)
+{
+    for (;;)
+    {
+      
+        ao_mode = 0x01;
+        ao_power = sh_ao_mode(ao_mode);
+        //printf("AO_Power: %u\r\n", ao_power);
+        vTaskDelay(100);
+#if 0        
+        ai_alarm = sh_ai_mode(ai_mode);
+        ai_processing();
+        ai_leds_processing();
+        vTaskDelay(10);
+#endif        
+    }
+}
 
 
 #endif

+ 20 - 0
fw/modules/io/analog_output.h

@@ -4,6 +4,26 @@
 #include <stdbool.h>
 
 
+typedef struct
+{
+    uint8_t state;          // 0 - выкл, 1 - вкл
+    uint8_t mode;           // режим выхода (0 - напряжение, 1 - ток)
+    
+} ao_t;
+
+
+//
+void ao_init(void);
+
+//
+void ao_led_update(void);
+
+// 
+void ao_set(void);
+
+// 
+void dac_task(void *params);
+
 
 #endif  // __ANALOG_OUTPUT_H
 

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

@@ -7,19 +7,19 @@
 // -------------------------------------------------------------------------- //
 // Дискретые входы
 
-#define DI_NUMBER       8   // Количество входов
+#define DI_NUMBER           8   // Количество входов
 
-#define DI_MODE_IN      0   // Режим обычного входа
+#define DI_MODE_IN          0   // Режим обычного входа
 
-#define DI_MODE_CNT     1   // Режим счетного входа
+#define DI_MODE_CNT         1   // Режим счетного входа
 
 
 // -------------------------------------------------------------------------- //
 // Дискретные выходы
 
-#define DO_NUMBER       8    // Количество выходов
+#define DO_NUMBER           8   // Количество выходов
 
-#define DEBOUNCE_CNT    50
+#define DEBOUNCE_CNT        50
 
 // -------------------------------------------------------------------------- //
 // Аналоговые входы. 
@@ -30,6 +30,11 @@
 
 #define AI_ADD_NUMBER       4   // Дополнительные 4 входа
 
+// -------------------------------------------------------------------------- //
+// Аналоговые выходы. 
+
+#define AO_NUMBER           4   // Количество выходов
+
 // -------------------------------------------------------------------------- //
 
 //

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

@@ -126,7 +126,7 @@ typedef enum
     OUT_2_G,
     OUT_2_R,
     
-    OUT_3_G = 0, 
+    OUT_3_G, 
     OUT_3_R,
     OUT_4_G,
     OUT_4_R,

+ 60 - 2
fw/modules/modbus/modbus_ao_params.c

@@ -1,12 +1,70 @@
 #include "at32f403a_407.h"
 #include "modbus_ao_params.h"
+#include "settings_api.h"
+#include "modbus_params.h"
+#include "analog_output.h"
+
 
 #if defined (MAO_4)
 
+
+extern mb_param_t mb_param[];
+
+
 //
-uint16_t mb_init_ao_params(void)
+uint16_t mb_init_ao_params(uint16_t i)
 {
-    return 0;
+    uint16_t index = i;
+    //uint16_t addr = 0;  
+  
+    // Статус выходов (вкл./выкл.)
+    mb_param[index].reg = 0x0400;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ao_state_bits;
+	mb_param[index].set = mb_set_ao_state;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Режим работы выходов
+    mb_param[index].reg = 0x0401;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ao_mode_bits;
+	mb_param[index].set = mb_set_ao_mode;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // ---------------------------------------------------------------------- //
+    
+    return index;
 }
 
+
+
+
+// -------------------------------------------------------------------------- //
+//                          Установка параметров
+// -------------------------------------------------------------------------- //
+
+//
+mb_delay_action_t mb_set_ao_state(void)
+{
+    ao_set();
+    return MB_NO_ACTION;
+}
+
+//
+mb_delay_action_t mb_set_ao_mode(void)
+{
+  
+#if 0  
+    ai_set_meas_mode();  
+#endif    
+    return MB_SAVE_SETTINGS;
+}
+
+
 #endif

+ 14 - 2
fw/modules/modbus/modbus_ao_params.h

@@ -13,8 +13,20 @@ extern "C" {
 
   
 //
-uint16_t mb_init_ao_params(void);
-  
+uint16_t mb_init_ao_params(uint16_t i);
+
+
+
+// -------------------------------------------------------------------------- //
+//                          Установка параметров
+// -------------------------------------------------------------------------- //
+
+//
+mb_delay_action_t mb_set_ao_state(void);
+
+//
+mb_delay_action_t mb_set_ao_mode(void);
+
 
 
 #ifdef __cplusplus

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

@@ -1,6 +1,8 @@
 #include "at32f403a_407.h"
 #include "modbus_params.h"
 #include "modbus_dio_params.h"
+#include "modbus_ai_params.h"
+#include "modbus_ao_params.h"
 #include "io.h"
 #include "uptime.h"
 #include "rtc.h"
@@ -66,7 +68,7 @@ void mb_init_params(void)
 #endif    
     
 #if defined (MAO_4)
-    index = mb_init_ao_params();
+    index = mb_init_ao_params(0);
 #endif    
     
     // ---------------------------------------------------------------------- //

+ 18 - 0
fw/modules/settings/settings_ao.c

@@ -8,7 +8,25 @@
 //
 void settings_ao_set_all_default(void)
 {
+    // Аналоговые выходы
+    settings_ao_def(&settings);
+}
 
+//
+void settings_ao_def(settings_t *settings)
+{
+    // Все выходы выключены
+    settings->ao_state_bits = 0;
+ 
+    // Режим напряжения
+    settings->ao_mode_bits = 0;
+    
+    for (int i = 0; i < AO_NUMBER; i++)
+    {
+        settings->ao[i].state = 0;  // выход выключен
+        settings->ao[i].mode = 0;   // режим выхода - напряжение
+    }
 }
 
+
 #endif

+ 3 - 0
fw/modules/settings/settings_ao.h

@@ -5,6 +5,9 @@
 //
 void settings_ao_set_all_default(void);
 
+//
+void settings_ao_def(settings_t *settings);
+
 
 #endif /* #ifndef SETTINGS_AO_API_H */
 

+ 6 - 0
fw/modules/settings/settings_api.h

@@ -10,6 +10,7 @@
 #include "mbport.h"
 #include "log.h"
 #include "analog_input.h"
+#include "analog_output.h"
 #include <stdbool.h>
 
 
@@ -128,6 +129,11 @@ typedef struct
 #endif    
 
 #if defined (MAO_4)    
+ 
+    ao_t        ao[AO_NUMBER];      // 
+    
+    uint16_t    ao_state_bits;      // статус выхода, 0 - выкл, 1 - вкл
+    uint16_t    ao_mode_bits;       // режим работы выходов, 0 - напряжения, 1 - ток
     
 #endif    
     

+ 33 - 0
fw/modules/shift_reg/shift_reg.c

@@ -56,6 +56,8 @@ void sh_init(void)
     gpio_initstructure.gpio_pull           = GPIO_PULL_NONE;  
     gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;  
     gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
+    
+#if defined (MAI_12)        
     gpio_initstructure.gpio_pins           = GPIO_PINS_0 | GPIO_PINS_1;
     gpio_init(GPIOD, &gpio_initstructure); 
     
@@ -64,6 +66,16 @@ void sh_init(void)
     gpio_init(GPIOD, &gpio_initstructure); 
         
     gpio_bits_reset(GPIOD, GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_3);
+#endif
+    
+#if defined (MAO_4)
+    // CS для сдвиговых регистров U860, U861
+    gpio_initstructure.gpio_pins           = GPIO_PINS_11;
+    gpio_init(GPIOC, &gpio_initstructure); 
+        
+    gpio_bits_reset(GPIOC, GPIO_PINS_11);
+    
+#endif     
     
     crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
     
@@ -139,6 +151,27 @@ uint16_t sh_ai_mode(uint16_t val)
     return ret;    
 }
 
+//
+uint16_t sh_ao_mode(uint16_t val)
+{
+    uint16_t ret = 0;
+    
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    SH_SPI->dt = val;
+    
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
+    ret = (uint16_t)SH_SPI->dt & 0x0F;
+      
+    
+    gpio_bits_set(GPIOC, GPIO_PINS_11);
+    nop(5);
+    gpio_bits_reset(GPIOC, GPIO_PINS_11);
+    nop(5);
+    
+    return ret;
+}
+
+
 // Подключает выбранный канал к АЦП
 void sh_ai_connect(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_ao_mode(uint16_t val);
+
 //
 void sh_ai_connect(uint16_t val);
 

+ 3 - 2
fw/user/main.cpp

@@ -31,6 +31,7 @@ extern "C" {
 #include "adc_transport.h"
 #include "shift_reg.h"
 #include "analog_input.h"
+#include "analog_output.h"
 #include "dac_transport.h"
 #include "log.h"
 #include "swap.h"
@@ -145,7 +146,7 @@ void init_task(void *argument)
     
 #if defined (MAO_4)    
     
-    dac_init();
+    ao_init();
     xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
 #endif 
@@ -266,7 +267,7 @@ void init_task(void *argument)
     dac_test(CH_DAC_4, 10000);  
 */  
     
-#if 1
+#if 0
     // Настройки по умолчанию 
     settings_set_all_default();
     settings_save(&settings);

BIN
output/fw.bin


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


File diff suppressed because it is too large
+ 644 - 654
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>MAI_12</state>
+                    <state>MAO_4</state>
                 </option>
                 <option>
                     <name>CCPreprocFile</name>

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


+ 1 - 1
tools/analog_in.py

@@ -203,7 +203,7 @@ def main():
     # print(ai.get_inputs_mode())
 
     '''Питание внешних датчиков'''
-    # ai.set_ext_sens_power(1)
+    ai.set_ext_sens_power(0)
 
     '''Аварии аналоговых входов'''
     # for i in range(100):

+ 34 - 3
tools/analog_out.py

@@ -14,16 +14,47 @@ class IO_AnalogOutput(IO_Module):
         self.modbus = modbus
         super().__init__(self.modbus)
 
+    '''Чтение параметров'''
+
+    # Значения состояний выходов вкл./выкл. (битовое поле)
+    def get_outputs_state(self):
+        data = self.modbus.read_holding_registers(AO_REGS['aout_state'], 1)
+        return format(data[0], '04b')
+
+    # Режим аналоговых выходов (0 - напряжение или 1 - ток. (битовое поле))
+    def get_outputs_mode(self):
+        data = self.modbus.read_holding_registers(AO_REGS['aout_mode'], 1)
+        return format(data[0], '04b')
+
+    '''Установка параметров'''
+
+    def set_outputs_state(self, val):
+        self.modbus.write_holding_register(AO_REGS['aout_state'], val)
+
+    def set_inputs_mode(self, val):
+        self.modbus.write_holding_register(AO_REGS['aout_mode'], val)
+
 
 
 def main():
     colorama.init(autoreset=True)
-    serial_port = Serial('COM22', 115200, timeout=0.05, parity='N', xonxoff=False)
-    ao_modbus = Modbus(serial_port, 1)
+    serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
+    ao_modbus = Modbus(serial_port, 8)
     ao = IO_AnalogOutput(ao_modbus)
 
     '''Тесты отдельного модуля аналоговых выходов'''
-    # ao.sys.get_system_vars()
+    ao.sys.get_system_vars()
+
+    '''Чтение параметров'''
+    print(ao.get_outputs_state())
+    print(ao.get_outputs_state())
+
+    '''Установка параметров'''
+    # ao.set_outputs_state(0b1111)
+
+    '''Сохранение настроек'''
+    ao.sys.save_sattings()
+    # ai.sys.save_sattings()
 
     '''Обновление прошивки'''
     # ao_modbus.MB_DEBUG = True

+ 1 - 1
tools/mb_registers.py

@@ -13,6 +13,6 @@ DIO_REGS = {'in_bits': 0x0100, 'in_cnt': 0x0102,'in_mode': 0x0120, 'in_norm': 0x
 AI_REGS = {'ain_state': 0x0300, 'ain_mode': 0x0301, 'ain_alarm': 0x0302, 'esens_pow': 0x0303, 
            'ain_gain': 0x0310, 'ain_raw': 0x0320, 'ain_fil': 0x0330}
 
-AO_REGS = {}
+AO_REGS = {'aout_state': 0x0400, 'aout_mode': 0x0401}
 
 LOG_REGS = {'log_info': 0x0900, 'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903, 'arch_per': 0x0904}

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