Prechádzať zdrojové kódy

PWM работает. Добавляю параметры в modbus.

TelenkovDmitry 1 rok pred
rodič
commit
fd10e4e09c

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

@@ -66,6 +66,7 @@ typedef struct
     uint16_t mode;  // 0 - обычный выход, 1 - режим ШИМ
     uint16_t pwm_period_cnt;
     uint16_t pwm_duty_cnt;
+    uint16_t pwm_flag;
     
 } out_t;
 

+ 32 - 21
fw/modules/io/output.c

@@ -8,14 +8,14 @@
 
 
 out_t outputs[DO_NUMBER] = {
-    {GPIOC, GPIO_PINS_12, 0, 0, 0},   // -
-    {GPIOD, GPIO_PINS_2,  0, 0, 0},   // -
-    {GPIOE, GPIO_PINS_6,  0, 0, 0},   // TMR9_CH2 (remap)
-    {GPIOC, GPIO_PINS_1,  0, 0, 0},   // -
-    {GPIOC, GPIO_PINS_11, 0, 0, 0},   // -
-    {GPIOD, GPIO_PINS_3,  0, 0, 0},   // -
-    {GPIOE, GPIO_PINS_5,  0, 0, 0},   // TMR9_CH1 (remap)
-    {GPIOC, GPIO_PINS_2,  0, 0, 0}    // -
+    {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}    // -
 };
 
 
@@ -90,6 +90,8 @@ void do_update(out_t *out, uint8_t index)
     // Режим обычного выхода
     else    
     {
+        out->mode = 0;
+
         // Безопасный режим включен
         if (get_save_mode()) {    
             do_set_out(out, settings.do_save_bits & (1 << index));
@@ -111,7 +113,7 @@ void do_set_mode(void)
     {
         if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i)))
         {
-            settings.do_mode_bits |= (1 << i);
+            settings.do_mode_bits ^= (1 << i);
             do_update(&outputs[i], i);
         }
     }
@@ -124,7 +126,11 @@ void do_set_mode(void)
 void do_set_pwm(uint16_t pwm, 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);
+    //outputs[index].pwm_duty_cnt = (uint16_t)(PWM_PERIOD_TEST*pwm/100.0);
+  
+    outputs[index].pwm_flag = false;
+    outputs[index].pwm_period_cnt = 0;
+    outputs[index].pwm_duty_cnt = 0;
     outputs[index].mode = 1;
     
 }
@@ -132,10 +138,14 @@ void do_set_pwm(uint16_t pwm, uint8_t index)
 //
 void do_set_out(out_t *out, uint8_t val)
 {
-    if (val)
+    if (val) {
+        gpio_bits_set(GPIOB, GPIO_PINS_15);
         gpio_bits_set(out->port, out->pin);
-    else
+    }
+    else {
+        gpio_bits_reset(GPIOB, GPIO_PINS_15);
         gpio_bits_reset(out->port, out->pin);
+    }
 }
 
 //
@@ -216,23 +226,24 @@ inline void pwm_proc(void)
     {
         if (outputs[i].mode)    // режим PWM
         {
-            outputs[i].pwm_period_cnt++;
-            outputs[i].pwm_duty_cnt++;
-            
-            if (outputs[i].pwm_period_cnt == PWM_PERIOD_TEST) 
-            {
+            if (outputs[i].pwm_period_cnt == 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);
             }
-            else if (outputs[i].pwm_duty_cnt == PWM_DUTY_TEST) 
-            {
+            if (outputs[i].pwm_duty_cnt == PWM_DUTY_TEST) {
                 outputs[i].pwm_duty_cnt = 0;
                 gpio_bits_reset(GPIOB, GPIO_PINS_15);
+                outputs[i].pwm_flag = true;
+            }
+            outputs[i].pwm_period_cnt++;
+            if (outputs[i].pwm_flag == false) {
+                outputs[i].pwm_duty_cnt++;
             }
         }
     }
-  
-  
 }
 
 //

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

@@ -6,7 +6,7 @@
 
 
 #define PWM_PERIOD_TEST     20
-#define PWM_DUTY_TEST       10
+#define PWM_DUTY_TEST       18
 
 
 extern out_t outputs[];

+ 70 - 0
fw/modules/modbus/modbus_params.c

@@ -101,6 +101,76 @@ void mb_init_params(void)
     mb_param[index].check_handler = mb_check_dummy;
     
     index++;
+    
+    // Состояние выходов в безопасном режиме
+    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].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Заполнение PWM. Регистры 0x0210 - 0x0217
+    addr = 0x0210;
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        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].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr++;
+        index++;
+    }
+    
+    // Заполнение PWM в безопасном режиме. Регистры 0x0220 - 0x0227
+    addr = 0x0220;
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        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].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr++;
+        index++;
+    }
+    
+    // Период PWM. Регистры 0x0220 - 0x0227
+    addr = 0x0230;
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        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].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr++;
+        index++;
+    }
+    
+    // Период PWM. Регистры 0x0220 - 0x0227
+    addr = 0x0240;
+    for (int i = 0; i < DO_NUMBER; i++)
+    {
+        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].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr++;
+        index++;
+    }
 }
 
 

+ 1 - 1
fw/modules/modbus/modbus_params.h

@@ -9,7 +9,7 @@
 #include <stdbool.h>
 
 
-#define MB_PARAM_MAX			21
+#define MB_PARAM_MAX			54
 
 
 //

+ 2 - 0
fw/modules/settings/settings_api.c

@@ -243,6 +243,8 @@ void settings_do_def(settings_t *settings)
     {
         settings->do_pwm[i] = 50;
         settings->do_pwm_save[i] = 50; // значение на выходах в бесопасном режиме работы
+        settings->do_pwm_per[i] = 10;
+        settings->do_pwm_per_save[i] = 10;
     }
 }
 

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

@@ -81,8 +81,10 @@ typedef struct
     uint16_t    do_mode_bits;       // режим работы выхода 0 - выход, 1 - ШИМ
     uint16_t    do_bits;            // последнее сохраненное значение на выходах
     uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
-    uint16_t    do_pwm[DO_NUMBER];  // значение выходов в режиме ШИМ
-    uint16_t    do_pwm_save[DO_NUMBER]; // значение выходов в режиме ШИМ в безопасном режиме
+    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)]
     
     bool        save_mode;          // безопасный режим, 0 - выкл, 1 - вкл
     

BIN
output/fw.bin


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 366 - 366
project/ewarm/iap/iap.dep


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 502 - 511
project/ewarm/module_universal_io.dep


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov