Browse Source

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

TelenkovDmitry 1 năm trước cách đây
mục cha
commit
5f887e4782

+ 19 - 0
fw/modules/io/io.c

@@ -5,6 +5,7 @@
 #include "input.h"
 #include "output.h"
 #include "settings_api.h"
+#include "io_utils.h"
 #include <stdio.h>
 
 
@@ -15,6 +16,10 @@ uint16_t input_state_bit;
 //uint16_t output_state[DO_NUMBER];     // состояние входа
 uint16_t output_state_bit;
 uint16_t output_mode_bit;
+uint16_t output_pwm[DO_NUMBER];
+uint16_t output_pwm_save[DO_NUMBER];
+uint16_t output_pwm_period[DO_NUMBER];
+uint16_t output_pwm_period_save[DO_NUMBER];
 
 // -------------------------------------------------------------------------- //
 // Текущие параметры
@@ -57,6 +62,20 @@ void io_init(void)
     
     for (int i = 0; i < DO_NUMBER; i++)
     {
+        output_pwm[i] = settings.do_pwm[i];
+        output_pwm_save[i] = settings.do_pwm_save[i];
+        output_pwm_period[i] = settings.do_pwm_period[i];
+        output_pwm_period_save[i] = settings.do_pwm_period_save[i];
+
+        if (get_save_mode()) {
+            outputs[i].pwm_duty = settings.do_pwm_save[i];
+            outputs[i].pwm_period = settings.do_pwm_period_save[i];
+        }
+        else {
+            outputs[i].pwm_duty = settings.do_pwm[i];
+            outputs[i].pwm_period = settings.do_pwm_period[i];
+        }
+        
         out_gpio_init(&outputs[i], i);
         load_sens_init(&load_sens[i]);
     }

+ 6 - 0
fw/modules/io/io.h

@@ -67,6 +67,8 @@ typedef struct
     uint16_t pwm_period_cnt;
     uint16_t pwm_duty_cnt;
     uint16_t pwm_flag;
+    uint16_t pwm_period;
+    uint16_t pwm_duty;
     
 } out_t;
 
@@ -83,6 +85,10 @@ extern uint32_t input_cnt[DI_NUMBER];       // счетчики входов
 
 extern uint16_t output_state_bit;
 extern uint16_t output_mode_bit;
+extern uint16_t output_pwm[];
+extern uint16_t output_pwm_save[];
+extern uint16_t output_pwm_period[];
+extern uint16_t output_pwm_period_save[];
 
 //uint16_t output_state[DI_NUMBER];    // состояние выхода, 0 - норма, 1 - обрыв, 2 - КЗ
 

+ 73 - 34
fw/modules/io/output.c

@@ -8,14 +8,14 @@
 
 
 out_t outputs[DO_NUMBER] = {
-    {GPIOC, GPIO_PINS_12, 0, 0, 0, false},   // -
-    {GPIOD, GPIO_PINS_2,  0, 0, 0, false},   // -
-    {GPIOE, GPIO_PINS_6,  0, 0, 0, false},   // TMR9_CH2 (remap)
-    {GPIOC, GPIO_PINS_1,  0, 0, 0, false},   // -
-    {GPIOC, GPIO_PINS_11, 0, 0, 0, false},   // -
-    {GPIOD, GPIO_PINS_3,  0, 0, 0, false},   // -
-    {GPIOE, GPIO_PINS_5,  0, 0, 0, false},   // TMR9_CH1 (remap)
-    {GPIOC, GPIO_PINS_2,  0, 0, 0, false}    // -
+    {GPIOC, GPIO_PINS_12, 0, 0, 0, false, 0, 0},   // -
+    {GPIOD, GPIO_PINS_2,  0, 0, 0, false, 0, 0},   // -
+    {GPIOE, GPIO_PINS_6,  0, 0, 0, false, 0, 0},   // TMR9_CH2 (remap)
+    {GPIOC, GPIO_PINS_1,  0, 0, 0, false, 0, 0},   // -
+    {GPIOC, GPIO_PINS_11, 0, 0, 0, false, 0, 0},   // -
+    {GPIOD, GPIO_PINS_3,  0, 0, 0, false, 0, 0},   // -
+    {GPIOE, GPIO_PINS_5,  0, 0, 0, false, 0, 0},   // TMR9_CH1 (remap)
+    {GPIOC, GPIO_PINS_2,  0, 0, 0, false, 0, 0}    // -
 };
 
 
@@ -54,6 +54,45 @@ void out_gpio_init(out_t *out, uint8_t index)
     do_update(out, index) ;
 }
 
+//
+void do_set_common(void)
+{
+    bool flag = false;
+    
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        // 
+        if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) {
+            settings.do_bits = output_state_bit;
+            flag = true;
+        } 
+        else if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i))) {
+            settings.do_mode_bits ^= (1 << i);
+            settings.do_mode_bits = output_mode_bit;
+            flag = true;
+        }  
+        else if (settings.do_pwm[i] != output_pwm[i]) {
+            settings.do_pwm[i] = output_pwm[i];
+            flag = true;
+        }
+        else if (settings.do_pwm_save[i] != output_pwm_save[i]) {
+            settings.do_pwm_save[i] = output_pwm_save[i];
+            flag = true;
+        }
+        else if (settings.do_pwm_period [i] != output_pwm_period[i]) {
+            settings.do_pwm_period[i] = output_pwm_period[i];
+            flag = true;
+        }
+        else if (settings.do_pwm_period_save[i] != output_pwm_period_save[i]) {
+            settings.do_pwm_period_save[i] = output_pwm_period_save[i];
+            flag = true;
+        }
+ 
+        if (flag)
+            do_update(&outputs[i], i);
+    }
+}
+
 //
 void do_set(void)
 {
@@ -74,31 +113,24 @@ void do_set(void)
 }
 
 // Установка значения на выходе 
-void do_update(out_t *out, uint8_t index)
+void do_update(out_t *out, uint8_t i)
 {
     // Режим ШИМ
-    if (settings.do_mode_bits & (1 << index))   
-    {
+    if (settings.do_mode_bits & (1 << i)) {
         // Безопасный режим включен
-        if (get_save_mode()) {    
-            do_set_pwm(settings.do_pwm_save[index], index);
-        }
-        else {
-            do_set_pwm(settings.do_pwm[index], index);
-        }
+        if (get_save_mode())
+            do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
+        else
+            do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
     }
     // Режим обычного выхода
-    else    
-    {
+    else {
         out->mode = 0;
-
         // Безопасный режим включен
-        if (get_save_mode()) {    
-            do_set_out(out, settings.do_save_bits & (1 << index));
-        }
-        else {
-            do_set_out(out, settings.do_bits & (1 << index));
-        }
+        if (get_save_mode())
+            do_set_out(out, settings.do_save_bits & (1 << i));
+        else
+            do_set_out(out, settings.do_bits & (1 << i));
     }
 }
 
@@ -123,16 +155,21 @@ void do_set_mode(void)
 
 //#define PWM_PERIOD_TEST     20
 //#define PWM_DUTY_TEST       10
-void do_set_pwm(uint16_t pwm, uint8_t index)
+void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
 {
-    //outputs[index].pwm_duty_cnt = (uint16_t)(outputs[index].pwm_period_cnt*pwm/100.0);
-    //outputs[index].pwm_duty_cnt = (uint16_t)(PWM_PERIOD_TEST*pwm/100.0);
+    uint16_t duty_calc;
   
+    if (duty == 0)
+        duty_calc = 0;
+    else
+        duty_calc = (duty*period/100 < 1) ? 1 : duty*period/100;
+    
     outputs[index].pwm_flag = false;
     outputs[index].pwm_period_cnt = 0;
     outputs[index].pwm_duty_cnt = 0;
+    outputs[index].pwm_period = period;
+    outputs[index].pwm_duty = duty_calc;
     outputs[index].mode = 1;
-    
 }
 
 //
@@ -226,16 +263,18 @@ inline void pwm_proc(void)
     {
         if (outputs[i].mode)    // режим PWM
         {
-            if (outputs[i].pwm_period_cnt == PWM_PERIOD_TEST) {
+            if (outputs[i].pwm_period_cnt == outputs[i].pwm_period /*PWM_PERIOD_TEST*/) {
                 outputs[i].pwm_period_cnt = 0;
             }
             if (outputs[i].pwm_period_cnt == 0) {
                 outputs[i].pwm_flag = false;
-                gpio_bits_set(GPIOB, GPIO_PINS_15);
+                gpio_bits_set(outputs[i].port, outputs[i].pin);
+                //gpio_bits_set(GPIOB, GPIO_PINS_15);
             }
-            if (outputs[i].pwm_duty_cnt == PWM_DUTY_TEST) {
+            if (outputs[i].pwm_duty_cnt == outputs[i].pwm_duty /*PWM_DUTY_TEST*/) {
                 outputs[i].pwm_duty_cnt = 0;
-                gpio_bits_reset(GPIOB, GPIO_PINS_15);
+                gpio_bits_reset(outputs[i].port, outputs[i].pin);
+                //gpio_bits_reset(GPIOB, GPIO_PINS_15);
                 outputs[i].pwm_flag = true;
             }
             outputs[i].pwm_period_cnt++;

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

@@ -17,6 +17,9 @@ extern simple_gpio_t load_sens[];
 //
 void out_gpio_init(out_t *out, uint8_t index);
 
+//
+void do_set_common(void);
+
 //
 void do_set(void);
 
@@ -27,7 +30,7 @@ void do_update(out_t *out, uint8_t index);
 void do_set_mode(void);
 
 //
-void do_set_pwm(uint16_t pwm, uint8_t index);
+void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index);
 
 //
 void do_set_out(out_t *out, uint8_t val);

+ 11 - 10
fw/modules/modbus/modbus_params.c

@@ -106,7 +106,7 @@ void mb_init_params(void)
     mb_param[index].reg = 0x0203;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.do_save_bits;  
-	mb_param[index].set = NULL;
+	mb_param[index].set = mb_set_do;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -118,8 +118,8 @@ void mb_init_params(void)
     {
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&settings.do_pwm[i];  // Счетчик ипульсов
-        mb_param[index].set = NULL;
+        mb_param[index].param = (uint8_t*)&output_pwm[i];  // Счетчик ипульсов
+        mb_param[index].set = mb_set_do;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
         
@@ -133,8 +133,8 @@ void mb_init_params(void)
     {
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&settings.do_pwm_save[i];  // Счетчик ипульсов
-        mb_param[index].set = NULL;
+        mb_param[index].param = (uint8_t*)&output_pwm_save[i];  // Счетчик ипульсов
+        mb_param[index].set = mb_set_do;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
         
@@ -148,8 +148,8 @@ void mb_init_params(void)
     {
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&settings.do_pwm_per[i];  // Счетчик ипульсов
-        mb_param[index].set = NULL;
+        mb_param[index].param = (uint8_t*)&output_pwm_period[i];  // Счетчик ипульсов
+        mb_param[index].set = mb_set_do;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
         
@@ -163,8 +163,8 @@ void mb_init_params(void)
     {
         mb_param[index].reg = addr;
         mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&settings.do_pwm_per_save[i];  // Счетчик ипульсов
-        mb_param[index].set = NULL;
+        mb_param[index].param = (uint8_t*)&output_pwm_period_save[i];  // Счетчик ипульсов
+        mb_param[index].set = mb_set_do;
         mb_param[index].get = NULL;
         mb_param[index].check_handler = mb_check_dummy;
         
@@ -287,7 +287,8 @@ mb_delay_action_t mb_set_din_mode(void)
 //
 mb_delay_action_t mb_set_do(void)
 {
-    do_set();
+    //do_set();
+    do_set_common();
     return MB_NO_ACTION;
 }
 

+ 4 - 4
fw/modules/settings/settings_api.c

@@ -241,10 +241,10 @@ void settings_do_def(settings_t *settings)
     
     for (uint8_t i = 0; i < DO_NUMBER; i++)
     {
-        settings->do_pwm[i] = 50;
-        settings->do_pwm_save[i] = 50; // значение на выходах в бесопасном режиме работы
-        settings->do_pwm_per[i] = 10;
-        settings->do_pwm_per_save[i] = 10;
+        settings->do_pwm[i] = 30;
+        settings->do_pwm_save[i] = 30; // значение на выходах в бесопасном режиме работы
+        settings->do_pwm_period[i] = 50;
+        settings->do_pwm_period_save[i] = 50;
     }
 }
 

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

@@ -83,8 +83,8 @@ typedef struct
     uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
     uint16_t    do_pwm[DO_NUMBER];  // значение заполнения ШИМ
     uint16_t    do_pwm_save[DO_NUMBER]; // значение заполнения ШИМ в безопасном режиме
-    uint16_t    do_pwm_per[DO_NUMBER];  // период ШИМ в [0.1с (10..1000)]
-    uint16_t    do_pwm_per_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
+    uint16_t    do_pwm_period[DO_NUMBER];  // период ШИМ в [0.1с (10..1000)]
+    uint16_t    do_pwm_period_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
     
     bool        save_mode;          // безопасный режим, 0 - выкл, 1 - вкл
     

BIN
output/fw.bin


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 408 - 431
project/ewarm/iap/iap.dep


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 729 - 729
project/ewarm/module_universal_io.dep


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác